-----正文-----
1.1、创建定义数值数组类型:
create or replace type t_number_array is varray(100) of number;
复制
1.2、定义分析函数类型
--包头
create or replace type t_med
as object
(
numbers t_number_array,
--初始化
static function odciaggregateinitialize
(
this in out t_med)
return number,
--遍历 member
function odciaggregateiterate
(
self in out t_med,
value number)
return number,
--结束 member
function odciaggregateterminate
(
self in t_med,
returnvalue out number,
flags in number)
return number,
--合并 member
function odciaggregatemerge
(
self in out t_med,
ctx2 in t_med)
return number
);
复制
--包体
CREATE OR REPLACE TYPE BODY t_med
IS
--初始化
STATIC FUNCTION odciaggregateinitialize
(
this IN OUT t_med)
RETURN NUMBER
IS
BEGIN
this := t_med(t_number_array());
RETURN odciconst.success;
END;
复制
--遍历 MEMBER
FUNCTION odciaggregateiterate
(
SELF IN OUT t_med,
VALUE NUMBER)
RETURN NUMBER
IS
--将元素按倒序,插入到数组中 --新元素将要插入的位置
i_loc1 INTEGER;
--移位时的数组指针
i_loc2 INTEGER;
BEGIN
--空值不处理
IF VALUE IS NULL THEN
RETURN odciconst.success;
END IF;
--假定初始的位置是最后
i_loc1 := self.numbers.count + 1;
FOR i IN 1 .. self.numbers.count
LOOP
IF VALUE > self.numbers(i) THEN
i_loc1 := i;
GOTO outer1;
END IF;
END LOOP;
<<outer1>>
--数组扩充一个元素
self.numbers.extend;
i_loc2 := self.numbers.count;
--插入位置的元素后移
WHILE i_loc2 > i_loc1
LOOP
self.numbers(i_loc2) := self.numbers(i_loc2 - 1);
i_loc2 := i_loc2 - 1;
END LOOP;
--新元素填入
self.numbers(i_loc1) := VALUE;
RETURN odciconst.success;
END;
复制
--结束MEMBER
FUNCTION odciaggregateterminate
(
SELF IN t_med,
returnvalue OUT NUMBER,
flags IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF self.numbers.count = 0 THEN
returnvalue := NULL;
ELSE
IF self.numbers.count MOD 2 = 0 THEN
--元素数量是偶数,返回中间两个元素的平均值
returnvalue := (self.numbers(self.numbers.count / 2 + 1) + self.numbers(self.numbers.count / 2)) / 2;
ELSE
--元素数量是奇数,返回中间元素
returnvalue := self.numbers((self.numbers.count - 1) / 2 + 1);
END IF;
END IF;
RETURN odciconst.success;
END;
复制
--合并 MEMBER
FUNCTION odciaggregatemerge
(
SELF IN OUT t_med,
ctx2 IN t_med)
RETURN NUMBER
IS
BEGIN
NULL;
RETURN odciconst.success;
END;
END;
复制
1.3、定义分析函数
create or replace function f_med(p_value number) return number aggregate using t_med;
复制
创建测试表:
CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL NUMBER(7, 2),
DEPTNO NUMBER(2));
INSERT INTO EMP VALUES (1,'SMITH','CLERK',800,20);
INSERT INTO EMP VALUES (2,'ALLEN','SALESMAN',1600,30);
INSERT INTO EMP VALUES (3,'WARD','SALESMAN',1250,30);
INSERT INTO EMP VALUES (4,'JONES','MANAGER',2975,20);
INSERT INTO EMP VALUES (5,'MARTIN','SALESMAN',1250,30);
INSERT INTO EMP VALUES (6,'BLAKE','MANAGER',2850,30);
INSERT INTO EMP VALUES (7,'CLARK','MANAGER',2850,10);
INSERT INTO EMP VALUES (8,'SCOTT','ANALYST',3000,20);
INSERT INTO EMP VALUES (9,'KING','PRESIDENT',3000,10);
INSERT INTO EMP VALUES (10,'TURNER','SALESMAN',1500,30);
INSERT INTO EMP VALUES (11,'ADAMS','CLERK',1500,20);
COMMIT;
复制
测试一下:
SELECT JOB,SAL,f_med(SAL) over(PARTITION BY JOB) FROM EMP;
复制
>>> THE END <<<
相关推荐
文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
SQLark V3.4 更新 | 百灵说,PG 和春天一起来了!
达梦数据
49次阅读
2025-04-17 10:41:51
达梦数据共享集群在湖北银行绩效考核系统上线
达梦数据
42次阅读
2025-04-23 11:19:07
权威双认达梦实力丨武汉数博会秀创新成果,行业峰会斩获三省殊荣
达梦数据
39次阅读
2025-04-24 09:53:34
达梦数据2024年年度报告正式发布
达梦数据
27次阅读
2025-04-15 09:49:32
全民国家安全教育日|守护数据堡垒 筑牢安全防线
达梦数据
23次阅读
2025-04-15 09:49:33
达梦数据加入“可信数据空间发展伙伴计划”
达梦数据
17次阅读
2025-04-25 10:10:11
达梦数据2025年第一次投资者交流会成功召开
达梦数据
16次阅读
2025-05-06 10:21:10
七载征程,图启新章 | 蜀天梦图七周年:以自主之“图”,绘就数字未来
达梦数据
13次阅读
2025-04-28 10:18:37
湖北日报:达梦数据要让中国数据库成全球“首选”
达梦数据
11次阅读
2025-05-08 10:02:50
达梦数据X久其金建 以安全高效智能方案革新企业EPM
达梦数据
11次阅读
2025-04-25 10:10:10