2009-04-16 47 views
0

如何在包含变量的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

您需要使用动态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

非常感谢您的答复。

我不得不修改整个事情一点,但工作:

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; 
/