在程序中删除一个表

时间:2013-01-28 14:52:25

标签: oracle plsql oracle11g

  

可能重复:
  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”:(如果使用<< continue,则开始情况声明退出goto if loop mod null pragma raise return select update close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge。

你知道我做错了什么吗?

3 个答案:

答案 0 :(得分:15)

您需要将程序更改为:

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;

答案 1 :(得分:3)

您无法使用DROP命令在过程中DROP表。您需要使用EXECUTE IMMEDIATE在PL / SQL中运行DDL命令。

答案 2 :(得分:1)

它不允许您在PL SQL过程中直接使用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;