PLSQL类型变量

时间:2016-08-17 17:04:01

标签: plsql

我有一个场景,我必须对PLSQL类型变量执行动态分配。

例如,下面是对my_tab_type类型的简单赋值。 fn_get_value(varchar2)函数根据传递的字符串返回值。

my_tab_type.table_name.LEAD   := fn_get_value('LEAD_ID');

像这些将有数百个作业。我想将映射(LEAD,LEAD_ID)存储在表中,在游标中获取这些映射值并动态创建赋值语句。

我希望避免execute immediatedbms_sql.execute因为性能受到影响而创建的每个动态作业。请帮我提出一个可行有效的方法。

1 个答案:

答案 0 :(得分:0)

(您可能有XY-problem。)

您没有告诉我们您问题中的类型,因此我假设nested tablerecords

您无法动态分配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>