Не удалось удалить схему в DB2 с помощью хранимой процедуры ADMIN_DROP_SCHEMA - PullRequest
0 голосов
/ 11 февраля 2020

Я обнаружил, что в нескольких местах можно удалить схему в DB2 вместе со всем ее содержимым (индексами, SP, триггерами, последовательностями и т. Д. c), используя

CALL SYSPROC.ADMIN_DROP_SCHEMA('schema_name', NULL, 'ERRORSCHEMA', 'ERRORTAB');

Однако я получая следующую ошибку при использовании этой команды:

1) [Code: -469, SQL State: 42886]  The parameter mode OUT or INOUT is not valid for a parameter in the routine named "ADMIN_DROP_SCHEMA" with specific name "ADMIN_DROP_SCHEMA" (parameter number "3", name "ERRORTABSCHEMA").. SQLCODE=-469, SQLSTATE=42886, DRIVER=4.22.29
2) [Code: -727, SQL State: 56098]  An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-469", SQLSTATE "42886" and message tokens "ADMIN_DROP_SCHEMA|ADMIN_DROP_SCHEMA|3|ERRORTABSCHEMA".. SQLCODE=-727, SQLSTATE=56098, DRIVER=4.22.29

Может кто-нибудь помочь мне подсказать, что здесь не так? Я пытался осмотреть несколько мест, но не понял. Кажется, это не проблема авторизации. Использование DB2 версии 11.5.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Вы неправильно используете параметры процедуры ADMIN_DROP_SCHEMA , если вы вызываете процедуру из SQL, а не из CLP.

Третий и четвертый параметры не могут быть литеральными (несмотря на то, что документация, дающая такой пример), вместо этого они должны быть переменными хоста (поскольку процедура требует, чтобы они были параметрами ввода / вывода).

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

Если хранимая процедура обнаруживает ошибки, она создает и добавляет строки в указанную таблицу и оставляет значения этих параметров неизменными, а затем необходимо запросить эту таблицу, чтобы получить список ошибка (ы). Вы должны удалить эту таблицу перед вызовом хранимой процедуры, иначе процедура завершится с ошибкой -601.

Пример:

--#SET TERMINATOR @

drop table errschema.errtable@

set serveroutput on@

begin 
   declare v_errschema varchar(20) default 'ERRSCHEMA';
   declare v_errtab    varchar(20) default 'ERRTABLE';
   CALL SYSPROC.ADMIN_DROP_SCHEMA('SOMESCHEMA', NULL, v_errschema, v_errtab);
   if v_errschema is null and v_errtab is null
   then
       call dbms_output.put_line('The admin_drop_schema reported success');
   else
       call dbms_output.put_line('admin_drop_schema failed and created/populated table '||rtrim(v_errschema)||'.'||rtrim(v_errtab) );
   end if;
end@
0 голосов
/ 13 февраля 2020

Вы можете использовать глобальные переменные, если хотите использовать ADMIN_DROP_SCHEMA вне соединения SQL

Например

CREATE OR REPLACE VARIABLE ERROR_SCHEMA VARCHAR(128) DEFAULT 'SYSTOOLS';
CREATE OR REPLACE VARIABLE ERROR_TAB    VARCHAR(128) DEFAULT 'ADS_ERRORS';
DROP TABLE IF EXISTS SYSTOOLS.ADS_ERRORS;
CALL ADMIN_DROP_SCHEMA('MY_SCHEMA', NULL, ERROR_SCHEMA, ERROR_TAB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...