我有一个场景,我必须对PLSQL类型变量执行动态分配。
例如,下面是对my_tab_type
类型的简单赋值。 fn_get_value(varchar2)
函数根据传递的字符串返回值。
my_tab_type.table_name.LEAD := fn_get_value('LEAD_ID');
像这些将有数百个作业。我想将映射(LEAD,LEAD_ID)存储在表中,在游标中获取这些映射值并动态创建赋值语句。
我希望避免execute immediate
或dbms_sql.execute
因为性能受到影响而创建的每个动态作业。请帮我提出一个可行有效的方法。
答案 0 :(得分:0)
(您可能有XY-problem。)
您没有告诉我们您问题中的类型,因此我假设nested table为records。
您无法动态分配PL / SQL记录"不使用动态PL / SQL(即使用execute immediate
运行PL / SQL)。这也意味着所有使用这种"动态"创建的记录必须动态发生。这不是应该使用PL / SQL的方式。
但是,如果您可以将数据类型更改为associative array,则可以使用简单无聊的静态良好的PL / SQL来归档您的目标!
在您的下方,我们将找到一个可以帮助您入门的示例。
示例强>
create table so60 (
from_ varchar2(20)
,to_ varchar2(20)
);
insert into so60 values('A_FROM', 'A_TO');
insert into so60 values('B_FROM', 'B_TO');
insert into so60 values('C_FROM', 'C_TO');
declare
-- foo_t is an associative array
type foo_t is table of varchar2(32767) index by varchar2(32767);
v_foo foo_t;
function f(p_x in varchar2) return varchar2 is
begin
return lower(p_x);
end;
begin
-- initialize from table
for i in (select * from so60)
loop
v_foo(i.to_) := f(i.from_);
end loop;
dbms_output.put_line(v_foo('B_TO'));
end;
/
运行示例
SQL> @so60
b_from
PL/SQL procedure successfully completed.
SQL>