如何使用变量定义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;
但这当然不起作用。
有什么想法吗?
答案 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;
/