oracle中insert all的用法

1、简述

使用insert into语句进行表数据行的插入,但是oracle中有一个更好的实现方式:使用insert all语句。

insert all语句是oracle中用于批量写数据的 。insert all分又为

  1. 无判断条件插入
  2. 有判断条件插入
  3. 有判断条件插入分为
  • Insert all when... 子句

  • insert first when... 子句

2、表和数据准备

--创建表
sqlplus hr/hr@192.168.0.207:1521/PROD01PDB
CREATE TABLE t_students(
   ID   NUMBER(4) primary key,
   NAME VARCHAR2(32),
   sex  VARCHAR2(3)
);
 
--删除表
drop table t_students;
drop table t_students_01;
drop table st_student_02;
 
--向t_students表中插入数据
INSERT INTO t_students(ID, NAME, sex) VALUES(881001, '成都', '女');
INSERT INTO t_students(ID, NAME, sex) VALUES(881002, '深圳', '男');
INSERT INTO t_students(ID, NAME, sex) VALUES(881003, '上海', '女');
commit;
 
HR@192.168.0.207:1521/PROD01PDB> col NAME format a20
HR@192.168.0.207:1521/PROD01PDB> select * from t_students;
        ID   NAME                 SEX
---------- -------------------- ---------
    881001   成都                 女
    881002   深圳                 男
    881003   上海                 女

--复制表结构创建表t_students_01,t_students_02
CREATE TABLE t_students_01 AS SELECT * FROM t_students WHERE 1 = 2;
CREATE TABLE t_students_02 AS SELECT * FROM t_students WHERE 1 = 2;

--查询表
select * from t_students;
select * from t_students_01;
select * from t_students_02;

3、insert all无判断条件插入

将t_students表中的数据插入t_students_01,t_students_02表中可以这样写

insert all
  into t_students_01 values(id,name,sex)
  into t_students_02 values(id,name,sex)
select id,name,sex from t_students;

4、insert all有判断条件插入

有判断条件插入又分为两种:insert all when... 子句和insert first when... 子句

-- insert t_students
INSERT INTO t_students(ID, NAME, sex) VALUES(1004, '广州', '女');
INSERT INTO t_students(ID, NAME, sex) VALUES(1005, '苏州', '男');
commit;

-- insert first
insert first 
  when id>=1004 then
  into t_students_01 values(id,name,sex)
  when id=1005 then
  into t_students_02 values(id,name,sex)
select id,name,sex from t_students;
commit;

-- insert all
insert all 
  when id>=1004 then
  into t_students_01 values(id,name,sex)
  when id=1005 then
  into t_students_02 values(id,name,sex)
select id,name,sex from t_students;
commit;

5、insert all 、insert first 子句的区别

insert first是依据是否满足判断条件来确定先后关系的,当数据满足第一个when判断条件又满足第二个when判断条件,则执行第一个then插入语句,第二个then就不插入。

反之有数据不满足第一个when判断条件且满足第二个when判断条件,则数据会插入第二个条件下对应的表中,这也正是insert first与inset all的区别。

insert all    只要满足条件,就会插入,这个会造成重复插入;

insert first 只要有一个满足条件,后面的条件不再判断,不会造成重复插入。

注意:insert all 不支持序列插入,会导致两边不一致

6、Oracle19c OCP 考试点题目

自己在HR schmea下

select employee_id  emp_id,manger_id MGR,salary SAL from EMPLOYEES;

create table special_sal 
as 
select employee_id  emp_id,salary SAL 
from HR.EMPLOYEES 
where 1=0;

CREATE table sal_history as select employee_id  emp_id,hire_date hiredate,salary SAL 
from EMPLOYEES 
where 1=0;

CREATE table mgr_history as select employee_id  emp_id,manager_id MGR,salary SAL 
from EMPLOYEES 
where 1=0;

insert all 
when SAL > 20000 then
    into special_sal VALUES(emp_id,SAL)
else 
    into sal_history VALUES(emp_id,hiredate,sal) 
    into mgr_history values(emp_id,mgr,sal)
select employee_id  emp_id,hire_date hiredate,salary SAL,manager_id MGR
from EMPLOYEES 
where EMPLOYEE_ID<125;

HR@192.168.0.207:1521/PROD01PDB> select * from special_sal;

    EMP_ID        SAL
---------- ----------
       100      24000

HR@192.168.0.207:1521/PROD01PDB> select * from sal_history;

    EMP_ID HIREDATE                   SAL
---------- ------------------- ----------
       101 2005-09-21 00:00:00      17000
       102 2001-01-13 00:00:00      17000
       103 2006-01-03 00:00:00       9000
       104 2007-05-21 00:00:00       6000
       105 2005-06-25 00:00:00       4800
       106 2006-02-05 00:00:00       4800
       107 2007-02-07 00:00:00       4200
       108 2002-08-17 00:00:00      12008
       109 2002-08-16 00:00:00       9000
       110 2005-09-28 00:00:00       8200
       111 2005-09-30 00:00:00       7700

    EMP_ID HIREDATE                   SAL
---------- ------------------- ----------
       112 2006-03-07 00:00:00       7800
       113 2007-12-07 00:00:00       6900
       114 2002-12-07 00:00:00      11000
       115 2003-05-18 00:00:00       3100
       116 2005-12-24 00:00:00       2900
       117 2005-07-24 00:00:00       2800
       118 2006-11-15 00:00:00       2600
       119 2007-08-10 00:00:00       2500
       120 2004-07-18 00:00:00       8000
       121 2005-04-10 00:00:00       8200
       122 2003-05-01 00:00:00       7900

    EMP_ID HIREDATE                   SAL
---------- ------------------- ----------
       123 2005-10-10 00:00:00       6500
       124 2007-11-16 00:00:00       5800

24 rows selected.

HR@192.168.0.207:1521/PROD01PDB> select * from mgr_history;

    EMP_ID        MGR        SAL
---------- ---------- ----------
       101        100      17000
       102        100      17000
       103        102       9000
       104        103       6000
       105        103       4800
       106        103       4800
       107        103       4200
       108        101      12008
       109        108       9000
       110        108       8200
       111        108       7700

    EMP_ID        MGR        SAL
---------- ---------- ----------
       112        108       7800
       113        108       6900
       114        100      11000
       115        114       3100
       116        114       2900
       117        114       2800
       118        114       2600
       119        114       2500
       120        100       8000
       121        100       8200
       122        100       7900

    EMP_ID        MGR        SAL
---------- ---------- ----------
       123        100       6500
       124        100       5800

24 rows selected.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值