Ну, я могу думать правильно: не делай этого.Если вы переименовали таблицу, которая используется пакетом, пакет станет недействительным, и вы не сможете использовать его, пока не исправите ошибку.
Почему вы переименовываете таблицу?Какая польза от этого?
Если возможно, переместите код, использующий 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 работает для вас.На мой взгляд (еще раз) - не переименовывайте таблицы «просто потому, что», у вас должна быть веская причина для этого.