Как очистить буфер сообщений об ошибках в SQLPlus? - PullRequest
0 голосов
/ 17 октября 2019

Существует проблема при установке нескольких объектов с помощью 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

Я сталкивался с этой проблемой не только в случае «просмотр после пакета», но в настоящее время я не могу воспроизвести его в коротком примере для случая «пакет после пакета»(что беспокоит меня в основном). Таким образом, похоже, что он появляется не для всех типов ошибок компиляции.


Документация гласит When you specify SHOW ERRORS with no arguments, SQL*Plus shows compilation errors for the most recently created or altered stored procedure.

Также ясно, что есть возможность указать конкретныйobject

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

Но он не выглядит пригодным для использования, поскольку требование предоставления типа объекта усложняет ситуацию (неясно, почему команду нельзя удовлетворить только именем объекта).

Не могли бы вы помочь мне найти способ очистки буфера команды SHOW ERRORS, чтобы ее можно было установить в первоначальном состоянии перед каждой компиляцией объекта?

1 Ответ

1 голос
/ 17 октября 2019

Если есть способ, я его не знаю.

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 вернет последние ошибки, которые я получил. Значит ли это, что 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>

Итак, я могу просто удалить его содержимое? В идеале, я бы делал это между каждыми двумя CREATE PROCEDURE (или какими-то еще) операторами в этом скрипте .SQL:

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

Нет, я не могу этого сделать.

Поэтому, я думаю , вам придется использовать эту не очень удобную опцию и указать, чьи ошибки вы хотите видеть.

...