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 4:     bonus := baseSalary * 1.10;
            ^
ERROR:  "total" is not a known variable
LINE 5:     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...