Как динамически создать запись в PL / Sql на основе имени таблицы в качестве входного - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу понять, как динамически создавать тип записи на основе имени таблицы, полученной в качестве входных данных для процедуры.

Пример:

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 голосов
/ 27 ноября 2018

Если бы я был у вас, я бы попытался сделать что-то подобное.

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;

Но на самом деле это заняло у меня почти час, и это очень плохой вопрос для интервью ...
Может бытьони не хотят с тобой работать?:)

...