在编译存储的 PL 单元时,PL 编译器会对不足以导致错误和阻止编译的情况生成警告。例如,使用废弃的 PL 功能。

PLSQL_WARNINGS 参数

PL 告警的消息代码的格式为PLW-nnnnn

编译时告警类别如下表所示。

类别

描述

例如

SEVERE

条件可能会导致意外行为或错误的结果。

参数的混叠问题。

PERFORMANCE

条件可能会导致性能问题。

VARCHAR2值传递给INSERT语句中的NUMBER列。

INFORMATIONAL

条件不影响性能或正确性,但可能需要进行更改以使代码更易于维护。

永远无法运行的代码。

通过设置编译参数PLSQL_WARNINGS,可以实现如下功能:

  • 启用和禁用所有警告,包括一个或多个告警类别以及指定警告

  • 将指定的告警视为错误(在编译 PL 单元之前必须更正)

以下各项支持设置PLSQL_WARNINGS的值:

  • 数据库实例使用ALTER SYSTEM语句

  • 会话使用ALTER SESSION语句

  • 存储的 PL 单元使用ALTER语句及其compile_parameters_clause

对于以上任何ALTER语句,都使用以下语法设置PLSQL_WARNINGS的值:

  1. PLSQL_WARNINGS = 'value_clause [, value_clause] ...'

使用ALTER语句设置PLSQL_WARNINGS值的示例如下。

示例 1:对会话启用所有警告

  1. ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';

示例 2:对会话关闭INFORMATIONAL类告警

  1. ALTER SESSION SET PLSQL_WARNINGS='DISABLE:INFORMATIONAL';

示例 3:对会话启用PERFORMANCE类告警,关闭SEVERE类告警,并将PLW-07002告警视为错误

  1. ALTER SESSION
  2. SET PLSQL_WARNINGS='ENABLE:PERFORMANCE, DISABLE:SEVERE, ERROR:07002';

DBMS_WARNING 包

如果要在可编译 PL 单元的开发环境中编写 PL 单元,则可以通过调用DBMS_WARNING包中的子程序来显示和设置PLSQL_WARNINGS的值。

在编译复杂应用程序时,DBMS_WARNING子程序可用于设置不同的PLSQL_WARNINGS值。DBMS_WARNING子程序可以保存当前的PLSQL_WARNINGS设置,也可以更改设置以编译指定的子程序集,然后将其恢复为原始值。

示例如下:

  1. obclient>ALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL'; --禁用此会话的所有告警消息
  2. Query OK, 0 rows affected (0.00 sec)
  3. obclient>CREATE OR REPLACE PROCEDURE sample_code AUTHID DEFINER AS
  4. n CONSTANT BOOLEAN := TRUE;
  5. BEGIN
  6. IF n THEN
  7. DBMS_OUTPUT.PUT_LINE('TRUE');
  8. ELSE
  9. DBMS_OUTPUT.PUT_LINE('FALSE');
  10. END IF;
  11. END sample_code;
  12. /
  13. Query OK, 0 rows affected (0.03 sec)
  14. obclient> CALL DBMS_WARNING.set_warning_setting_string ('ENABLE:ALL', 'SESSION'); --启用此会话的所有告警消息
  15. Query OK, 0 rows affected (0.08 sec)
  16. obclient> SELECT DBMS_WARNING.get_warning_setting_string() FROM DUAL; --查看当前的告警设置
  17. +-------------------------------------------+
  18. | DBMS_WARNING.GET_WARNING_SETTING_STRING() |
  19. +-------------------------------------------+
  20. | ENABLE:ALL |
  21. +-------------------------------------------+
  22. 1 row in set (0.01 sec)