我正在尝试创建此过程,但是我收到错误。
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。
你知道我做错了什么吗?
答案 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;