2013-01-28 3 views
5

Можно создать дубликат:
Oracle: If Table Exists
Drop table if it existsОтбросьте таблицу в процедуре

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

CREATE OR REPLACE PROCEDURE SP_VEXISTABLA(NOMBRE IN VARCHAR2) 
IS 
CANTIDAD NUMBER(3); 
BEGIN 
SELECT COUNT(*) INTO CANTIDAD FROM ALL_OBJECTS WHERE OBJECT_NAME = NOMBRE; 
IF (CANTIDAD >0) THEN 
    DROP TABLE NOMBRE; 
END IF; 
END; 

Ошибка:

Ошибка (8,1): PLS-00103: Встречающиеся символ "END", когда ожидается одно из следующих действий: (начинают случай объявить выход для Goto, если цикл мод нулевой прагмы рейз возвращение выберите обновление в то время как с < < продолжают закрывать текущие удаления выборки предохранительного вкладыша набор открытой откат точки сохранения SQL выполнить коммит FORALL слияния продувки труб.

вы знаете, что я делаю не так ли?

+0

Какой инструмент вы используете для запуска этого? –

+0

Oracle sql developer Версия 3.2.20.09 –

+3

Нельзя использовать операторы DDL ('DROP TABLE NOMBRE;' в этом случае) внутри блока PL/SQL. Чтобы выполнить оператор DDL внутри блока PL/SQL, вам придется использовать динамический SQL: 'execute instant 'DROP TABLE NOMBRE';' например. –

ответ

11

вам нужно изменить процедуру:

CREATE OR REPLACE PROCEDURE SP_VEXISTABLA(NOMBRE IN VARCHAR2) 
IS 
CANTIDAD NUMBER(3); 
BEGIN 
SELECT COUNT(*) INTO CANTIDAD FROM USER_TABLES WHERE TABLE_NAME = NOMBRE; 
IF (CANTIDAD >0) THEN 
    execute immediate 'DROP TABLE ' || NOMBRE; 
END IF; 
END; 
+0

DazzaL @ Я использую ту же хранимую процедуру и получаю ошибку. Процедура BEGIN SP_VEXISTABLA ('xyz'); КОНЕЦ; * ОШИБКА в строке 1: ОР-06550: строка 1, столбец 7: PLS-00103: Встречающийся символ «ПРОЦЕДУРА», когда ожидает один из следующего: (начинают случай объявить выход для Goto, если моды петли null pragma raise return select update while with <идентификатор> << продолжить закрыть текущее удаление выборка блокировка вставка открыть откат сохранить точку установки sql выполнить commit forall merge pipe purge Символ «ПРОЦЕДУРА» был проигнорирован. –

1

Это не позволит вам использовать непосредственно DDL statament внутри процедуры PLSQL. Чтобы выполнить DDL, вам необходимо использовать оператор Execute Immediate.

Используйте код ниже:

CREATE OR REPLACE PROCEDURE SP_VEXISTABLA(Table_nameIN VARCHAR2) 
IS 
CANTIDAD integer; 
BEGIN 
    SELECT COUNT(*) INTO CANTIDAD FROM USER_TABLES WHERE TABLE_NAME = Table_name; 
    DBMS_OUTPUT.PUT_LINE(CANTIDAD); 
    IF (CANTIDAD >0) THEN 
     DBMS_OUTPUT.PUT_LINE(Table_name); 
     execute immediate 'DROP TABLE ' || Table_name; 
    END IF; 
END; 
Смежные вопросы