7

重複の可能性:
Oracle: テーブルが存在する場合 テーブルが存在する
場合はドロップする

このプロシージャを作成しようとしていますが、エラーが発生します。

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" が検出されました: ( begin case declare exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock挿入 オープン ロールバック セーブポイント セット sql 実行 コミット forall マージ パイプ パージ。

私が間違っていることを知っていますか?

4

3 に答える 3

19

手順を次のように変更する必要があります。

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;
于 2013-01-28T15:15:38.560 に答える
3

DROP コマンドを使用してプロシージャ内のテーブルを削除することはできません。PL/SQLでDDLコマンドを実行するには、EXECUTE IMMEDIATEを使用する必要があります。

于 2013-01-28T15:13:43.223 に答える
1

PLSQLプロシージャ内でDDLステートメントを直接使用することはできません。Execute ImmediateDDL を実行するにはステートメントを使用する必要があります。

以下のコードを使用します。

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;
于 2013-01-29T03:57:08.180 に答える