oracle 中多个查询的游标未编译

Cursor with multiple queries in oracle not compiling

我创建了一个游标,其中包含两个通过内连接连接的查询,但查询未在第一个查询结束时编译它们的错误,但在没有游标的情况下执行相同的查询。

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 statement ignored //at select word of first query

Missing right parenthesis //at the last word of first query

您必须将子查询放在括号中并为子查询添加别名:

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

基于 Scott 架构的示例:

  • SELECT 如果这些内联视图返回的列共享相同的名称,则应包含列别名;否则,您将不知道自己使用的是哪一款
  • 内联视图应该有自己的别名;基本上,这总是一个好主意 - 在列前加上 table 别名,否则您很快就会忘记哪个列属于哪个 table

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>

这是给你的另一个答案,只是略有不同,并附有示例:

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