如何清除 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_ERRORS
或 DBA_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
不,我不能那样做。
因此,我认为你必须使用那个不太有用的选项并指定你想查看谁的错误。
通过 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_ERRORS
或 DBA_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
不,我不能那样做。
因此,我认为你必须使用那个不太有用的选项并指定你想查看谁的错误。