Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中使用Execute Immediate将数据插入表_Sql_Oracle_Plsql_Dynamic Sql - Fatal编程技术网

Sql 在Oracle中使用Execute Immediate将数据插入表

Sql 在Oracle中使用Execute Immediate将数据插入表,sql,oracle,plsql,dynamic-sql,Sql,Oracle,Plsql,Dynamic Sql,例如,我有一些表“Test”,其中有一列“my_date”。我尝试使用一些变量将记录添加到表中: query_date := "SELECT sysdate FROM dual"; EXECUTE IMMEDIATE ('insert into test values query_date'); 我需要通过构造字符串并执行查询,以这种精确的方式将记录插入到表中,但是我得到了错误。有可能吗 您可以将第一次查询的结果放入(日期)变量中,然后使用该变量: SELECT sysdate into qu

例如,我有一些表“Test”,其中有一列“my_date”。我尝试使用一些变量将记录添加到表中:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE ('insert into test values query_date');

我需要通过构造字符串并执行查询,以这种精确的方式将记录插入到表中,但是我得到了错误。有可能吗

您可以将第一次查询的结果放入(日期)变量中,然后使用该变量:

SELECT sysdate into query_date FROM dual;
insert into test (my_date) values (query_date)
-- or if you really want dynamic SQL, with a bind variable
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date;
或者逐字阅读您的问题,将第一个字符串连接起来,作为第二个字符串的一部分:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
如果打印第二条语句而不是执行它,您将看到:

insert into test (my_date) SELECT sysdate FROM dual
。。。这是有效的SQL。如果
query\u字符串
更复杂或其本身是动态构造的,这将起作用。但是,如果
query\u string
select列表中的列表达式数量也不同,则您也必须动态构造列列表,否则插入的列将过多或过少

具体操作方式取决于构造查询字符串的方式—本质上,当您向查询字符串添加表达式时,您还需要向单独的列表中添加列名,并以以下方式结束:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
其中,
column\u list
被构建为say
col1,col2
query\u string
从…中选择x.col1,y.col2


在您所展示的内容中,没有明显的理由使用动态SQL。或者,如果您确实在使用sysdate,则需要单独的查询来获取该数据,您可以这样做:

insert into test (my_date) values (sysdate)

。。。所以我认为你的真实情况更复杂。但是请注意,您没有将
关键字与
插入一起使用。。。选择…
pattern。您可以使用一个列和一个子查询,但即使这样也不是一个好主意,而且如果子查询中有多个列,也不起作用。

您可以将第一次查询的结果放入(日期)变量中,然后使用该变量:

SELECT sysdate into query_date FROM dual;
insert into test (my_date) values (query_date)
-- or if you really want dynamic SQL, with a bind variable
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date;
或者逐字阅读您的问题,将第一个字符串连接起来,作为第二个字符串的一部分:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
如果打印第二条语句而不是执行它,您将看到:

insert into test (my_date) SELECT sysdate FROM dual
。。。这是有效的SQL。如果
query\u字符串
更复杂或其本身是动态构造的,这将起作用。但是,如果
query\u string
select列表中的列表达式数量也不同,则您也必须动态构造列列表,否则插入的列将过多或过少

具体操作方式取决于构造查询字符串的方式—本质上,当您向查询字符串添加表达式时,您还需要向单独的列表中添加列名,并以以下方式结束:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
其中,
column\u list
被构建为say
col1,col2
query\u string
从…中选择x.col1,y.col2


在您所展示的内容中,没有明显的理由使用动态SQL。或者,如果您确实在使用sysdate,则需要单独的查询来获取该数据,您可以这样做:

insert into test (my_date) values (sysdate)

。。。所以我认为你的真实情况更复杂。但是请注意,您没有将
关键字与
插入一起使用。。。选择…
pattern。您可以使用一个列和一个子查询,但即使这样也不是一个好主意,而且如果子查询中有多个列,也不起作用。

为什么需要EXECUTE IMMEDIATE for Insert语句?
只要插入值的基表保持不变,我们就不需要执行EXIMM。现在查询日期?只需执行传统的循环或变量操作。

为什么需要EXECUTE IMMEDIATE for Insert语句?
只要插入值的基表保持不变,我们就不需要执行EXIMM。现在查询日期?只需执行传统的循环或变量操作。

您的
query\u date
变量应该保存第一次查询的日期还是查询本身?无论如何,为什么要使用动态SQL?您的
query\u date
变量应该保存第一次查询的日期,还是保存查询本身?无论哪种方式,为什么要使用动态SQL?如果您有多个列,并且确实希望动态执行,那么上面的第二个代码块将起作用。但是,如果列的数量不同,而不仅仅是值来自何处,那么您还需要构造列列表。如果您有多个列,并且确实希望动态地执行此操作,那么上面的第二个代码块将起作用。但是,如果列的数量不同,不仅仅是值来自哪里,还需要构造列列表。