1. 程式人生 > >Oracle 批量插入sql

Oracle 批量插入sql

oracle9i版本以後

1 無條件的 INSERT ALL

insert all  
    into test1 (empno,ename) values(empno,ename)  
    into test1(ename,sal) values(ename,sal)  
    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。

下面的方法同上面的語句:

INSERT INTO CM_NOTICE_CONTROL_SETTINGS  (OPERATE_USERID, NOTICE_SENDING_FLAG ,CREATORID)

      SELECT '11','YYYYYY','11' FROM DUAL

      UNION ALL SELECT

'22','YYYYY','22' FROM DUAL

      UNION ALL SELECT '33','YYYYY','33' FROM DUAL

2 有條件的INSERT ALL語句

(對於每一行資料,對每一個when條件都進行檢查,如果滿足條件就執行插入操作)

   -- 有條件的INSERT ALL語句  
    insert all  
    when sal>1000 then  
    into test1 (empno,sal,mgr) values (empno,sal,mgr)   
    when comm<500 then  
    into test1 (empno,comm,mgr) values(empno,comm,mgr)  
    select empno,sal,mgr,comm   
    from emp;  

3 有條件的 FIRST INSERT語句

(對於每一行資料,只插入到第一個when條件成立的表,不繼續檢查其他條件)

-- 有條件的 FIRST INSERT語句  
-- 對於每一行資料,只插入到第一個when條件成立的表,不繼續檢查其他條件。  
insert first  
    when sal>1000 then  
    into test1 (empno,sal,mgr) values (empno,sal,mgr)   
    when comm<500 then  
    into test1 (empno,comm,mgr) values(empno,comm,mgr)  
    select empno,sal,mgr,comm   
    from emp;  

INSERT ALL 和INSERT FIRST對比

SQL> -- 有條件的INSERT ALL語句  
 insert all  
      when sal>1000 then  
     into test1 (empno,sal,mgr) values (empno,sal,mgr)  
     when comm<500 then  
     into test1 (empno,comm,mgr) values(empno,comm,mgr)  
     select empno,sal,mgr,comm  
     from emp;  
  
已建立14行。  
  
SQL> -- 有條件的 FIRST INSERT語句  
SQL> -- 對於每一行資料,只插入到第一個when條件成立的表,不繼續檢查其他條件。  
 insert first  
     when sal>1000 then  
     into test1 (empno,sal,mgr) values (empno,sal,mgr)  
     when comm<500 then  
     into test1 (empno,comm,mgr) values(empno,comm,mgr)  
     select empno,sal,mgr,comm  
     from emp;  
  
已建立12行。  

4 旋轉INSERT (行轉列插入)

對查出的每條資料都進行插入操作

-- 旋轉INSERT (行轉列插入)  
insert all    
    into sales_info values(employee_id,week_id,sales_mon)    
    into sales_info values(employee_id,week_id,sales_tue)    
    into sales_info values(employee_id,week_id,sales_wed)    
    into sales_info values(employee_id,week_id,sales_thur)    
    into sales_info values(employee_id,week_id,sales_fri)    
    select employee_id,week_id,sales_mon,sales_tue,    
    sales_wed,sales_thur,sales_fri 
    from sales_source_data; 

效果:

--原表  
select * from sales_source_data;    
EMPLOYEE_ID    WEEK_ID  SALES_MON  SALES_TUE  SALES_WED SALES_THUR  SALES_FRI    
----------- ---------- ---------- ---------- ---------- ---------- ----------    
        176          6       2000       3000       4000       5000       6000    
-- 轉存後的表  
select * from sales_info;    
EMPLOYEE_ID       WEEK      SALES    
----------- ---------- ----------    
        176          6       2000    
        176          6       3000    
        176          6       4000    
        176          6       5000    
        176          6       6000 

 例子:

insert all

into CM_NOTICE_CONTROL_SETTINGS (OPERATE_USERID, NOTICE_SENDING_FLAG ,CREATORID) values(USERID,'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY',USERID)

select distinct USERID from CM_LOGINUSERINFO where USERID is not null;
//取前5條記錄插入

insert all

into CM_NOTICE_CONTROL_SETTINGS (OPERATE_USERID, NOTICE_SENDING_FLAG ,CREATORID)

values(USERID,'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY',USERID)

select *

from (

     select distinct USERID

     from CM_LOGINUSERINFO

     where USERID is not null

     )

where rownum<=5;
//取6-10條記錄插入

insert all

into CM_NOTICE_CONTROL_SETTINGS (OPERATE_USERID, NOTICE_SENDING_FLAG ,CREATORID)

values(USERID,'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY',USERID)

select USERID

from(

  select rownum as no,USERID

  from (

       select distinct USERID

       from CM_LOGINUSERINFO

       where USERID is not null

       )

  where rownum<=10

   )

where no>=6 and no<=10;