甲骨文EXECUTE立即与结合可能的变量是多少?(Oracle EXECUTE IMMEDIATE

2019-07-28 21:03发布

我需要使用在Oracle动态SQL执行,我不知道在运行之前,SQL中使用绑定变量的确切数目。

有没有办法使用可变数量的绑定变量在调用的方式EXECUTE IMMEDIATE不知何故?

更具体地讲,我需要一个参数传递到未知的SQL,但我不知道多久它会在那里使用。

我想是这样

EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;

但它扔回来ORA-01008: not all variables bound.

Answer 1:

你不能做到这一点与EXECUTE IMMEDIATE 。 但是,您可以通过使用Oracle的做到这一点DBMS_SQL包。 该数据库应用开发者指南之间有着比较EXECUTE IMMEDIATE你熟悉和dbms_sql方法。 本页面的文件DBMS_SQL ,但有一些例子(上面链接)应该让你开始说(例如1是运行可能有绑定变量任意数量的陈述一个简单的例子)。 DBMS_SQL是很多从编码的角度看比较繁琐,但它可以让你做任何事情,你可以受孕。

在SQL中发生的绑定变量的多个实例是允许的。 但是,你必须知道所使用的绑定变量的名称(例如:你的情况VAR),以便将其传递到DBMS_SQL.BIND_VARIABLE



Answer 2:

您也可以通过使用变通解决此问题WITH声明。 一般使用DBMS_SQL较好,但有时这是一个简单的方法:

BEGIN
    EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;


Answer 3:

这对AskTom主题涵盖了详细的主题。

在你的情况,如果你想传递一个参数或没有,你可以建立一个只有一个参数,并在这些查询不使用它的一个(即谓词始终是真实的)两个查询是这样的:

-- query1
SELECT * FROM DUAL WHERE dummy = :x;

-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;

你也许可以细化断言以便优化程序会明白,它始终是真实的。



Answer 4:

更具体地讲,我需要一个参数传递到未知的SQL,但我不知道多久它会在那里使用。

我居然遇到了这个完全相同的一个问题前几天,和一个朋友跟我分享的方式来完成这一功能与EXECUTE IMMEDIATE

它涉及生成PLSQL块而不是在SQL块本身。 当使用EXECUTE IMMEDIATE用PLSQL代码块,你可以仅仅通过位置而不是由名称绑定变量。

看看我的例子/代码和我自己的类似问题/答案线程:

  • 分配一个绑定变量动态生成不同数量的次SQL


Answer 5:

人们可以使用dbms_sql像史蒂夫布罗贝里解释,但所产生的游标不能在很多客户的消耗(读)。 甲骨文11增加了一个转换函数( dbms_sql.to_refcursor ,使得它可以将转换) dbms_sql光标到一个引用游标但由于某种原因一个不能消耗这个转换引用游标在.NET应用程序。 之一可以消耗在.NET正常引用游标但不是引用游标曾经是dbms_sql光标。

那么会是什么类型的客户消耗该游标?



文章来源: Oracle EXECUTE IMMEDIATE with variable number of binds possible?