#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 добавляет к нему псевдоним, я не уверен, как это работает.)