В PL / SQL я могу установить переменную динамически? - PullRequest
0 голосов
/ 29 ноября 2018

В 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 nameЯ хочу переместить данные в.

и

[default_rec.column_default_value] - значение из курсора, который я хочу переместить в этот столбец.

Я подозреваю, что то, что ясделать это невозможно в PL / SQL, но я подумал:

Существуют и другие способы непосредственного обновления таблицы, в частности использование динамического SQL с непосредственным выполнением, но у меня есть ряд подобныхтаблиц, для которых все должны выполнять одни и те же действия, и я бы предпочел, чтобы одна запись работала с записью, а затем передавала ее обратно, чтобы вызывающая подпрограмма обновляла соответствующую таблицу.

1 Ответ

0 голосов
/ 04 декабря 2018

Вот лучшее, что я могу придумать;

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;
...