инструкция SQL select в качестве переменной привязки для динамического блока plsql

Я пытаюсь запустить анонимный блок plsql с помощью execute immediate, и блок plsql содержит переменную bind, для которой значение является инструкцией sql select. Но, похоже, это не работает. Есть ли какое-либо решение для решения этой проблемы.
Например.

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;

3 ответа

  1. Plz попробуйте это.Надеюсь, это поможет.

        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;
    
  2. Сначала необходимо объявить переменные, которые вы хотите использовать в блоке выполнения.

    Попробовать это:

    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;
    /
    
  3. Если я хорошо понимаю, вам нужно запустить весь динамический блок PLSQL, используя в качестве SQL-запроса в качестве переменной привязки; если это так, вы можете попробовать этот способ:

    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>