Oracle存在則修改,不存在插入記錄____Oracle

來源:互聯網
上載者:User

    首先是建立表有著細微的區別,判斷一個表是否存在,習慣了MS SQL的OBJECT_ID('對象表','物件類型')的童鞋們,你們是不是想到Oracle中也應該有這樣的功能呢。遺憾了,Oracle中沒有此類函數來判斷一個表是否存在,那就只能通過委婉的方式來實現,MS SQL中有類似於 Select Name From SysObjects Where XType='U'這樣的資料庫表,那對應的Oracle中就有了select  * from user_tables,通過查詢系統資料表,判斷這個表在資料庫中是否存在,如果存在就刪除,然後再建立。

declare num number;   begin    select count(1) into num from user_tables where table_name='ACCOUNT';       if num > 0 then         dbms_output.put_line('存在!');      execute immediate 'drop table ACCOUNT ';     end if;         execute immediate 'create table Account                        (                                AccountID nvarchar2(50) primary key,                                AccountName nvarchar2(50)                         )';        dbms_output.put_line('成功建立表!');end; 

與MS SQL建立一個表對比,是不是還是有一些顯微的差異呢。答案當然是肯定的。
  這個示範是前奏,現在來開始我們今天的主題,在Oracle中,表建立成功了,現在我要往這個表中插入資料,如果新插入的資料在表中存在則修改,不存在則插入,我在網上一搜,驚奇的發現Oracle中的exists()函數是判斷兩個資料集合的交集是否存在,與MS SQL有一定的區別。這樣的對比雖然會顯的不專業,但是我還是有對比和發表自己觀點自由。於是我在網上瘋狂的搜尋Oracle在這個問題上的解決方案,總結了以下幾種方案,以供大家選擇:

1:隱式遊標法 SQL%NOTFOUND   SQL%FOUND

SQL%NOTFOUND 是SQL中的一個隱式遊標,在增刪查改的時候自動開啟,如果有至少有一條記錄受影響,都會返回false,這就就巧妙的構思出了第一種解決方案:

beginupdate account set AccountName = '修改-a' where AccountID = '5';IF SQL%NOTFOUND THEN   insert into account(AccountID,AccountName) values('5','添加-b');END IF;end;

先根據唯一ID到資料表中修改一條記錄,如果這條記錄在表中存在,則修改,並且SQL%NOTFOUND返回false。如果修改的記錄不存在,SQL%NOTFOUND返回true,並且執行插入語句。

2:異常法 DUP_VAL_ON_INDEX

當Oracle語句執行時,發生了異常exception進行處理

begininsert into account(AccountID,AccountName) values('6','添加-b');exception when DUP_VAL_ON_INDEX then begin update account set AccountName = '修改-b' where AccountID = '6';end;end;

當往表中插入一條資料,因為表中有主鍵約束,如果插入的資料在表中已經存在,則會拋出異常,在異常拋出後進行修改。

3:虛擬表法  dual

dual是一個虛擬表,用來構成select的文法規則,oracle保證dual裡面永遠只有一條記錄。

declare t_count number;beginselect count(*) into t_count from dual where exists(select 1 from account where AccountID='11');if t_count< 1 then  dbms_output.put_line('添加');  insert into account(AccountID,AccountName) values('11','添加-11');else  dbms_output.put_line('修改');  update account set AccountName = '修改-11' where AccountID = '11';  end if;end;

先聲明一個變數t_count,表dual表的值賦給t_count,如果這個值小於1,表示記錄不存在,進行插入操作,反之,存在就進行修改操作。

4:no_data_found法

先尋找要插入的記錄是否存在,存在則修改,不存在則插入。具體的實現如下:

declare t_cols number;beginselect AccountName into t_cols from account where AccountID = '8';exception when no_data_found then begin    --dbms_output.put_line('添加');   insert into account(AccountID,AccountName) values('8','添加-8');end;when others then   begin    --dbms_output.put_line('修改');    update account set AccountName = '修改-8' where AccountID = '8';end;end;

5:merge法

先來看一下merge的文法,

MERGE INTO table_name alias1   USING (table|view|sub_query) alias2  ON (join condition)   WHEN MATCHED THEN       UPDATE table_name SET col1 = col_val1WHEN NOT MATCHED THEN       INSERT (column_list) VALUES (column_values);

看了merge的文法後,依葫蘆畫瓢對於我這種抄襲的人來說已經不是什麼難事了。 

merge into Account t1  using (select '3' AccountID,'肖文博' AccountName from dual) t2  on (t1.AccountID = t2.AccountID)  when matched then       update set t1.AccountName = t2.AccountName
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.