Oracle SQL和PL/SQL多表插入技巧

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

订单表 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实现的例子,是不是一目了然?

insert first
   when tot_amount < 10000 then
   into small_cust_test
   when tot_amount >=10000 and tot_amount <50000 then
   into med_cust_test
   else
   into big_cust_test
   select cust_id,sum(amount) as tot_amount
   from order_test
   group by cust_id;
FIRST:表示第一WHEN条件符合后就跳到下条记录,不再判断其它WHEN条件。
ALL  :表示不管前面的WHEN条件是否已经满足,后续的条件都会被判断,可能会一次出现多表同时插入。

示例完整代码:

SQL> create table order_test (order_id number, cust_id number, amount number); 

Table created 

SQL> create table small_cust_test (cust_id number, tot_amt number); 

Table created 

SQL> create table med_cust_test (cust_id number, tot_amt number); 

Table created 

SQL> create table big_cust_test (cust_id number, tot_amt number); 

Table created 

SQL> select * from order_test order by order_id; 

  ORDER_ID    CUST_ID     AMOUNT
---------- ---------- ----------
         1       1001       2060
         2       1002      20060
         3       1003      30060
         4       1004      50060
         5       1004      10060
         6       1005     100060
         7       1001       2000
         8       1001       2050 

8 rows selected
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
SQL> select cust_id, sum(amount) as tot_amt from order_test group by cust_id; 

   CUST_ID    TOT_AMT
---------- ----------
      1003      30060
      1001       6110
      1002      20060
      1004      60120
      1005     100060 

SQL> select * from small_cust_test; 

   CUST_ID    TOT_AMT
---------- ---------- 

SQL> select * from med_cust_test; 

   CUST_ID    TOT_AMT
---------- ---------- 

SQL> select * from big_cust_test; 

   CUST_ID    TOT_AMT
---------- ---------- 

SQL> 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; 

5 rows inserted 

SQL> select * from small_cust_test; 

   CUST_ID    TOT_AMT
---------- ----------
      1001       6110 

SQL> select * from med_cust_test; 

   CUST_ID    TOT_AMT
---------- ----------
      1003      30060
      1002      20060 

SQL> select * from big_cust_test; 

   CUST_ID    TOT_AMT
---------- ----------
      1004      60120
      1005     100060 

SQL>

本文出自 “力量来源于赤诚的爱!” 博客,请务必保留此出处http://stevex.blog.51cto.com/4300375/1042856

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, select
, number
, pl sql test调式
, 消费表
, select多表sql
, 客户
多表查询技巧
oracle pl sql、oracle pl sql实战、oracle pl sql攻略、精通oracle pl sql、pl sql连接oracle,以便于您获取更多的相关知识。

时间: 2024-10-28 09:52:31

Oracle SQL和PL/SQL多表插入技巧的相关文章

Oracle教程之pl/sql简介_oracle

本文实例讲述了Oracle的pl/sql.分享给大家供大家参考,具体如下: 一.pl/sql 是什么 pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展. pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大. 二.为什么要学pl/sql 1.提高应用程序的运行性能 2.模块化的设计思想(分页的过程,订单的过程,转账的过程..) 3.减少网络传输量 4.提高

Oracle Application Server PL/SQL 未授权的 SQL 查询执行。

问题描述 Oracle Application Server PL/SQL 未授权的 SQL 查询执行. AppScan漏洞扫描,Oracle Application Server PL/SQL 未授权的 SQL 查询执行.这样的漏洞怎么解决呢. 解决方案 你这个问题是不是没有给SQL授权.http://kb.cnblogs.com/page/100144/ 这个链接你点击进去看看对你有没有帮助.

oracle数据库用pl/sql中的cmd窗口写语句的时候

问题描述 oracle数据库用pl/sql中的cmd窗口写语句的时候 如图所示,如果想回去把第二行的代码删除怎么办?我用删除键根本没有用 解决方案 3 : SQL>del 2 SQL>run 可以去找找SQL/PLUS缓冲区当前命令操作相关资料 解决方案二: SQL>del 2 SQL>run 可以去找找SQL/PLUS缓冲区当前命令操作相关资料

ORA-06502 assigning values from SQL to PL/SQL variables

    最近SQL查询返回的结果给PL/SQL变量出现ORA-06502错误.这个错误的描述是ORA-06502: PL/SQL: numeric or value error: character string buffer too small. 显而易见的是字符变量定义的长度不够,加到20,到100,继续06502,汗,咋回事呢? 1.问题描述 --出现问题是在一个package里,有两个参数游标,一个父游标,一个子游标,当父游标输出的结果传递值给子游标时提示值太大 --父游标原sql语句较

PL/SQL --&amp;gt; PL/SQL记录

--======================= -- PL/SQL --> PL/SQL记录 --=======================       PL/SQL记录有着类似于表的数据结构,是一个或多个字段且拥有数据类型的集合体.定义了PL/SQL记录类型之后,可以定义PL/SQL记录变 量.声明一个PL/SQL记录变量相当于定义了多个标量变量,简化了变量的声明,从而大大节省了内存资源.多用于简化单行多列的数据处理.     一.定义PL/SQL记录     1.直接定义PL/SQL

SQL,PL/SQL 数据类型一览表

The following is a list of datatypes available in Oracle. Character Datatypes The following are the Character Datatypes in Oracle: Data Type Syntax Oracle 9i Oracle 10g Oracle 11g Explanation(if applicable) char(size) Maximum size of 2000 bytes. Maxi

Oracle中在pl/sql developer修改表的两种方式

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住. 二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t.

Oracle中在pl/sql developer修改表的两种语句

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住. 二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t. 该种方式也可以修改多表联合查询的情况,现有table1和ta

Oracle中在pl/sql developer修改表的2种方法_oracle

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住.   二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t.