1. 程式人生 > >Oracle怎麼判斷表是否存在並drop?另有ORA-06550錯誤

Oracle怎麼判斷表是否存在並drop?另有ORA-06550錯誤

(作者:陳玓玏)

一、實現Oracle中判斷表是否存在再drop

通常在更新一個表時,全表更新不如直接刪除表格再重建來得簡單。但是

drop table table_name if exists

這樣的寫法只在MySQL裡能用,在Oracle中會報錯。那麼Oracle中怎麼實現呢?用匿名儲存過程。也就是,沒有create or replace procedure pro_name這句話的儲存過程。

declare 
          num   number; 
   begin 
   --判斷所有的表中是否已經存在這個表
          select count(1
) into num from all_tables where TABLE_NAME = upper('tablename') and OWNER=upper('username');
if num=1 then --如果不存在,則執行drop table execute immediate 'drop table username.tablename'; end if; --新建table,實現全表更新 execute immediate 'create
table username.tablename as select * from table_name2'; end;

不加CREATE PROCEDURE這個頭的儲存過程,就像不加def functionname的函式一樣,就是一個匿名函式,可以不用定義在SQL的procedure模組中,而是直接寫在sql語句中。

二、ORA-06550錯誤

如果匿名塊的內容寫錯了,容易報ORA-06550的錯,報這個錯基本就是儲存過程寫錯了。而為什麼錯,一般都是你沒有按照格式來寫,比如說有部分sql語句寫在了end外面,比如sql語句寫在execute immediate後面卻沒有打括號等等。只需要檢查是否有按照要求來寫即可,檢查是否所有的程式碼都包含在begin和end塊內。

三、ORA-01031: insufficient privileges

儲存過程部分寫錯了還極易報另一個錯,就是ORA-01031: insufficient privileges。也許你本身有許可權,但是儲存過程寫錯了,還是會報這個錯。我碰到的情況是我在if語句結束後連寫了兩個execute immediate語句,在SQL中單句單句執行時就不會報錯,但是在Python中寫SQL語句時就出現了這個錯誤。暫時也沒弄太明白。