Oracle插入之 insert all、insert first

利用insert first/all使得INSERT语句可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表中。

insert first:对于每一行数据,只插入到第一个when条件成立的表,不继续检查其他条件。

insert all :对于每一行数据,对每一个when条件都进行检查,如果满足条件就执行插入操作。

create table edw_int
(
  agmt_no         varchar2(40 byte)             not null,
  agmt_sub_no     varchar2(4 byte)              not null,
  need_repay_int  number(22,2),
  curr_period     number(4)                     not null
);
create table edw_int_1
(
  agmt_no         varchar2(40 byte)             not null,
  agmt_sub_no     varchar2(4 byte)              not null,
  need_repay_int  number(22,2),
  curr_period     number(4)                     not null
);
create table edw_int_2
(
  agmt_no         varchar2(40 byte)             not null,
  agmt_sub_no     varchar2(4 byte)              not null,
  need_repay_int  number(22,2),
  curr_period     number(4)                     not null
);  
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20003874', '2104', 3126.5, 7);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20003874', '2104', 3290.76, 6);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20003874', '2104', 3454.06, 5);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20003874', '2104', 3616.41, 4);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values  ('20017143', '2104', 2350.86, 0);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20017143', '2104', 3566.55, 0);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20018273', '2104', 1639.46, 0);
insert into edw_int  (agmt_no, agmt_sub_no, need_repay_int, curr_period) values ('20018273', '2104', 2080.49, 0);
COMMIT;

insert all示例

insert all
      into edw_int_1 (agmt_no, agmt_sub_no, need_repay_int, curr_period) values (agmt_no, agmt_sub_no, need_repay_int, curr_period)
      into edw_int_2 (agmt_no, agmt_sub_no, curr_period) values (agmt_no, '1234', curr_period)
   select agmt_no, agmt_sub_no, need_repay_int, curr_period from edw_int;
commit;

删除完数据继续测试 加上条件when then else

truncate table edw_int_1;

truncate table edw_int_2;

insert all
      when curr_period = 0 then
         into edw_int_1 (agmt_no, agmt_sub_no, need_repay_int, curr_period) values (agmt_no, agmt_sub_no, need_repay_int, curr_period)
      else
         into edw_int_2 (agmt_no, agmt_sub_no, need_repay_int, curr_period) values (agmt_no, agmt_sub_no, need_repay_int, curr_period)
   select agmt_no, agmt_sub_no, need_repay_int, curr_period from edw_int;
commit;

删除数据测试insert first

insert first
     when curr_period = 0 then
        into edw_int_1 (agmt_no, agmt_sub_no, need_repay_int, curr_period) values (agmt_no, agmt_sub_no, need_repay_int, curr_period)
     when agmt_sub_no = '2104' then
        into edw_int_2 (agmt_no, agmt_sub_no, need_repay_int, curr_period) values (agmt_no, agmt_sub_no, need_repay_int, curr_period)
  select agmt_no, agmt_sub_no, need_repay_int, curr_period from edw_int;
commit;
时间: 2024-11-09 03:18:11

Oracle插入之 insert all、insert first的相关文章

Oracle多表插入语句Insert All/Insert First

关于INSERT ALL和INSERT FIRST 一.无条件 INSERT ALL 二.条件 INSERT ALL 三.条件 INSERT FIRST Insert-Select 使用Insert Select实现同时向多个表插入记录 一.无条件 INSERT ALL --------------------------------------------------------------------------------------------- INSERT ALL insert_in

Oracle一个事务中的Insert和Update执行顺序

今天碰到了一个奇怪的问题,是关于Oracle一个事务中的Insert和Update语句的执行顺序的问题. 首先详细说明下整个过程: 有三张表:A,B,C,Java代码中有一段代码是先在表A中插入一条数据,然后再更新表B的两个字段,更新的两个字段是特定值.并且插入和更新在一个事务中. 有个需求需要在表A添加一个Insert的行级触发器,在触发器里,插入表A一行记录后去表B查看更新的两个字段是否满足特定条件, 如果表B的两个字段同时等于特定值,则把表A和表B的数据整合下放到表C.触发器的初衷就是这样

简单的sqlserver批量插入数据easy batch insert data in sqlserver

DECLARE @pid INT,@name NVARCHAR(50),@level INT,@i INT,@column2 INT SET @pid=0 SET @name ='first' SET @level =5 SET @column2=0 SET @i=0 WHILE @i<30 --30为你要执行插入的次数 BEGIN INSERT INTO table_name ( pid, name,level, column2) VALUES ( @pid, @name,@level,@co

jdbc:mysql和oracle插入一条数据返回主键

package org.sin.common.dao; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import or

oracle插入字符串数据时,字符串中有&#39;单引号

使用insert into(field1,field2...) values('val1','val2'...)时,若值中有单引号时会报错. 处理方法:判断一下val1,val2中是否含有单引号,若含单引号,则将单引号'替换成两个单引号''. 将字段与字段值组织到一个HashTable中,再抽象出一个组织sql语句的函数getSqlByHashTable(): HashTable ht =new HashTable(); ht.add(field1,val1); ht.add(field2,va

oracle 插入数据前判断表中是否存储重复数据

有时候用oracle的数据库,插入数据的时候需要判断一下该条数据是否已经存在. 我们的第一思路如下,首先执行下面这个sql: select count(*) isExists from t_test_lll: 然后判断isExists等于0与否,如果等于0,则执行insert. 上面这样写,也可以,但是多写很多代码,不利于后期维护. 其实oracle可以内置在insert语句中进行判断,如下sql: insert when (not exists (select 1 from t_test_ll

Oracle 插入数据效率对比

oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 1 insert into LLB_BASIC_USER_D_TEMP_TEST 2 select t.serv_id, 3 t.phone_id, 4 a1.loc_imei t, 5 region_code, 6 t.county_code, 7 t.payment_mode_cd, 8 t.plan_id, 9 t.productflux, 10 t.al

mybatis在oracle插入对象后返回主键值

在mybatis中默认插入一条记录后,返回值为插入记录的条数. 现在想获取插入记录后,当前被插入的记录的主键值,需在insert方法中添加如下代码: <insert id="insert" parameterType="cn.com.pm.ppm.model.UserInfo" >   <selectKey resultType="java.math.BigDecimal" order="BEFORE" ke

oracle插入数据问题

这个是我的表结构:desc T_STUDENT;Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- stu_id       VARCHAR2(10)                           stu_name     VARCHAR2(40)                           stu_password VARCH