开发中经常涉及到需要撰写存储过程处理一些业务需求,今天在撰写一个存储过程时,需要在存储过程中判断一张临时表是否存在,存在则删除,然后重新使用

 【CREATE TABLEtableNameASSELECTFROMotherTable】

的语句创建;不存在则直接创建。

在此逻辑处理中,遇到了一下几点问题,在此分享的同时也提醒自己,顺便做个工作笔记:

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语句'的单引号之内