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

zz/2023/10/1 4:19:20

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;

http://www.ngui.cc/zz/1443269.html

相关文章

python监控达梦数据库

概述 dmPython是DM提供的依据Python DB API version 2.0中API使用规定而开发的数据库访问接口。使用API能对DM数据库进行访问。 dmPythonn 接口当前版本号为 2.3&#xff0c;需要对应的DM Server版本为7.0.0.9以上&#xff0c;Python版本为2.6以上。 本次目标任务为获取到服务…

DM8达梦数据库:达梦数据库分区表

达梦数据库-二级分区表&#xff1a; 创建一个产品销售记录表 sales&#xff0c;记录产品的销量情况。由于产品只在几个固定 的城市销售&#xff0c;所以可以按照销售城市区号对该表进行 LIST 分区。再按照年份RANGE范围分区 示例没创建对应的表空间&#xff0c;默认存到MAIN表空…

达梦数据库关键字大全

达梦数据库关键字大全&#xff08;关键字不区分大小写&#xff09; 注&#xff1a;仅对dm8.4之前版本 1 KEYWORD LENGTH 2 ABORT 5 3 ABSOLUTE 8 4 ABSTRACT 8 5 ACCESSED 8 6 ACCOUNT 7 7 ACROSS 6 8 ACTION 6 9 ADD 3 10 ADMIN 5 11 ADVANCE…

国产数据库-达梦数据库

简介 武汉华工达梦数据库有限公司&#xff08;达梦公司&#xff09;是国家规划布局内重点软件企业。公司成立于2000年11月&#xff0c;得到了国家计委、科技部、信息产业部、总装备部、公安部等中央部委、省市政府的支持扶植。达梦数据库管理系统是达梦公司推出的具有完全自主…

达梦数据库事务

我们知道数据库事务具有原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;四个特性&#xff0c;简称 ACID。 1. 原子性 事务的原子性保证事务包含的一…

达梦数据库加密

达梦数据库使用ssl通信加密&#xff0c;需要在达梦数据库服务端配置ENABLE_ENCRYPT 和 COMM_ENCRYPT_NAME 参数来指定&#xff0c;客户端以服务端采用的通信方式与其进行通信&#xff0c;达梦数据库支持的加密算法可以通过V$CIPHERS动态视图获取达梦数据库使用ssl通信加密&…

达梦数据库命令

​​​​​​​注意事项&#xff1a; 1.int、bigint、smallint后不加精度定义 否则会提示“第*行附近出现错误[-6119]:无效的数据类型.” 1.查询数据库版本 select * from v$version; 2.查看授权信息 select * from v$license; 3.查看达梦数据库库名 select name,creat…

达梦数据库备份

一、备份的概念 联机备份和脱机备份 1. 联机备份&#xff1a;数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作。 从V2.0 版本开始&#xff0c;使用 DMRMAN 工具进行脱机备份&#xff0c;并且支持对异常关闭的数据库进 行脱机库备份。备份异常关闭的数据库&am…

达梦数据库学习整理

达梦数据库的体系架构跟oracle差不多&#xff0c;属于国内首家自主创研的数据库产品&#xff0c;更加符合国人的使用习惯。由于国外的开源产品较少&#xff0c;商业定制化的产品对国家的安全和保密性并不友好&#xff0c;达梦数据库解决了这些难题。 达梦数据库安装方便&#x…

达梦数据库操作

【实例化】 在进行达梦数据库实例化之前&#xff0c;需要先安装达梦数据库。下载达梦数据库&#xff0c;然后一直采用推荐的设置安装即可。以下介绍数据库实例化的方法。 在开始目录下面打开达梦数据库的数据库配置助手。 如果在安装达梦数据库的时候&#xff0c;自定义了安装…