如何基于表名称作为输入在PL / Sql中动态创建记录

时间:2018-11-26 10:44:32

标签: oracle plsql plsql-package

我想了解如何根据作为过程输入接收的表名动态创建记录类型。

例如:

PROCEDURE xxtest(p_table_name IN VARCHAR2)
IS

   TYPE t_test_type IS TABLE OF p_table_name%ROWTYPE;    
   v_test_type t_test_type;

BEGIN    
   NULL;    
END;

1 个答案:

答案 0 :(得分:0)

如果我在你家,我会尝试做类似的事情。

create table test_table (f1 number, f2 number);

insert into test_table (f1,f2) values (0,1);
insert into test_table (f1,f2) values (2,3);

select * from test_table

declare
    PROCEDURE xxtest(p_table_name IN VARCHAR2) IS
   vSql varchar2(4000);
   BEGIN    
        vSql := 'declare ';
      vSql := vSql || 'TYPE t_test_type IS TABLE OF '||p_table_name||'%ROWTYPE; ';
      vSql := vSql || 'v_test_type t_test_type; ';
      vSql := vSql || 'begin ';
      vSql := vSql || 'select  a1.f1, a1.f2 ';
      vSql := vSql || 'bulk collect into v_test_type ';            
      vSql := vSql || 'from '||p_table_name||' a1; ';            
      vSql := vSql || 'for i in v_test_type.first..v_test_type.last ';   
      vSql := vSql || 'loop ';   
      vSql := vSql || 'dbms_output.put_line(v_test_type(i).f1||'' ''||v_test_type(i).f1); ';   
      vSql := vSql || 'end loop; ';   
      vSql := vSql || 'end; ';   
      dbms_output.put_line(vSQL);
      execute immediate vSQL;
   END;
begin
    xxtest('test_table');
end;

但是实际上我花了将近一个小时,这对面试来说确实是一个糟糕的问题...
可能是他们不想与您合作吗?:)