在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE

Posted

技术标签:

【中文标题】在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE【英文标题】:use of using EXECUTE IMMEDIATE for an DML Statement in Stored Procedure 【发布时间】:2011-07-24 05:53:15 【问题描述】:

我是 PL SQL 过程的新手,我们在存储过程的执行部分中有这行代码。

我在这里有一个查询,请告诉我在这里使用EXECUTE IMMEDIATE 的 DML 语句有什么用?在什么情况下我们应该使用EXECUTE IMMEDIATE

v_update_query2 := 'INSERT INTO '||p_country||'.DETAILS ( ID, STATUS, DEST_SYSTEM, OUT_TIME ) VALUES ('''
    ||v_txn_id ||''','||'''T081'''||','||'''CLEARING'''||', SYSDATE)';



EXECUTE IMMEDIATE v_update_query1 ;

【问题讨论】:

【参考方案1】:

EXECUTE IMMEDIATE 是对模式对象进行变量引用的唯一方法 - 例如表名、列名等。

它允许您构建任何字符串,然后将该字符串作为 SQL 语句执行。 没有它,过程变量只能用于sql中的值,例如select * from table where column = my_variable

在您的示例中,表名p_country 变量提供 - 这是一个架构元素,因此您需要 EXECUTE IMMEDIATE

【讨论】:

Bohemian 是完全正确的,但是,您还应该研究文档中的动态 SQL,并用绑定变量替换您的文字,以实现 SQL 注入的性能和安全性。 你不能用绑定变量替换对动态sql中模式对象的引用,所以p_country仍然是个问题。在 SQL Server 中,我会在 p_country 上使用 quotename 以使其安全。我不知道甲骨文领域的等价物。

以上是关于在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE的主要内容,如果未能解决你的问题,请参考以下文章

关于msyql5.6创建存储过程的一些记录

使用 .NET SqlCommand 运行带有 EXECUTE AS 语句的 t-sql 存储过程

linux运维

SQL语句(二十一)—— 触发器(DML触发器)

Java Review(三十JDBC)

Java Review(三十JDBC)