Oracle存儲過程建表、刪表小積累

開發中經常涉及到需要撰寫存儲過程處理一些業務需求,今天在撰寫一個存儲過程時,需要在存儲過程中判斷一張臨時表是否存在,存在則刪除,然後重新使用

 【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語句'的單引號之內

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章