PLSQL入门与精通(第25章:利用函数分类统计)

上次说明了SQL调用存储函数的条件,实际上,从SQL中调用存储函数有什么好处呢?
一言以蔽之,从SELECT文中调用存储函数可以说是为了简化复杂的查询(SELECT)。
与DML(INSERT,UPDATE,DELETE)不同,SELECT文一般比较复杂,有时难以写出符合要求的SELECT文。
这时候,如果使用函数的话,有时候可以写出简单的SELECT文。

例如,有以下场景:
销售表中有销售额,需要按某种“区分”(区分指的是某种销售类别或者销售内容)进行销售额合计。
但是销售表上又没有“区分”这一列,
这时,直接用一个SELECT语句进行分类汇总是很难的,可以考虑使用明示游标处理,逐行判断和统计。

请看具体例子。

例如有以下销售表。
SQL>SELECT * FROM 销售表;

销售编号 销售日 顾客名 产品名称 部门 金额
‘----------------------------------------------------------------------
1 2020-06-01 顾客1 电视 部门1 100
2 2020-06-02 顾客1 电视 部门2 102
3 2020-06-03 顾客2 电视 部门1 105
4 2020-06-04 顾客3 电视 部门2 107
5 2020-06-05 顾客1 收音机 部门1 108
6 2020-06-05 顾客1 收音机 部门2 109
7 2020-06-06 其他顾客 收音机 部门1 110
8 2020-06-07 顾客4 收音机 部门2 111

选择了8行。

这里,销售分类决定如下。(内容无意义)

・部门1
顾客1⇒销售分类“A”
顾客2⇒销售分类“B”
除此之外的销售额⇒销售分类“C”

・部门2
顾客1⇒销售分类“B”
顾客2⇒销售分类“A”
除此之外的销售额⇒销售分类“C”

SQL CREATE OR REPLACE FUCTION FUNK_销售分类
2 (P_部门 IN 销售表.部门%TYPE,
3 P_客户名 IN 销售表.客户名%TYPE)
4 RETURN VARCHAR2
5 IS
6 BEGIN
7 IF P_事业所=‘部门1’ THEN
8 IF P_顾客名=‘顾客1’ THEN
9 RETURN ‘A’;
10 ELSIF P_顾客名=’顾客2’ THEN
11 RETURN ‘B’;
12 ELSE
13 RETURN ‘C’;
14 END IF;
15 ELSIF P_部门=‘部门2’ THEN
16 IF P_顾客名=‘顾客1’ THEN
17 RETURN ‘B’;
18 ELSIF P_顾客名=’顾客2’ THEN
19 RETURN ‘A’;
20 ELSE
21 RETURN ‘C’;
22 END IF;
23 ELSE
24 RETURN ‘C’;
25 END IF;
26 END;
27 /

功能已创建。

而且如果使用这个存储功能的话,每个销售分类的统计会很简单。

SQL>SELECT FUNK_销售分类(部门、顾客名)、SUM(金额)FROM销售表
2 GROUP BY FUNK_销售分类(部门,顾客名);

FUNK销售分类(事业所、顾客名)SUM(金额)
'----------------------------------------
A xxx
B xxx
C xxx

这样就很简单的按照区分把金额统计出来了。

最后请注意一点:
使用存储函数确实可以使查询变得简单,但是查询的性能并不好。
只是将查询的复杂度隐藏在函数中,表面上简单,处理复杂度并没有变。

本次到止为止。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/114236208
今日推荐