sql - PL/SQL 批量插入到具有未知结构的表中
问题描述
您可以向具有未知结构的表发出 FORALL 批量 INSERT 吗?这意味着,您可以在 FORALL 构造中动态构建 INSERT 命令而不知道编译时的字段数吗?
字段的数量和名称在运行时检索并存储在集合中:
TYPE RowType is TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(50);
TYPE TableType is TABLE OF RowType;
my_table TableType;
所以在运行时 my_table 可以这样填充,例如:
my_table(1)('FIELD1') = 'VALUE1A';
my_table(1)('FIELD2') = 'VALUE2A';
my_table(1)('FIELD3') = 'VALUE3A';
my_table(2)('FIELD1') = 'VALUE1B';
my_table(2)('FIELD2') = 'VALUE2B';
my_table(2)('FIELD3') = 'VALUE3B';
my_table(3)('FIELD1') = 'VALUE1C';
my_table(3)('FIELD2') = 'VALUE2C';
my_table(3)('FIELD3') = 'VALUE3C';
因此,应该批量执行的插入语句是:
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C);
编辑:您甚至阅读问题还是仅阅读标题中的几个单词?链接的问题询问如何绑定变量,此问题询问如何批量发布动态语句。是的,两个问题中都有“插入”和“表格”这两个词。
解决方案
不,您不能动态构建和动态执行FORALL...INSERT...
语句。但是,您可以动态构建以下形式的 INSERT 语句:
INSERT ALL
INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A)
INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B)
INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C)
或者,如果您要插入表中的数据位于另一个表中,您可能会发现如下INSERT...(subquery)
语句
INSERT INTO TABLENAME
SELECT FIELD1, FIELD2, FIELD3
FROM OTHER_TABLE
WHERE something <> something_else
或者您可以使用类似于的 MERGE 语句
MERGE INTO TABLENAME t
USING (SELECT FIELD1, FIELD2, FIELD3 FROM OTHER_TABLE) o
ON (t.FIELD1 = o.FIELD1)
WHEN NOT FOUND THEN
INSERT (FIELD1, FIELD2, FIELD3) VALUES (o.FIELD1, o.FIELD2, o.FIELD3)
它将根据子句中指定的数据和谓词USING
中的匹配条件进行批量插入。ON
因此,可能有一些方法可以做你想做的事情,但在不知道数据源的细节以及在将数据插入数据库之前如何操作数据的情况下,很难说它们中的任何一个是否适用。
祝你好运。
推荐阅读
- java - 在 Eclipse 上使用 Jsoup 库
- django - 如果定义了函数但没有定义类,如何使用 pytest django 测试单元测试?
- django - Django模板中的文件下载
- java - 通过 Spring BeanFactory::getBean() 传递 A.class
- arrays - 为什么这个 kotlin 代码不会抛出越界错误?
- azure - 使用 PowerShell 对 Azure 存储 Blob 和表的托管标识读取访问权限
- riscv - RISC V 汇编程序:无法使用浮点指令加载浮点寄存器 f0、f1。为什么没有加载值?
- azure - Azure 流分析 - 如何在 Azure SQL db 中保存多个 IoT 设备的数据
- excel - excel vba:如果该列不为空,则用颜色填充另一列
- google-cloud-platform - Airflow PostgresToGoogleCloudStorageOperator 身份验证错误