0

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

前任:

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

1 回答 1

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;

但实际上我花了将近一个小时,这对面试来说真是个糟糕的问题......
也许他们不想和你一起工作?:)

于 2018-11-27T14:12:11.883 回答