2013-01-28 18 views
5

Powiel możliwe:
Oracle: If Table Exists
Drop table if it existsupuść tabeli w procedurze

próbuję tworzyć tę procedurę, ale pojawia się błąd.

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; 

Błąd jest:

Error (8,1): PLS-00103: Napotkano symbol "END", gdy spodziewa się jedną z następujących czynności: (przypadek zadeklarować rozpocząć zjazd dla goto jeżeli pętla mod zerowy Pragma podbicie powrót Wybierz aktualizacja natomiast z < < nadal blisko prąd kasowania sprowadzić wkładka zamka otwarty wycofywania savepoint zestaw sql wykonać commit forall scalić czystkę rury.

Czy wiesz, co robię źle?

+0

Które narzędzie używasz do uruchomienia tego? –

+0

Oracle SQL Developer wersja 3.2.20.09 –

+3

Nie wolno używać instrukcji DDL ('DROP TABLE NOMBRE; w tym przypadku) wewnątrz bloku PL/SQL. Aby wykonać instrukcję DDL wewnątrz bloku PL/SQL, musiałbyś użyć dynamicznego SQL: 'wykonaj natychmiastowo 'DROP TABLE NOMBRE';' na przykład. –

Odpowiedz

11

trzeba by zmienić procedurę:

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 @ Używam tej samej procedury przechowywanej i otrzymuję błąd BEGIN procedure SP_VEXISTABLA ('xyz'); KONIEC; * BŁĄD w linii 1: ORA 06550: wiersz 1, kolumna 7: PLS-00103: Napotkano symbol "Procedura", gdy oczekiwano jednego z następujące: (rozpocząć przypadku stwierdzenie, wyjście Goto jeżeli pętla mod null pragma podnieś return wybierz aktualizację, a przy << kontynuuj zamknij bieżący usuń pobierz wstaw blokadę otwórz przywróć cofnij punkt zapisu set sql wykonaj commit forall merge pipe purge Symbol "PROCEDURA" został zignorowany. –

1

To nie pozwoli użyć bezpośrednio DDL statament wewnątrz procedury PLSQL. Musisz użyć instrukcji Execute Immediate, aby wykonać DDL.

Użyj poniższego kodu:

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; 
Powiązane problemy