Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 用变量定义集合_Oracle_Plsql - Fatal编程技术网

Oracle 用变量定义集合

Oracle 用变量定义集合,oracle,plsql,Oracle,Plsql,如何使用变量在PL/SQL中定义集合 例如 我想要的是使用变量,而不是所有者/表的名称。 诸如此类: TYPE t_tab IS TABLE OF v_owner.v_tablename%ROWTYPE; 但这当然行不通 有什么想法吗?您需要使用动态PL/SQL,如下所示: SQL> DECLARE 2 v_owner varchar(128) := 'MYSCHEMA'; 3 v_tablename varchar(128) := 'EMP'; 4

如何使用变量在PL/SQL中定义集合

例如

我想要的是使用变量,而不是所有者/表的名称。 诸如此类:

TYPE t_tab IS TABLE OF v_owner.v_tablename%ROWTYPE;
但这当然行不通


有什么想法吗?

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

非常感谢您的回复

我不得不对整件事稍加修改,但效果不错:

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