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

标签 oracle compiler-errors sqlplus

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

让我们安装两个对象:包A和 View 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

我不仅在“包装后查看”情况下遇到了这个问题,而且目前在“包装后包装”情况下的简短示例中无法重现该问题(这在很大程度上困扰着我)。因此,它似乎并没有针对所有类型的编译错误出现。

文档说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返回我得到的最后一个错误。这是否意味着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

不,我不能那样做。

因此,我认为您必须使用该不太实用的选项并指定要查看的错误。

关于oracle - 如何清除SQLPlus中的错误消息缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58425759/

相关文章:

oracle - 在 SQL*Plus 中将字符集设置为 UTF-8

java - Glassfish 节点的最大数量?

sql - 如何将十六进制数据插入到oracle表中?

c# - 找不到类型或 namespace 名称 'register'

c - 仅当参数不是常量时,math.h 中的 sqrt 才会导致链接器错误 "undefined reference to sqrt"

python - Python不断显示 'object has no such attribute'

mysql - 如何映射 JPA 实体标识符以在 Oracle 和 MySQL 上工作

c# - ORA-06550: 调用 Oracle 存储过程时参数的数量或类型错误

sql - 在sql developer中select * from table时列显示顺序不正确

oracle - 在 oracle 10g 中,如何在循环中接受用户输入?