ORA-00928缺失SELECT关键字错误排查:PL/SQL课程查询问题
为啥会触发ORA-00928错误?
兄弟,你这个问题根源在于PL/SQL的语法结构完全搞错了,咱们一步步拆解:
- WITH子句的位置不对:你在BEGIN块里先写了
WITH DATA AS (...),然后直接接FOR循环,这不符合PL/SQL的语法规则。FOR游标循环要么直接跟完整的SELECT语句,要么先定义好游标再引用,不能把WITH子句孤零零放在FOR前面当“前置块”。 - 单引号嵌套错误:你写的
predecessors like ('''%' || coursename||'%''')里单引号多了,这会让SQL解析器误以为语法不完整,间接加重了语法错误的触发。
修正后的代码示例
先给你最简洁的修正版本,去掉不必要的WITH子句(如果你的场景不需要复用子查询的话):
DECLARE coursename varchar2(200) := 'COURSE_101'; str varchar2(200); BEGIN -- 直接把查询语句放在FOR循环里,语法合规 FOR curso IN ( SELECT course_name AS str FROM MYTABLE -- 修正单引号:直接拼接变量,不需要额外嵌套 WHERE predecessors LIKE '%' || coursename || '%' ) LOOP -- 这里可以添加你的业务逻辑,比如打印结果或者赋值 DBMS_OUTPUT.PUT_LINE('需修读的后续课程:' || curso.str); str := curso.str; END LOOP; END; /
如果你的场景需要用WITH子句(比如复杂的递归查询,要找所有层级的后续课程),那正确的写法是把WITH子句嵌入到FOR循环的SELECT语句内部:
DECLARE coursename varchar2(200) := 'COURSE_101'; str varchar2(200); BEGIN FOR curso IN ( WITH course_data AS ( SELECT course_name AS str FROM MYTABLE WHERE predecessors LIKE '%' || coursename || '%' ) SELECT str FROM course_data ) LOOP DBMS_OUTPUT.PUT_LINE('需修读的后续课程:' || curso.str); str := curso.str; END LOOP; END; /
额外补充:递归查询所有后续课程
如果你的需求是找指定课程之后所有层级的后续课程(不止直接前置的),可以用递归CTE:
DECLARE coursename varchar2(200) := 'COURSE_101'; str varchar2(200); BEGIN FOR curso IN ( WITH RECURSIVE course_hierarchy AS ( -- 第一步:找直接以指定课程为前置的课程 SELECT course_name FROM MYTABLE WHERE predecessors LIKE '%' || coursename || '%' UNION ALL -- 递归:找以上一步课程为前置的课程 SELECT m.course_name FROM MYTABLE m JOIN course_hierarchy ch ON m.predecessors LIKE '%' || ch.course_name || '%' ) -- 去重避免重复课程 SELECT DISTINCT course_name AS str FROM course_hierarchy ) LOOP DBMS_OUTPUT.PUT_LINE('需修读的后续课程:' || curso.str); str := curso.str; END LOOP; END; /
内容的提问来源于stack exchange,提问作者charmander
相关产品推荐
相关产品推荐

