You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-00928缺失SELECT关键字错误排查:PL/SQL课程查询问题

为啥会触发ORA-00928错误?

兄弟,你这个问题根源在于PL/SQL的语法结构完全搞错了,咱们一步步拆解:

  1. WITH子句的位置不对:你在BEGIN块里先写了WITH DATA AS (...),然后直接接FOR循环,这不符合PL/SQL的语法规则。FOR游标循环要么直接跟完整的SELECT语句,要么先定义好游标再引用,不能把WITH子句孤零零放在FOR前面当“前置块”。
  2. 单引号嵌套错误:你写的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:52:30