【问题标题】:sql select statement as bind variable for dynamic plsql blocksql select语句作为动态plsql块的绑定变量
【发布时间】:2016-12-28 11:50:57
【问题描述】:

我正在尝试使用立即执行来运行 plsql 匿名块,并且 plsql 块包含一个绑定变量,其值为 sql 选择语句。但这似乎行不通。有没有办法解决这个问题。 例如

BEGIN
  V_SQL:='SELECT emp_id FROM  emp  WHERE  dept_id=10;
  PLSQL_BLOCK:='DECLARE
    type emp_type
    IS
    TABLE OF NUMBER;
    emp_id emp_type;
    BEGIN
        EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id;  
    END';
EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;

【问题讨论】:

    标签: variables plsql bind execute-immediate


    【解决方案1】:

    如果我理解得很好,您需要使用 as SQL 查询作为绑定变量来运行整个动态 PLSQL 块;如果是这样,您可以尝试这种方式:

    SQL> declare
      2      vPlSqlBlock varchar2(10000);
      3      vSQL        varchar2(1000);
      4  BEGIN
      5    vSQL:='SELECT 1 from dual';
      6    --
      7    vPlSqlBlock:='DECLARE
      8      type emp_type IS TABLE OF NUMBER;
      9      emp_id   emp_type;
     10      vSQLDyn  varchar2(1000) := :1;
     11      BEGIN
     12          EXECUTE IMMEDIATE vSQLDyn BULK COLLECT INTO emp_id;
     13          --
     14          /* whatever you need to do in your block */
     15          for i in emp_id.first .. emp_id.last loop
     16              dbms_output.put_line(emp_id(i));
     17          end loop;
     18      END;';
     19
     20      EXECUTE IMMEDIATE vPlSqlBlock USING vSQL;
     21  end;
     22  /
    1
    
    PL/SQL procedure successfully completed.
    
    SQL> declare
      2      vPlSqlBlock varchar2(10000);
      3      vSQL        varchar2(1000);
      4  BEGIN
      5    vSQL:='SELECT 1 from dual';
      6    --
      7    vPlSqlBlock:='DECLARE
      8      type emp_type IS TABLE OF NUMBER;
      9      emp_id   emp_type;
     10      vSQLDyn  varchar2(1000) := :1;
     11      BEGIN
     12          EXECUTE IMMEDIATE vSQLDyn BULK COLLECT INTO emp_id;
     13          /* this does nothing */
     14      END;';
     15
     16      EXECUTE IMMEDIATE vPlSqlBlock USING vSQL;
     17  end;
     18  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 我尝试在没有循环的情况下运行,但它会抛出此错误:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:
    • 没有循环是什么意思?也许你删除了太多?刚刚编辑以显示在有或没有循环的情况下如何工作;当然没有循环的版本什么都不做......
    【解决方案2】:

    请试试这个。希望这会有所帮助。

        set serveroutput on;
        set define on;
        DECLARE
      V_SQL varchar2(1000):='SELECT emp_id from emp where deptno = 10';
      PLSQL_BLOCK varchar2(1000):='DECLARE    
                                    type emp_type    
                                    IS    
                                    TABLE OF NUMBER;    
                                    emp_id emp_type;   
                                    BEGIN        
                                    EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id;      
                                    END;';
    BEGIN
      EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;
    END;
    

    【讨论】:

    • 我的绑定变量是一个选择查询
    • 修改了答案。希望这会有所帮助。
    • 此代码已成功编译,但在运行时会出现错误 PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:
    • 我也在尝试使用立即执行来运行整个块
    【解决方案3】:

    您必须首先声明要在执行块中使用的变量。

    试试这个:

    DECLARE
        V_SQL VARCHAR2(1000) := 'SELECT emp_id FROM  emp  WHERE  dept_id=10';
        PLSQL_BLOCK varchar2(1000) :='DECLARE type emp_type IS TABLE OF integer; emp_id emp_type;'
            || ' BEGIN EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id; END;';
    BEGIN
        EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;
    END;
    /
    

    【讨论】:

    • 将 sql 查询连接到 plsql 块也会产生错误。我试过这种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2011-12-10
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多