oracle中EXECUTE IMMEDIATE是啥意思?如何使用,请用自己理解的语言,通俗的解释出来,谢谢了各位!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中EXECUTE IMMEDIATE是啥意思?如何使用,请用自己理解的语言,通俗的解释出来,谢谢了各位!相关的知识,希望对你有一定的参考价值。

EXECUTE IMMEDIATE 一般用于 执行动态 SQL

例如:
SQL> BEGIN
2 EXECUTE IMMEDIATE ( 'SELECT * FROM test_dysql WHERE id=1' );
3 END;
4 /
PL/SQL procedure successfully completed.追问

请问一下什么是动态SQL?
用EXECUTE IMMEDIATE 有什么好处?
要执行SQL语句的话,我不用EXECUTE IMMEDIATE 也可以执行的啊?
实在是很模糊。。

追答

这个是用于在 存储过程里面. 动态的执行 SQL 语句。

例如:
有个存储过程, 用于检索表的行数。 传入的参数是 表的名称。
这种情况下,你
SELECT count(*) FROM v_变量
是无法执行的。

你只能定义一个变量 vsql varchar2(100);
然后
vsql = 'SELECT count(*) FROM ' || 'v_变量'
然后调用 EXECUTE IMMEDIATE 来执行。

动态SQL,意思就是你需要执行的 SQL 语句, 不是固定的。要等运行的时候, 才能确定下来。
也就像上面那个例子,表名是 外部传入的。

不过 动态SQL 与 EXECUTE IMMEDIATE 主要用在 存储过程里面。

假如你是用 C# 或者 Java 之类的开发语言。 访问数据库的话。
是用不到 EXECUTE IMMEDIATE 的。

参考资料:http://hi.baidu.com/wangzhiqing999/blog/item/49752e0d0ed5562b6a60fb51.html

参考技术A 是执行字符串中的SQL语句,如:execute immediate 'select * dual';

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

【中文标题】在 Oracle 中使用 Execute Immediate 将数据插入表中【英文标题】:Inserting Data Into Table Using Execute Immediate in Oracle 【发布时间】:2016-08-22 08:12:57 【问题描述】:

例如,我有一些表 "Test" ,其中有一列 "my_date" 。我想要做的是使用一些变量将记录添加到表中:

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

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

【问题讨论】:

您的 query_date 变量应该保存第一个查询的日期还是查询本身?不管怎样,为什么要使用动态 SQL? 【参考方案1】:

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

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_string 更复杂或本身是动态构造的,这将起作用。但如果query_string 选择列表中的列表达式数量也不同,您也必须动态构建列列表,否则插入的列太多或太少。

具体操作方式取决于您构建查询字符串的方式 - 本质上,当您将表达式添加到查询字符串时,您还会将列名添加到单独的列表中,并最终得到:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

其中column_list 被构建为col1, col2query_stringselect x.col1, y.col2 from ...


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

insert into test (my_date) values (sysdate)

...所以我假设您的真实情况确实更复杂。但请注意,您不要将 values 关键字与 insert ... select ... 模式一起使用。您可以使用单个列和一个子查询,但即使这样也不是一个好主意,并且如果您在子查询中有多个列,则不起作用。

【讨论】:

如果您有多个列并且真的想动态地执行它,那么上面的第二个代码块将起作用。但是,如果列数不同,而不仅仅是值的来源,您也需要构建列列表。【参考方案2】:

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

【讨论】:

以上是关于oracle中EXECUTE IMMEDIATE是啥意思?如何使用,请用自己理解的语言,通俗的解释出来,谢谢了各位!的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在此代码中正确使用 oracle EXECUTE IMMEDIATE

ORACLE中EXECUTE IMMEDIATE语句中使用的where子句中需要使用动态变量

oracle 中execute immediate作用

ORACLE EXECUTE IMMEDIATE 小结

mariadb 10.2.3支持oracle execute immediate语法