如何根据表名作为输入在 PL/Sql 中动态创建记录

Posted

技术标签:

【中文标题】如何根据表名作为输入在 PL/Sql 中动态创建记录【英文标题】:How to dynamically create record in PL/Sql based on Table name as Input 【发布时间】:2018-11-26 10:44:31 【问题描述】:

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

例如:

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;

【问题讨论】:

无法完成。记录类型具有固定的投影。您要解决的实际问题是什么?也就是说,为什么需求导致你认为你需要动态创建记录类型变量? 这是在面试时问我的,但无法得到解决方案。所以很想知道这是如何实现的。 人们在面试中确实会问一些奇怪的问题。 也许这是那些“陷阱”问题之一......正确的答案是“您要解决的问题是什么?” (即,也许他们的人为问题可以使用 SQL 来解决,而不需要 PL/SQL 类型) 【参考方案1】:

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

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;

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

【讨论】:

以上是关于如何根据表名作为输入在 PL/Sql 中动态创建记录的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl/sql 循环中以表名作为参数的 UPDATE 语句

将表名作为参数传递时 PL/SQL 函数不起作用

如何使用动态用户输入在 plsql 中使用函数/过程创建表

将表名作为输入参数动态传递并使用它[重复]

pl/sql 过程不允许将表名/视图名作为参数传递

如何创建一个以表名作为输入的简单存储过程