达梦数据库自定义分析函数

1.1、创建定义数值数组类型:

create or replace type t_number_array is varray(100) of number;

1.2、定义分析函数类型

--包头create or replace type t_medas 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_medIS        --初始化    STATIC FUNCTION odciaggregateinitialize        (          this IN OUT t_med)        RETURN NUMBERISBEGIN        this := t_med(t_number_array());        RETURN odciconst.success;END;​​​​​​​
--遍历 MEMBERFUNCTION odciaggregateiterate        (                SELF IN OUT t_med,                VALUE NUMBER)        RETURN NUMBERIS        --将元素按倒序,插入到数组中 --新元素将要插入的位置        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;​​​​​​​
--结束MEMBERFUNCTION odciaggregateterminate        (                SELF IN t_med,                returnvalue OUT NUMBER,                flags IN        NUMBER)        RETURN NUMBERISBEGIN        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;​​​​​​​
--合并 MEMBERFUNCTION odciaggregatemerge        (                SELF IN OUT t_med,                ctx2 IN t_med)        RETURN NUMBERISBEGIN        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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值