代码之家  ›  专栏  ›  技术社区  ›  Kosi2801

Oracle是否可以使用可变数量的绑定立即执行?

  •  10
  • Kosi2801  · 技术社区  · 15 年前

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

    有没有一种方法可以在调用中使用数量可变的绑定变量 EXECUTE IMMEDIATE

    更具体地说,我需要通过考试

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

    但它用一种新的方式回击了我 ORA-01008: not all variables bound.

    5 回复  |  直到 9 年前
        1
  •  10
  •   sampathsris Rihards Fridrihsons    9 年前

    你不能和我一起做这件事 EXECUTE IMMEDIATE . 但是,您可以使用Oracle的 DBMS_SQL 包裹这个 Database Application Developer's Guide 比较了 立即执行 dbms_sql 方法。 This page 文件 数据库管理系统 ,但有一些示例(链接在上面)应该可以让您开始(示例1是一个简单的示例,它运行的语句可能包含任意数量的绑定变量)。 从编码的角度来看,它要麻烦得多,但它将允许你做任何你能想到的事情。

    DBMS_SQL.BIND_VARIABLE .

        2
  •  7
  •   sampathsris Rihards Fridrihsons    9 年前

    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;
    
        3
  •  2
  •   Vincent Malgrat    15 年前

    Thread on AskTom

    在您的情况下,如果希望传递一个参数或不传递任何参数,可以构建两个具有单个参数的查询,并且在其中一个查询中不使用该参数(即谓词始终为true),如下所示:

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

    您可能可以细化谓词,以便优化器理解它总是正确的。

        4
  •  1
  •   Community dbr    7 年前

    事实上,我在几天前遇到了完全相同的问题,一位朋友与我分享了一种方法,让我能够做到这一点 EXECUTE IMMEDIATE

    它涉及生成一个PLSQL块,而不是SQL块本身。使用时 立即执行

    请查看我的示例/代码,并查看我自己的类似问题/答案线程:

        5
  •  1
  •   sampathsris Rihards Fridrihsons    9 年前

    可以使用 dbms_sql 正如SteveBroberg所解释的,但是结果游标不能在很多客户端中使用(读取)。Oracle 11添加了一个转换函数( dbms_sql.to_refcursor )这样就可以将 游标指向引用游标,但由于某些原因,无法在.Net应用程序中使用此转换后的引用游标。可以使用.net中的普通引用游标,但不能使用以前使用的引用游标 光标。

    那么什么样的客户端将使用这个游标呢?