開發中經常涉及到需要撰寫存儲過程處理一些業務需求,今天在撰寫一個存儲過程時,需要在存儲過程中判斷一張臨時表是否存在,存在則刪除,然後重新使用
【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語句'的單引號之內