我可以在PL / SQL中动态设置变量吗?

时间:2018-11-28 21:23:01

标签: oracle plsql oracle12c

在Oracle 12c R2中,我有一个函数,该函数接收行类型作为变量。在该函数中,我想读取一个包含列名和值的表,然后我想填充使用列名和读取的表中数据传递的行类型变量。

这里是我想做的简单的事情;

CREATE TABLE table_to_be_updated
(
  key_value number,
  cola varchar2(2),
  colb varchar2(2),
  colc varchar2(2),
  cold varchar2(2),
  cole varchar2(2),
  colf varchar2(2)
);

CREATE TABLE table_default_value
(
  default_stuff number,
  column_name varchar(30),
  column_default_value varchar2(2)
);

function do_defaults(in_table table_to_be_updated%rowtype, in_value number) return table_to_be_updated%rowtype
is
  out_table table_to_be_updated%rowtype := in_table;
  cursor my_curs
  is
    select * from table_default_value where default_stuff = in_value;
begin
  for default_rec in my_curs
  loop
    out_table.[default_rec.column_name] := default_rec.column_default_value
  end loop;
  return out_table;
end;
insert into table_default_value (default_stuff,column_name,column_default_value) values (1,'cola','xx'));
insert into table_default_value (default_stuff,column_name,column_default_value) values (1,'colc','aa'));
insert into table_default_value (default_stuff,column_name,column_default_value) values (1,'cole','bb'));

在线;

out_table.[default_rec.column_name] := [default_rec.column_default_value]

[default_rec.column_name]是我想要将数据移至的out_table名称中的游标中的列名称。

[default_rec.column_default_value]是我要移至该列的游标中的值。

我怀疑我想做的事在PL / SQL中是不可能的,但我想我会问。

还有其他直接完成表更新的方法,特别是使用具有立即执行功能的动态SQL,但是我有许多相似的表都需要对它们执行相同的操作,因此我希望使用单个函数来完成处理记录,然后将其传递回去,以使调用例程更新正确的表。

1 个答案:

答案 0 :(得分:0)

这是我能想到的最好的方法

function do_defaults(in_table table_to_be_updated%rowtype, in_value number) return table_to_be_updated%rowtype
is
  TYPE DEFAULT_TYPE IS TABLE OF VARCHAR2(2)
       INDEX BY VARCHAR2(30);
  DEFAULT_ARRAY DEFAULT_TYPE;

  out_table table_to_be_updated%rowtype := in_table;
  cursor my_curs
  is
    select * from table_default_value where default_stuff = in_value;
begin
  DEFAULT_ARRAY('cola') := null;
  DEFAULT_ARRAY('colb') := null;
  DEFAULT_ARRAY('colc') := null;
  DEFAULT_ARRAY('cold') := null;
  DEFAULT_ARRAY('cole') := null;
  DEFAULT_ARRAY('colf') := null;
  for default_rec in my_curs
  loop
    DEFAULT_ARRAY(default_rec.column_name) := default_rec.column_default_value
  end loop;
  out_table.cola := DEFAULT_ARRAY('cola');
  out_table.colb := DEFAULT_ARRAY('colb');
  out_table.colc := DEFAULT_ARRAY('colc');
  out_table.cold := DEFAULT_ARRAY('cold');
  out_table.cole := DEFAULT_ARRAY('cole');
  out_table.colf := DEFAULT_ARRAY('colf');
  return out_table;
end;