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”:(开始 case 声明退出 goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock插入打开的回滚保存点集 sql 执行所有合并管道清除的提交。

你知道我做错了什么吗?

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 命令在过程中 DROP 表。您需要使用 EXECUTE IMMEDIATE 在 PL/SQL 中运行 DDL 命令。

于 2013-01-28T15:13:43.223 回答
1

它不允许您在 PLSQL 过程中直接使用 DDL 状态。您需要使用Execute Immediate语句才能执行 DDL。

使用下面的代码:

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 回答