Динамическое имя столбца для переменной типа записи - PullRequest
0 голосов
/ 01 марта 2012
 DECLARE
 TYPE t IS RECORD (
 col_name   VARCHAR2 (100)
 );

  t_row   t;
  cname   VARCHAR (100) := 'col_name';
BEGIN
  t_row.col_name             := 'col';
 DBMS_OUTPUT.put_line ('out');

  IF t_row.cname IS NULL THEN
    DBMS_OUTPUT.put_line ('in');
  END IF;
 END;

Ошибка в строке 1
ORA-06550: строка 12, столбец 12:
PLS-00302: должен быть объявлен компонент 'CNAME'
ORA-06550: строка 12,столбец 3:
PL / SQL: оператор игнорируется

Как назначить динамическое имя столбца для переменной типа записи?

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Вы можете сделать это с помощью динамического sql:
Чтобы упростить пример, я сделаю объект схемы типа ta (но в принципе вам не нужно - вы можете также поместить его в динамическую часть)

create or replace type t is object(col_name varchar2(100));
/

Тогда вы можете посмотреть на этот сценарий:

declare
  t_row t;
  cname varchar2(100) := 'col_name';
begin

  t_row := new t('col');

  execute immediate 'declare t_in t := :0; begin if t_in.' || cname ||
                    ' is null then dbms_output.put_line(''in''); end if; end;'
    using t_row;
end;

Хотя, я должен сказать, что это странное требование ...

1 голос
/ 01 марта 2012

Ошибка в том, что record t не имеет поля cname, но col_name:

type t is record (
  col_name varchar2(100)
);

Нужно знать поля записи во время компиляции.

Не могли бы вы сказать нам, какую реальную проблему вы собираетесь решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...