ORA-00928:缺少SELECT关键字

时间:2018-04-07 19:12:20

标签: oracle for-loop select plsql ora-00928

在MYTABLE中有课程及其前身课程。 我想要的是找到在指定课程之后要学习的课程。我错过了SELECT关键字错误。为什么我收到此错误,虽然我在FOR语句中有SELECT语句?我哪里做错了?

DECLARE
  coursename varchar2(200) := 'COURSE_101';
  str        varchar2(200);
BEGIN
  WITH DATA AS
    (select (select course_name 
             from MYTABLE 
             WHERE predecessors like ('''%' || coursename||'%''') 
            ) str
     from dual
    )
    FOR cursor1 IN (SELECT str FROM DATA) 
    LOOP
      DBMS_OUTPUT.PUT_LINE(cursor1);
    END LOOP;
end;

2 个答案:

答案 0 :(得分:4)

除非我错了,否则不能以这种方式使用WITH factoring子句;你必须将它用作内联视图,例如:

declare
  coursename varchar2(200) := 'COURSE_101';
  str        varchar2(200);
begin
  for cursor1 in (select str 
                  from (select (select course_name 
                                from mytable 
                                where predecessors like '''%' || coursename||'%'''
                               )  str
                        from dual
                       )
                 ) 
  loop
    dbms_output.put_line(cursor1.str);
  end loop;
end;
/

除了它不起作用的事实(错误的LIKE条件)之外,你还是过于复杂了。实际上,这就是的事情:

SQL> create table mytable(course_name  varchar2(20),
  2                       predecessors varchar2(20));

Table created.

SQL> insert into mytable values ('COURSE_101', 'COURSE_101');

1 row created.

SQL>
SQL> declare
  2    coursename varchar2(20) := 'COURSE_101';
  3  begin
  4    for cursor1 in (select course_name str
  5                    from mytable
  6                    where predecessors like '%' || coursename || '%'
  7                   )
  8    loop
  9      dbms_output.put_line(cursor1.str);
 10    end loop;
 11  end;
 12  /
COURSE_101

PL/SQL procedure successfully completed.

SQL>

另外,WHERE子句是否正确? PREDECESSORS喜欢课程?我不是说这是错的,只是看起来有点奇怪。

答案 1 :(得分:1)

要扩展@ Littlefoot的答案:您可以在游标中使用公用表表达式(WITH子句),但WITH必须是游标SELECT语句的一部分,而不是与它分开:

\

另请注意,游标FOR循环中的迭代变量表示游标的SELECT语句返回的行,因此如果要显示游标返回的内容,则必须使用点变量表示法(例如DECLARE coursename varchar2(200) := 'COURSE_101'; BEGIN FOR aRow IN (WITH DATA AS (select course_name AS str from MYTABLE WHERE predecessors like '''%' || coursename||'%''') SELECT str FROM DATA) LOOP DBMS_OUTPUT.PUT_LINE(aRow.str); END LOOP; END; )从行中提取字段。

祝你好运。