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;
根据你提供的错误信息,"子查询未正确结束"应该是由于存储过程的定义中存在语法错误导致的。请检查以下几个方面以解决问题:
$$ LANGUAGE plpgsql;
结尾。以下是一个修复可能引起错误的地方的示例代码,请参考修改后的代码:
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;
请注意,这只是基于你提供的代码做出的修改示例,并不能保证所有错误都被修复。
不知道你这个问题是否已经解决, 如果还没有解决的话:问题标题: 解决SQL存储过程报错“子查询未正确结束”
问题内容: 在连接使用Navicat连接openGauss虚拟机并运行SQL存储过程时,遇到了报错信息“子查询未正确结束”(ERROR: subprogram body is not ended correctly at end of input)。请问如何解决这个问题?
这个问题通常是由于SQL存储过程中存在语法错误导致的。以下是一些常见问题和解决方法:
存储过程语法错误:确保您的SQL语句以正确的方式结束,并检查语法错误。确认最后一个语句是以"END;
"结束的。确保在语句的结束处没有遗漏分号等。
嵌套查询的括号不匹配:检查您的嵌套查询,并确保每个打开的括号都正确地关闭了。例如,确认每个左括号 "(" 与右括号 ")" 都正确地成对出现。
非法字符:检查您的SQL代码,确保没有非法字符或特殊字符引起的问题。有时可能会误输入一些空格、回车或制表符等特殊字符。
尝试在运行存储过程之前检查和解决上述问题,如果存储过程中没有明显的语法错误,可以尝试在存储过程的结尾加上一个分号 ";", 即使不是必需的也可以尝试这样做,有时可以解决一些语法解析问题。
说到具体的解决方案,需要查看您的SQL存储过程代码才能给出更准确的建议。请将您的SQL存储过程代码粘贴在下面,以便我可以帮助您更好地解决这个问题。