oracle如何insert into 多個values


稍微熟悉Oracle的都知道,如果我們想一條SQL語句向表中插入多個值的話,如果如下語句

INSERT INTO 某表 VALUES(各個值),VALUES(各個值),.....;

這樣會報錯的,因為oracle是不支持這種寫法的,如果多個INSERT INTO VALUEES(各個值);這樣以“;”隔開一同執行也是不行的,oracle也是不支持的。

       不過MySQL這兩種方式都是支持的。在MySQL中還可以使用如下格式的插入語句:

示例:
insert into persons 
(id_p, lastname , firstName, city )
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');

這樣就批量插入數據了

 

       SQL Server也是不支持這兩種寫法的。

       然而,有時我們在開發過程中,如果是用的oracle數據庫的話,有時很需要這種“INSERT INTO  某表” 一次性能插入多個值這樣的功能,但oracle又不支持以上兩種方式那么我們怎么辦?是的可能你很機靈的想到了幾種方法,如存儲過程,或着INSERT INTO 某表 SELECT * FROM 某個表等,不過聲明一下,我們在此不探討這些方法,而且都有一定的局限性,有時我就要插入指定的幾個值,而且一條SQL語句完成,存儲過程的話,萬不得已,建議大家不要使用,當然這個根據情況而定,可以讀讀這個博客存儲過程的優缺點,分析的很詳細。

       那么有沒有其他方法呢?答案是肯定有的,也許熟悉oracle數據庫的可能知道從oracle9i版本以后,可以使用一種方法即:

"INSERT ALL INTO  a表
VALUES(各個值)  
INTO a表 VALUES (其它值) 
INTO a表 VALUES(其它值) .... 再跟一個SELECT 語句"。

后邊跟的SELECT 語句我們可以從虛擬表里查如 SELECT 1 FROM DUAL。注意后邊跟的SELECT語句可以隨意,不過不是把它SELECT出來的內容插入前邊的表里,而是起到前邊的多個數據每次插入多少行的作用,這個多少行是和后邊跟的SELECT語句查出來幾條而定的,如后邊的跟的SELECT 語句查出了15條記錄,那么前邊的"INSERT ALL INTO  a表 VALUES(各個值1)  INTO a表 VALUES (其它值2) INTO a表 VALUES(其它值3)"就會先插入值1對應的各個字段插入15條記錄,然后插入值2各個對應的字段15條記錄,然后插入值3對應的各個字段15條記錄,也就是說有點按列插入的意思。

       我們要的是批量插入多個VALUES這樣的一條記錄,所以后邊的SELECT 語句只要能查出一條記錄就行,建議大家后邊用SELECT 1 FROM DUAL

       下邊看一個例子,一目了然,一看就會用了:

        OK了,我們實現了沒用存儲過程用一條SQL語句完成了向oracle的表中插入多個指定的值。也許你會問這有啥用處,告訴你,如果你在一定情況下用到它,作用就大了,避免了寫復雜而又沒必要寫的存儲過程,避免了執行多個SQL語句多次連接數據庫的開銷,當你知道了學到了,遇到問題用的時候就會明白了,不過鄙人不才,對數據庫了解不深,如果你覺得說的沒有道理或者你有更好的點子或者方法,非常歡迎留言交流,以便您,我,還有大家,共同的學習與成長!

 

出處:http://blog.csdn.net/chenleixing/article/details/45165761/

=======================================================

對於以上方法本人親測如下:

環境:

PL/SQL Developer Version 9.0.0.1601

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

測試用表:jack_20170206_aa

insert all 
 into jack_20170206_aa values('4014033')
 into jack_20170206_aa values('4065304')
 into jack_20170206_aa values('4088136')
 into jack_20170206_aa values('4092405')
select 1 from dual;

因為我的表里只有一個字段,所以就沒有寫出字段名來。

如果插入的不是全部字段,也可以使用下面的形式:

insert into sc(sno,cno) values('95020','1')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM