如何根据表名作为输入在 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 中动态创建记录的主要内容,如果未能解决你的问题,请参考以下文章