Это слишком много кода, чтобы поместить его в комментарий, поэтому я пишу его здесь.
Сначала проверим, существует ли таблица:
SQL> DESC aaa;
ERROR:
ORA-04043: object aaa does not exist
Теперь создаемПакет и его тело - я включил элемент управления, который предотвратит ошибку, если таблица не существует:
SQL> CREATE OR REPLACE PACKAGE Sappe
2 AS
3 PROCEDURE initialize;
4 END;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY Sappe
2 AS
3 PROCEDURE initialize
4 IS
5 l_cnt NUMBER;
6 BEGIN
7 SELECT COUNT (*)
8 INTO l_cnt
9 FROM user_tables
10 WHERE table_name = 'AAA';
11
12 IF l_cnt > 0
13 THEN
14 EXECUTE IMMEDIATE 'Drop table AAA';
15 END IF;
16
17 EXECUTE IMMEDIATE q'[CREATE TABLE AAA(id int not null,
18 x1 varchar(1) default ' ',
19 x2 varchar(1) default ' ',
20 x3 varchar(1) default ' ',
21 x4 varchar(1) default ' ',
22 x5 varchar(1) default ' ',
23 x6 varchar(1) default ' ',
24 x7 varchar(1) default ' ')]';
25 END initialize;
26 END sappe;
27 /
Package body created.
Тестирование:
SQL> BEGIN
2 sappe.initialize;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
SQL> DESC aaa;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(38)
X1 VARCHAR2(1)
X2 VARCHAR2(1)
X3 VARCHAR2(1)
X4 VARCHAR2(1)
X5 VARCHAR2(1)
X6 VARCHAR2(1)
X7 VARCHAR2(1)
SQL>
Как видите, это работает.Таблица теперь существует, поэтому - давайте запустим процедуру еще раз - не должно произойти сбой:
SQL> BEGIN
2 sappe.initialize;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
Кажется, все в порядке.