【问题标题】:Cursor with multiple queries in oracle not compilingoracle中带有多个查询的游标无法编译
【发布时间】:2020-02-21 17:22:05
【问题描述】:

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

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 语句被忽略 //在第一个查询的选择词处

缺少右括号 //在第一个查询的最后一个单词

【问题讨论】:

标签: oracle stored-procedures cursor


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的回答,还是同样的问题。
  • 更新的答案现在应该可以工作了——至少它对我的测试数据有用...
  • 抱歉更新晚了,虽然我改了查询结果还是一样
【解决方案2】:

基于 Scott 架构的示例:

  • 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>

【讨论】:

  • 感谢您的回答,很好的捕捉和建议您的回答帮助我达到了 50% 的答案,其余的能够解决。谢谢
【解决方案3】:

这是给你的另一个答案,只是有细微的差别,并有一个例子:

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

【讨论】:

  • 感谢您的回答,但 littlefoot 的回答帮助了我。
  • 不客气。我只是想指出 Oracle 保留字的重要性。我把它们放在双引号“”下。
猜你喜欢
  • 1970-01-01
  • 2020-12-05
  • 2020-02-03
  • 2019-10-02
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多