如何清除 SQLPlus 中的错误消息缓冲区?

How to clear error message buffer in SQLPlus?

通过 SQL*Plus 安装多个对象时出现问题。

让我们安装两个对象:包A和视图B,A有编译错误

SET FEEDBACK OFF

prompt install PACKAGE_A spec
create or replace package package_a is
  procedure p;
end;
/
show errors

prompt install PACKAGE_A body
create or replace package body package_a is
  procedure p is begin hello; end;
end;
/
show errors

prompt install VIEW_B
create or replace view view_b as
  select * from dual;

show errors

这样我们在输出中得到:

install PACKAGE_A spec
No errors.

install PACKAGE_A body

Warning: Package Body created with compilation errors.

Errors for PACKAGE BODY PACKAGE_A:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/24     PL/SQL: Statement ignored
2/24     PLS-00201: identifier 'HELLO' must be declared

install VIEW_B
Errors for PACKAGE BODY PACKAGE_A:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/24     PL/SQL: Statement ignored
2/24     PLS-00201: identifier 'HELLO' must be declared

我不仅在 "view after package" 案例中遇到过这个问题,而且目前我无法在 "package after package" 案例的简短示例中重现它(这让我很困扰).所以好像不是针对所有类型的编译错误都会出现。


文档说 When you specify SHOW ERRORS with no arguments, SQL*Plus shows compilation errors for the most recently created or altered stored procedure

很明显还有一个指定特定对象的选项

SHOW ERR[ORS] [{FUNCTION | PROCEDURE | PACKAGE | PACKAGE BODY ...} [schema.]name]

但它看起来不可用,因为给出对象类型的要求使情况变得过于复杂(为什么仅使用对象名称不能满足命令的原因并不明显)。

你能帮我找到一种方法来清除 SHOW ERRORS 命令的缓冲区,以便在每次对象编译之前将其设置为原始状态吗?

如果有办法,我也不知道

SHOW ERRORS 是一个 SQL*Plus 命令。据我所知,它从 USER_ERRORS(或者可能是 ALL_ERRORSDBA_ERRORS)获取数据。它的描述是

SQL> desc user_errors;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 NAME                                      NOT NULL VARCHAR2(30)
 TYPE                                               VARCHAR2(12)
 SEQUENCE                                  NOT NULL NUMBER
 LINE                                      NOT NULL NUMBER
 POSITION                                  NOT NULL NUMBER
 TEXT                                      NOT NULL VARCHAR2(4000)
 ATTRIBUTE                                          VARCHAR2(9)
 MESSAGE_NUMBER                                     NUMBER

如果我这样做:

SQL> create or replace procedure ptest is
  2    l_Res number;
  3  begin
  4    l_res := 1 * A;
  5  end;
  6  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE PTEST:

LINE/COL ERROR
-------- --------------------------------------------------------
4/3      PL/SQL: Statement ignored
4/16     PLS-00201: identifier 'A' must be declared

然后 SHOW ERR returns 我得到的最后一个错误。这是否意味着 USER_ERRORS 不包含其他内容?否:

SQL> select name, line, substr(text, 1, 50) text from user_Errors;

NAME               LINE TEXT
------------ ---------- --------------------------------------------------
PTEST                 4 PL/SQL: Statement ignored
PTEST                 4 PLS-00201: identifier 'A' must be declared
ADD_COURSE            0 PL/SQL: Compilation unit analysis terminated
ADD_COURSE            2 PLS-00201: identifier 'COURSE.TILTE' must be decla

SQL>

那么,我可以简单地删除它的内容吗?理想情况下,我会在该 .SQL 脚本中的每两个 CREATE PROCEDURE (或其他)语句之间执行此操作:

SQL> delete user_errors;
delete user_errors
       *
ERROR at line 1:
ORA-01031: insufficient privileges

不,我不能那样做。

因此,我认为你必须使用那个不太有用的选项并指定你想查看谁的错误。