курсор, возвращающий более одного типа записи с одинаковыми именами полей

#oracle #plsql #record #database-cursor

#Oracle #plsql #запись #база данных-курсор

Вопрос:

Предположим, что 2 таблицы структурированы следующим образом, имеющие соотношение строк друг с другом 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: требуется псевдоним в списке ВЫБОРА курсора, чтобы избежать дублирования имен столбцов 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. Невозможно, вы должны указать правильные псевдонимы

2. @KaushikNayak спасибо, жаль. Предполагая, что вы правы, мое мнение таково, что реализация Oracle такой возможности принесла бы значительную пользу для разработки. Есть ли у вас какие-либо мысли на этот счет?

3. Ну, мы, программисты, ожидаем, что язык должен содержать несколько функций для нашего преимущества. Вы всегда можете запросить их на форумах Oracle.

Ответ №1:

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