Oracle ORA-00928:缺少SELECT关键字

Oracle ORA-00928:缺少SELECT关键字,oracle,for-loop,select,plsql,ora-00928,Oracle,For Loop,Select,Plsql,Ora 00928,在MYTABLE中有课程及其前身课程。 我想做的是找到在指定课程之后要修的课程。我缺少选择关键字错误。为什么在FOR语句中有SELECT语句时却出现此错误?我哪里做错了 DECLARE coursename varchar2(200) := 'COURSE_101'; str varchar2(200); BEGIN WITH DATA AS (select (select course_name from MYTABLE

在MYTABLE中有课程及其前身课程。 我想做的是找到在指定课程之后要修的课程。我缺少选择关键字错误。为什么在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;

除非我错了,否则保理条款不能这样使用;您必须将其用作内联视图,例如:

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;
/
除了它不起作用(类似于错误的情况)之外,您还将其过度复杂化了。实际上,它就是这样做的:

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子句正确吗?像COURSENAME这样的前辈?我并不是说它错了,只是看起来有点奇怪。

除非我错了,否则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;
/
除了它不起作用(类似于错误的情况)之外,您还将其过度复杂化了。实际上,它就是这样做的:

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子句正确吗?像COURSENAME这样的前辈?我并不是说它错了,只是看起来有点奇怪。

要稍微扩展@Littlefoot的答案:可以在游标中使用公共表表达式(WITH子句),但WITH必须是游标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;
还要注意,游标FOR循环中的迭代变量表示游标的SELECT语句返回的一行,因此,如果要显示游标返回的内容,必须使用点变量表示法(例如,
aRow.str
)从该行提取字段


祝你好运。

稍微扩展一下@Littlefoot的答案:可以在游标中使用公共表表达式(WITH子句),但WITH必须是游标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;
还要注意,游标FOR循环中的迭代变量表示游标的SELECT语句返回的一行,因此,如果要显示游标返回的内容,必须使用点变量表示法(例如,
aRow.str
)从该行提取字段


祝你好运。

谢谢。你的第二个例子对我有用。实际上,就像条件没有错一样,它看起来复杂的原因是我希望它是动态值,因为我的表中有很多数据。再次感谢!非常感谢。你的第二个例子对我有用。实际上,就像条件没有错一样,它看起来复杂的原因是我希望它是动态值,因为我的表中有很多数据。再次感谢!