使用变量定义集合

时间:2009-04-16 08:31:50

标签: oracle plsql

如何使用变量定义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 个答案:

答案 0 :(得分:2)

你需要使用像这样的动态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.

答案 1 :(得分:0)

非常感谢您的回复。

我不得不对整个事情进行一些修改,但这确实有效:

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;
/
相关问题