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