курсор возвращает более одного типа записи с одинаковыми именами полей - PullRequest
0 голосов
/ 16 марта 2019

Предположим, что две таблицы структурированы следующим образом и имеют отношение строк 1: 1 друг к другу:

create table table1 (
  id   number(9)      primary key
 ,name varchar2(100)
);

create table table2 (
  id   number(9)      primary key
 ,name varchar2(100)
);

Я хотел бы создать курсор следующим образом:

declare
  cursor c1 is 
            select t1.*
                  ,t2.*
            from table1         t1
                 join table2    t2 on (t2.id = t1.id);
begin
  for r in c1 loop
    dbms_output.put_line(r.name);     -- here I want to display the table1 name value
  end loop;
end;

но, конечно, я получаю

ORA-06550: строка 8, столбец 3: PLS-00402: в списке SELECT требуется псевдоним курсора, чтобы избежать повторяющихся имен столбцов ORA-06550: строка 8, столбец 3: PL / SQL: оператор игнорируется

Я четко понимаю, что получаю эту ошибку, потому что имя используется в обеих таблицах, и поэтому курсор не знает, что мне дать.

Я пытаюсь выяснить, существует ли какой-либо способ наложить псевдоним на целую запись в курсоре, чтобы получить эквивалент этого - также не работающего - кода:

declare
  cursor c1 is 
            select t1.*  rec1
                  ,t2.*  rec2
            from table1         t1
                 join table2    t2 on (t2.id = t1.id);
begin
  for r in c1 loop
    dbms_output.put_line(r.rec1.name);     -- have inserted incorrect "rec1" here
  end loop;
end;

Это теоретически может быть расширено для работы с таблицами и записями t1, t2, t3 ... tn.

Для контекста моя цель здесь - уменьшить количество определений составных статических записей, необходимых для отдельных курсоров, объединяющих различные таблицы.

Любая обратная связь будет приветствоваться.

1 Ответ

0 голосов
/ 16 марта 2019

Невозможно, вы должны предоставить псевдоним, чтобы избежать повторения одного и того же имени.было бы возможно, если бы у нас была идея, как работает запрос select при выборе одного и того же имени столбца из двух таблиц.(потому что, если вы выбираете одно и то же имя из двух таблиц, запрос выбора добавляет к нему псевдоним, я не уверен, как это работает.)

...