开发中经常涉及到需要撰写存储过程处理一些业务需求,今天在撰写一个存储过程时,需要在存储过程中判断一张临时表是否存在,存在则删除,然后重新使用
【CREATE TABLEtableNameASSELECT* FROMotherTable】
的语句创建;不存在则直接创建。
在此逻辑处理中,遇到了一下几点问题,在此分享的同时也提醒自己,顺便做个工作笔记:
1.存储过程中删表不能使用DDL语句直接操作,即不能使用:DROP TABLE tableName ,使用此语 句会报编译错误,也不能顺利执行;
而要使用:EXECUTE IMMEDIATE ' DROP TABLE tableName '
2.同样不能使用【CREATE TABLE tableName AS SELECT * FROM otherTable】方式创建表,也是会报编译错误,也是要使用:EXECUTE IMMEDIATE ' CREATE TABLE tableName AS SELECT * FROM otherTable'
下面是我撰写存储过程关于这段逻辑的一个伪代码:
CREATE OR REPLACE PROCEDURE procedureName IS
DECLARE
falg NUMBER; --定义标识变量
BEGIN
SELECT COUNT(1)
INTO falg
FROM USER_TABLES
WHERE TABLE_NAME = UPPER('tableName'); --根据表名查询是否存在此表名的表记录并赋值给标识变量
IF falg > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE tableName'; --执行删除此表
END IF;
EXECUTE IMMEDIATE ' CREATE TABLE tableName ( id NUMBER(20) not null,字段1 NUMBER(20) not null,字段2 VARCHAR2(18) not null, 字段3 DATE ...字段N 类型, constraint tableName_pk primary key(id))';
--或单引号内写入查询建表语句:CREATE TABLE tableName AS SELECT * FROM otherTableEND procedureName;
END procedureName;
个人总结:总的来说,存储过程中使用DDL语句需要写在:EXECUTE IMMEDIATE 'DDL语句'的单引号之内