Избегайте перекомпиляции пакета после переименования одной таблицы - PullRequest
0 голосов
/ 01 октября 2018

Как сделать, чтобы пакет (pkg_test) не декомпилировался при переименовании внутренней таблицы (переименуйте таблицу test_table в test_table_new) онлайн в таблицу, которая находится внутри пакета (pkg_test).В дополнение к этому, есть веб-сервисы, которые постоянно обращаются к пакету и блокируют его при его использовании.

Одним из решений было использование команды «alter package pkg_test compile», но проблема в том, что веб-сервисыуже принял пакет (pkg_test) и не разрешает действие.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

спасибо за вашу помощь

Я использую переименование из-за скорости, с которой он делает это, поскольку веб-служба обращается к этой таблице через Интернет, сначала я загружаю временную таблицу (dws.temp), затем переименуйте временную таблицу в исходную таблицу (dws .finally), которая используется веб-службой.

другая - загрузка непосредственно в исходную таблицу (dws.finally), но в зависимости отВ этом случае это может привести к задержке, и требование состоит в том, чтобы обновление таблицы (dws.finally) происходило за секунды.с переименованием у меня таблица обновляется за одну секунду

примечание: веб-служба потребляет исходную таблицу (dws.finally) посредством пакета, поэтому, когда я делаю переименование (dws.temp в dws.finally)) он декомпилируется и веб-служба выдает ошибку.

также попробуйте динамический SQL, однако разработка

обходится дороже
0 голосов
/ 01 октября 2018

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

Почему вы переименовываете таблицу?Какая польза от этого?

Если возможно, переместите код, использующий TEST_TABLE, в динамический SQL.При этом пакет не будет признан недействительным, но вы все равно не сможете использовать код, который ссылается на переименованную таблицу.Вот пример:

Создание примера таблицы и пакета (ничего особенного):

SQL> create table test (datum date);

Table created.

SQL> insert into test values (sysdate);

1 row created.

SQL> create or replace package pkg_test as
  2    function f_right_now return date;
  3    function f_max_datum return date;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_test as
  2    function f_right_now return date is
  3    begin
  4      return sysdate;
  5    end;
  6
  7    function f_max_datum return date is
  8      retval date;
  9    begin
 10      select max(datum)
 11      into retval
 12      from test;
 13      return retval;
 14    end;
 15  end;
 16  /

Package body created.

SQL>

Давайте посмотрим, как это работает:

SQL> select pkg_test.f_right_now, pkg_test.f_max_datum from dual;

F_RIGHT_NO F_MAX_DATU
---------- ----------
2018-10-01 2018-10-01

SQL> select object_type, status from user_objects where object_name = 'PKG_TEST';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

Пока все хорошо.Теперь переименуйте таблицу и снова проверьте статус пакета:

SQL> rename test to test_new;

Table renamed.

SQL> select object_type, status from user_objects where object_name = 'PKG_TEST';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        INVALID

SQL> select pkg_test.f_right_now, pkg_test.f_max_datum from dual;
select pkg_test.f_right_now, pkg_test.f_max_datum from dual
                                                       *
ERROR at line 1:
ORA-04063: package body "SCOTT.PKG_TEST" has errors


SQL>

Как и ожидалось - тело пакета теперь недопустимо, и вы не можете его использовать.Итак, давайте переключимся на динамический SQL:

SQL> create or replace package body pkg_test as
  2    function f_right_now return date is
  3    begin
  4      return sysdate;
  5    end;
  6
  7    function f_max_datum return date is
  8      retval date;
  9    begin
 10      execute immediate 'select max(datum) from test' into retval;
 11      return retval;
 12    end;
 13  end;
 14  /

Package body created.

SQL>

Видите?Oracle не жалуется, хотя таблицы TEST больше не существует.Статус пакета VALID:

SQL> select object_type, status from user_objects where object_name = 'PKG_TEST';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

, но вы не можете использовать функцию «invalid» (пока «правильная» еще работает):

SQL> select pkg_test.f_right_now, pkg_test.f_max_datum from dual;
select pkg_test.f_right_now, pkg_test.f_max_datum from dual
                             *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SCOTT.PKG_TEST", line 10


SQL> select pkg_test.f_right_now from dual;

F_RIGHT_NO
----------
2018-10-01

SQL>

SQL> select pkg_test.f_right_now, pkg_test.f_max_datum from dual;
select pkg_test.f_right_now, pkg_test.f_max_datum from dual
                             *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SCOTT.PKG_TEST", line 10


SQL>

Еще одно переименование?Конечно, почему бы и нет?

SQL> rename test_new to test_littlefoot;

Table renamed.

SQL> select object_type, status from user_objects where object_name = 'PKG_TEST';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

SQL> select pkg_test.f_right_now from dual;

F_RIGHT_NO
----------
2018-10-01

SQL> select pkg_test.f_max_datum from dual;
select pkg_test.f_max_datum from dual
       *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SCOTT.PKG_TEST", line 10

Поэтому посмотрите, что динамический SQL работает для вас.На мой взгляд (еще раз) - не переименовывайте таблицы «просто потому, что», у вас должна быть веская причина для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...