2009-04-16 5 views
0

Comment définir des collections en PL/SQL avec des variables?Définition de collections avec variables

Par exemple.

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; 

Ce que je veux est d'utiliser les variables au lieu des noms du propriétaire/table. Quelque chose comme ça:

TYPE t_tab IS TABLE OF v_owner.v_tablename%ROWTYPE; 

Mais cela ne fonctionne pas bien sûr.

Une idée?

Répondre

2

Vous devez utiliser quelque chose PL/SQL dynamique comme ceci:

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

Merci beaucoup pour la réponse.

je dû modifier le tout un peu, mais cela a fonctionné:

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