存储过程和函数中的编译错误

PolarDB PostgreSQL版(兼容Oracle)分析程序编译存储过程或函数时,它们确认CREATE语句和程序主体(程序中AS关键字后面的那部分)符合SPL和SQL构造的语法规则。默认情况下,如果分析程序检测到错误,服务器将终止编译过程。请注意,分析程序检测表达式中的语法错误,而不是语义错误(即表达式引用不存在的列、表或函数,或不正确类型的值)。

如果在SPL代码中遇到指定数量的错误,或在SQL代码中遇到错误,spl.max_error_count会指示服务器停止分析。spl.max_error_count的默认值为10,最大值为1000。将spl.max_error_count设置为1会在SPL或SQL代码中遇到第一个错误时指示服务器停止分析。

您可以使用SET命令为当前会话指定spl.max_error_count值。语法如下:

SET spl.max_error_count = number_of_errors;

其中number_of_errors指定在服务器停止编译过程之前可以出现的SPL错误数。例如:

SET spl.max_error_count = 6;

示例指示服务器继续通过所遇到的前5个SPL错误。当服务器遇到第6个错误时,它会停止验证,并输出6个详细的错误消息和1个错误摘要。

为节省开发新代码或从另一个源导入现有代码所需的时间,您可以将spl.max_error_count配置参数设置为相对较高的错误数。

请注意,如果您指示服务器继续分析而不管程序主体中的SPL代码中的错误,并且分析程序在SQL代码段中遇到错误,则错误的SQL代码后面的任何SPL或SQL代码中可能仍存在错误。例如,以下函数生成两个错误:

CREATE FUNCTION computeBonus(baseSalary number) RETURN number AS
BEGIN
    bonus := baseSalary * 1.10;
    total := bonus + 100;
    RETURN bonus;
END;

返回结果如下:

ERROR:  "bonus" is not a known variable
LINE 3:     bonus := baseSalary * 1.10;
            ^
ERROR:  "total" is not a known variable
LINE 4:     total := bonus + 100;
            ^
ERROR:  compilation of SPL function/procedure "computebonus" failed due to 2 errors

以下示例将SELECT语句添加到上一个示例中。SELECT语句中的错误掩盖了后面的其他错误:

CREATE FUNCTION computeBonus(employeeName number) RETURN number AS
BEGIN
    SELECT salary INTO baseSalary FROM emp
      WHERE ename = employeeName;
    bonus := baseSalary * 1.10;
    total := bonus + 100;
    RETURN bonus;
END;

返回结果如下:

ERROR:  "basesalary" is not a known variable
LINE 3:     SELECT salary INTO baseSalary FROM emp WHERE ename = emp...