Курсор с несколькими запросами в Oracle не компилируется - PullRequest
0 голосов
/ 25 октября 2019

Я создал курсор, в котором два запроса соединены с внутренним соединением, но запрос не компилируется, это ошибка в конце первого запроса, но тот же запрос выполняется без курсора.

cursor data is
select * from
select rid,id, order from table1
inner join
select pid, name, order from table2
on table1.order =  table2.order

исходный запрос намного больше и сложнее, но конечный результат будет следующим:

Это ошибки компиляции в конце первого запроса, и они носят общий характер, я думаю, синтаксис для создания двух соединенных запросов неправильный (хотя это дикое предположение)

Ошибка:

Оператор SQL игнорируется // при выборе слова первого запроса

Отсутствует правая скобка // в последнем словепервого запроса

Эксперты, пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Пример на основе схемы Скотта:

  • SELECT должен содержать псевдонимы столбцов, если столбцы, возвращаемые этими встроенными представлениями, имеют одинаковые имена;иначе вы не будете знать, какой из используемых вами
  • встроенных представлений должен иметь свои собственные псевдонимы;в принципе, это всегда хорошая идея - использовать префикс столбцов с псевдонимами таблиц, иначе вы скоро забудете, какой столбец принадлежит какой таблице

SQL> declare
  2    cursor data is
  3      select a.empno a_empno, b.ename b_ename
  4      from (select empno, ename, deptno from emp) a
  5            inner join
  6           (select empno, ename, deptno from emp) b
  7            on a.deptno = b.deptno
  8      where rownum < 5;
  9  begin
 10    for data_r in data loop
 11      dbms_output.put_line(data_r.b_ename);
 12    end loop;
 13  end;
 14  /
SMITH
JONES
SCOTT
ADAMS

PL/SQL procedure successfully completed.

SQL>
2 голосов
/ 25 октября 2019

Вы должны поместить свои подзапросы в круглые скобки и добавить псевдонимы для подзапросов:

cursor data is
select * from
(select rid,id, order from table1) table1
inner join
(select pid, name, order from table2) table2
on table1.order =  table2.order
1 голос
/ 25 октября 2019

Вот еще один ответ для вас, с небольшими отличиями и с примером:

CREATE OR REPLACE PROCEDURE p_test(n_test in number)
AS
   CURSOR data 
   IS
      SELECT *
      FROM 
         (SELECT rid
                 , id
                 , "order" or1 
          FROM table1) tab1
          INNER JOIN
          (SELECT pid
                  , name
                  , "order" or1
           FROM table2 ) tab2
           ON tab1.or1 = tab2.or1;
BEGIN
     FOR data_i IN data LOOP
           DBMS_OUTPUT.PUT_LINE(data_i.rid);
     END LOOP;
END p_test;

Вот это DEMO

...