Определение коллекций с переменными - PullRequest
0 голосов
/ 16 апреля 2009

Как определить коллекции в PL / SQL с помощью переменных?

Например.

v_owner varchar(128) := 'SCHEMA_USER';
v_tablename varchar(128) := 'TABLENAME';

TYPE t_tab IS TABLE OF SCHEMA_USER.TABLENAME%ROWTYPE;
v_tab t_tab;

Я хочу использовать переменные вместо имен владельца / таблицы. Примерно так:

TYPE t_tab IS TABLE OF v_owner.v_tablename%ROWTYPE;

Но это, конечно, не работает.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2009

Вам нужно использовать динамический PL / SQL примерно так:

SQL> DECLARE
  2     v_owner varchar(128) := 'MYSCHEMA';
  3     v_tablename varchar(128) := 'EMP';
  4     v_str LONG;
  5  BEGIN
  6     v_str := 'DECLARE TYPE t_tab IS TABLE OF ' || v_owner || '.' || v_tablename || '%ROWTYPE;'
  7               || ' v_tab t_tab;'
  8               || ' BEGIN'
  9               || '   SELECT * BULK COLLECT INTO v_tab'
 10               || '     FROM emp WHERE empno = :input1;'
 11               || '   dbms_output.put_line(v_tab(1).ename);'
 12               || 'END;';
 13     EXECUTE IMMEDIATE v_str USING 7839;
 14  END;
 15  /
KING

PL/SQL procedure successfully completed.
0 голосов
/ 16 апреля 2009

Большое спасибо за ответ.

Мне пришлось немного изменить все это, но это сработало:

DECLARE
v_owner varchar(128) := 'SCHEMA';
     v_tablename varchar(128) := 'TABLE';
     v_str LONG;
  BEGIN
v_str := 'DECLARE TYPE t_tab IS TABLE OF ' || v_owner || '.' || v_tablename || '%ROWTYPE;'
               || ' v_tab t_tab;'
               || ' BEGIN'
               || '   SELECT * BULK COLLECT INTO v_tab'
               || '     FROM ' || v_owner || '.' || v_tablename ||';'
               || 'END;';
     EXECUTE IMMEDIATE v_str;
  END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...