SQL存储过程报错“子查询未正确结束”

SQL创建存储过程却一直报错“子查询未正确结束”(ERROR: subprogram body is not ended correctly at end of input),请问要怎么解决呢?

是用Navicat连接的openGauss虚拟机运行的。
代码如下,求解惑

CREATE OR REPLACE PROCEDURE CalculateGPA()
AS
$$
DECLARE
    student_row RECORD;
    gpa DECIMAL(4, 2);
BEGIN
    -- 清空表中原有的绩点数据
    TRUNCATE TABLE Yangq_GPA_Statistics01;
    
    -- 遍历所有学生
    FOR student_row IN SELECT DISTINCT yq_Sno01 FROM Yangq_Reports01
    LOOP
        -- 遍历学年
        FOR academic_year IN SELECT DISTINCT yq_Year01 FROM Yangq_Reports01
        LOOP
            -- 遍历学期
            FOR semester IN ARRAY['上', '下']
            LOOP
                -- 计算绩点
                SELECT sum((yangq_reports01.yq_score01-50)*yangq_course01.yq_ccredit01/10)/sum(yangq_course01.yq_ccredit01) AS yq_GPA 
                FROM Yangq_Reports01,yangq_course01
                WHERE yq_Sno01 = student_row.yq_Sno01
                    AND yq_Year01 = academic_year.yq_Year01
                    AND yq_Csemesters01 = semester
                                        AND Yangq_course01.yq_cno01=yangq_reports01.yq_cno01;
                    
                -- 插入绩点数据到统计表
                INSERT INTO Yangq_GPA_Statistics01 (yq_Sno01, yq_Year01, yq_Semester01, yq_GPA01)
                VALUES (student_row.yq_Sno01, academic_year.yq_Year01, semester, gpa);
            END LOOP;
        END LOOP;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

根据你提供的错误信息,"子查询未正确结束"应该是由于存储过程的定义中存在语法错误导致的。请检查以下几个方面以解决问题:

  1. 确保存储过程定义的末尾使用了正确的语法结构。在示例代码中,可以看到存储过程以 $$ LANGUAGE plpgsql; 结尾。
  2. 检查存储过程中的所有循环和语句块是否正常配对,并以正确的方式结束。确保每个 BEGIN 都有相应的 END。
  3. 检查存储过程中的子查询语句是否正确结束并正确嵌套在相关的查询语句内。

以下是一个修复可能引起错误的地方的示例代码,请参考修改后的代码:

CREATE OR REPLACE PROCEDURE CalculateGPA()
AS
$$
DECLARE
    student_row RECORD;
    gpa DECIMAL(4, 2);   
    academic_year RECORD;
    semester TEXT;
BEGIN
    -- 清空表中原有的绩点数据
    TRUNCATE TABLE Yangq_GPA_Statistics01;
    
    -- 遍历所有学生
    FOR student_row IN SELECT DISTINCT yq_Sno01 FROM Yangq_Reports01
    LOOP
        -- 遍历学年
        FOR academic_year IN SELECT DISTINCT yq_Year01 FROM Yangq_Reports01
        LOOP
            -- 遍历学期
            FOR semester IN ARRAY['上', '下']
            LOOP
                -- 计算绩点
                SELECT sum((yq_score01-50)*yq_ccredit01/10)/sum(yq_ccredit01) INTO gpa
                FROM Yangq_Reports01, yangq_course01
                WHERE yq_Sno01 = student_row.yq_Sno01
                    AND yq_Year01 = academic_year.yq_Year01
                    AND yq_Csemesters01 = semester
                    AND yq_cno01 = yangq_reports01.yq_cno01;
                
                -- 插入绩点数据到统计表
                INSERT INTO Yangq_GPA_Statistics01 (yq_Sno01, yq_Year01, yq_Semester01, yq_GPA01)
                VALUES (student_row.yq_Sno01, academic_year.yq_Year01, semester, gpa);
            END LOOP;
        END LOOP;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

请注意,这只是基于你提供的代码做出的修改示例,并不能保证所有错误都被修复。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题标题: 解决SQL存储过程报错“子查询未正确结束”

    问题内容: 在连接使用Navicat连接openGauss虚拟机并运行SQL存储过程时,遇到了报错信息“子查询未正确结束”(ERROR: subprogram body is not ended correctly at end of input)。请问如何解决这个问题?

    这个问题通常是由于SQL存储过程中存在语法错误导致的。以下是一些常见问题和解决方法:

    1. 存储过程语法错误:确保您的SQL语句以正确的方式结束,并检查语法错误。确认最后一个语句是以"END;"结束的。确保在语句的结束处没有遗漏分号等。

    2. 嵌套查询的括号不匹配:检查您的嵌套查询,并确保每个打开的括号都正确地关闭了。例如,确认每个左括号 "(" 与右括号 ")" 都正确地成对出现。

    3. 非法字符:检查您的SQL代码,确保没有非法字符或特殊字符引起的问题。有时可能会误输入一些空格、回车或制表符等特殊字符。

    尝试在运行存储过程之前检查和解决上述问题,如果存储过程中没有明显的语法错误,可以尝试在存储过程的结尾加上一个分号 ";", 即使不是必需的也可以尝试这样做,有时可以解决一些语法解析问题。

    说到具体的解决方案,需要查看您的SQL存储过程代码才能给出更准确的建议。请将您的SQL存储过程代码粘贴在下面,以便我可以帮助您更好地解决这个问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^