Kos*_*801 11 oracle plsql dynamic-sql
我需要在Oracle上使用动态SQL执行,我不知道在运行时之前SQL中使用的绑定变量的确切数量.
有没有办法在调用中以EXECUTE IMMEDIATE
某种方式使用可变数量的绑定变量?
更具体地说,我需要将一个参数传递给未知的SQL,但我不知道它将在那里使用的频率.
我试过类似的东西
EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;
Run Code Online (Sandbox Code Playgroud)
但它退缩了 ORA-01008: not all variables bound.
Ste*_*erg 10
你不能这样做EXECUTE IMMEDIATE
.但是,您可以使用Oracle的DBMS_SQL
包来完成此操作.该数据库应用开发者指南之间有着比较EXECUTE IMMEDIATE
你熟悉和dbms_sql
方法. 这个页面文档DBMS_SQL
,但有一些例子(上面链接)应该让你开始(例1是一个简单的例子,运行一个可能有任意数量的绑定变量的语句). DBMS_SQL
从编码的角度来看,它会更麻烦,但它可以让你做任何你能想到的事情.
允许在SQL中出现多个绑定变量实例.但是,您必须知道用作绑定变量的名称(例如:在您的情况下为var)才能将其传递给DBMS_SQL.BIND_VARIABLE
.
您还可以使用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;
Run Code Online (Sandbox Code Playgroud)