在Oracle數據庫中,dual是Oracle中的一個僞表,在Oracle數據庫中的select語句的語法爲:sql
SELECT column_1, column_2, ... FROM table_name;
即在使用select語句時,若是沒有表名,就沒辦法執行查詢,而當咱們想查看當前時間sysdate
或者想計算出一個表達式例如2+3
的值的時候,若是沒有表是沒法執行操做的,故Oracle數據庫出現了僞表dual的概念。數據庫
--查詢當前時間,若是後面不跟表,則沒法查詢,例如 SELECT sysdate ; --正確寫法 SELECT sysdate FROM daul;
總結:dual表就是oracle與數據字典自動建立的一張表,這張表是一個單行單列的表,這個表只有1列:DUMMY,數據類型爲VERCHAR2(1),dual表中只有一個數據'X', Oracle有內部邏輯保證dual表中永遠只有一條數據。dual表主要是用來選擇系統變量或是求一個表達式的值。oracle
MERGE INTO Student S1 USING (SELECT '1001' as sid,'張三' as name,'95' as grade FROM dual) S2 on (S1.sid=S2.sid) WHEN MATCHED THEN UPDATE SET S1.name=S2.name,S1.grade=S2.grade WHEN NOT MATCHED THEN INSERT (S1.sid, S1.name,S1.grade) VALUES (S2.sid, S2.name,S2.grade ); --具體解釋 --USING 這裏是咱們須要跟數據庫進行比較的數據,這裏傳入的數據爲('1001','張三','95'),爲了保證USING後面的select有數據,在這裏使用了dual表。 --on後面是咱們要比較的條件 --WHEN MATCHED THEN 當存在學號爲‘1001’這樣的數據時,選擇將數據庫中的這條數據更新 --WHEN NOT MATCHED THEN 當不存在這條數據時,將這條數據插入到數據庫中。
原理:在使用using 時搜出來的結果逐條與on條件匹配,而後決定是update仍是Insert。 當USING後面的sql沒有查詢到數據的時候,Merge Into語句是不會執行update和Insert操做的。所以須要保證USING 後面的SELECT有數據,可使用DUAL表做爲USING後的表。測試
注意點:在實際項目中,using表後邊傳入的數據,能夠是前臺傳過來的對象,例如前臺傳過來Student(SID:'1001',NAME:'張三',GRADE:'95');這是能夠這樣:code
MERGE INTO Student S1 USING (SELECT #{SID,jdbcType=VARCHAR} sid FROM dual) S2 on (S1.sid=S2.sid) WHEN MATCHED THEN UPDATE SET S1.name= #{NAME,jdbcType=VARCHAR},S1.grade=#{GRADE,jdbcType=VARCHAR} WHEN NOT MATCHED THEN INSERT sid,name,grade) VALUES (#{SID,jdbcType=VARCHAR} #{NAME,jdbcType=VARCHAR},#{GRADE,jdbcType=VARCHAR}) --mabatis最後語句不能以‘;’結尾,不然會報 ‘無效字符’ 錯誤。
原創不易,歡迎轉載,轉載時請註明出處,謝謝!
做者:瀟~蕭下
原文連接:http://www.javashuo.com/article/p-heyrwuyx-gx.htmlhtm