假如一个在线电子商务系统,我们现在需要根据订单表体现的消费金额将客户简单分为大中小三类并分别插入到三张表中.

订单表 order (order_id number, cust_id number, amount number);
小客户表 small_cust (cust_id number, tot_amt number);
中客户表 med_cust (cust_id number, tot_amt number);
大客户表 big_cust (cust_id number, tot_amt number);
 
如果总消费金额小于10000, 则归入小客户;
如果总消费金额大于10000并小于50000,则归入中客户;
如果总消费金额大于50000,则归入大客户;
 
要实现这个需求,如果我们不知道INSERT ALL/FIRST 的用法,可能会用一段PL/SQL遍历查询订单表返回的游标,然后逐条记录判断客户消费总额来决定插入哪个表,需要分别写三个INSERT语句,这样也可以达到目的,但远没有使用INSERT FIRST简洁和高效。
 
下面是用INSERT FIRST实现的例子,是不是一目了然?
  1. insert first  
  2.     when tot_amount < 10000 then  
  3.     into small_cust_test  
  4.     when tot_amount >=10000 and tot_amount <50000 then  
  5.     into med_cust_test  
  6.     else  
  7.     into big_cust_test  
  8.     select cust_id,sum(amount) as tot_amount   
  9.     from order_test  
  10.     group by cust_id;  
 
 
  1. FIRST:表示第一WHEN条件符合后就跳到下条记录,不再判断其它WHEN条件。 
  2. ALL  :表示不管前面的WHEN条件是否已经满足,后续的条件都会被判断,可能会一次出现多表同时插入。 
 
示例完整代码: 
  1. SQL> create table order_test (order_id number, cust_id number, amount number); 
  2.   
  3. Table created 
  4.   
  5. SQL> create table small_cust_test (cust_id number, tot_amt number); 
  6.   
  7. Table created 
  8.   
  9. SQL> create table med_cust_test (cust_id number, tot_amt number); 
  10.   
  11. Table created 
  12.   
  13. SQL> create table big_cust_test (cust_id number, tot_amt number); 
  14.   
  15. Table created 
  16.   
  17. SQL> select * from order_test order by order_id; 
  18.   
  19.   ORDER_ID    CUST_ID     AMOUNT 
  20. ---------- ---------- ---------- 
  21.          1       1001       2060 
  22.          2       1002      20060 
  23.          3       1003      30060 
  24.          4       1004      50060 
  25.          5       1004      10060 
  26.          6       1005     100060 
  27.          7       1001       2000 
  28.          8       1001       2050 
  29.   
  30. 8 rows selected 
  31.   
  32. SQL> select cust_id, sum(amount) as tot_amt from order_test group by cust_id; 
  33.   
  34.    CUST_ID    TOT_AMT 
  35. ---------- ---------- 
  36.       1003      30060 
  37.       1001       6110 
  38.       1002      20060 
  39.       1004      60120 
  40.       1005     100060 
  41.   
  42. SQL> select * from small_cust_test; 
  43.   
  44.    CUST_ID    TOT_AMT 
  45. ---------- ---------- 
  46.   
  47. SQL> select * from med_cust_test; 
  48.   
  49.    CUST_ID    TOT_AMT 
  50. ---------- ---------- 
  51.   
  52. SQL> select * from big_cust_test; 
  53.   
  54.    CUST_ID    TOT_AMT 
  55. ---------- ---------- 
  56.   
  57. SQL> insert first 
  58.   2  when tot_amount < 10000 then 
  59.   3  into small_cust_test 
  60.   4  when tot_amount >=10000 and tot_amount <50000 then 
  61.   5  into med_cust_test 
  62.   6  else 
  63.   7  into big_cust_test 
  64.   8  select cust_id,sum(amount) as tot_amount  
  65.   9  from order_test 
  66.  10  group by cust_id; 
  67.   
  68. 5 rows inserted 
  69.   
  70. SQL> select * from small_cust_test; 
  71.   
  72.    CUST_ID    TOT_AMT 
  73. ---------- ---------- 
  74.       1001       6110 
  75.   
  76. SQL> select * from med_cust_test; 
  77.   
  78.    CUST_ID    TOT_AMT 
  79. ---------- ---------- 
  80.       1003      30060 
  81.       1002      20060 
  82.   
  83. SQL> select * from big_cust_test; 
  84.   
  85.    CUST_ID    TOT_AMT 
  86. ---------- ---------- 
  87.       1004      60120 
  88.       1005     100060 
  89.   
  90. SQL>