MySQL迁移达梦DM,自定义常用函数

mysql中部分比较特出的函数在达梦中不存在,需要去写脚本自定义


在此我举出我项目中遇到的几个函数

提示:以下是本篇文章正文内容,下面案例可供参考

一、加密解密函数

示例:项目中涉及一些身份证,手机号这类敏感数据,需要在数据库中加密存储,因此用到了MySQL中的加密解密函数

1. 解密函数 AES_DECRYPT

CREATE OR REPLACE FUNCTION AES_DECRYPT("V_STR" IN VARCHAR2(32767),"V_KEY" IN VARCHAR2(32767))
RETURN VARCHAR2(32767)
AUTHID DEFINER
 IS    
      res      varchar2(2000):= ''; -- 返回结果   
    BEGIN     
     -- 返回res  
     IF (v_str='' or v_str is null) THEN
     res:= '';
     ELSE  
     res := UTL_I18N.RAW_TO_CHAR(DBMS_CRYPTO.DECRYPT(UTL_ENCODE.BASE64_DECODE(chartobin(v_str)),
DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
UTL_I18N.STRING_TO_RAW(v_key,'UTF8')),'UTF8');
    END IF;
     return res;
    END AES_DECRYPT;

2.加密函数 AES_ENCRYPT

CREATE OR REPLACE FUNCTION AES_ENCRYPT("V_STR" IN VARCHAR2(32767),"V_KEY" IN VARCHAR2(32767))
RETURN VARCHAR2(32767)
AUTHID DEFINER
 IS    
      res      varchar2(2000):= ''; -- 返回结果   
    BEGIN     
     -- 返回res
     IF (v_str='' or v_str is null)  THEN  
     res := '';
     ELSE  
     res := BINTOCHAR (
		UTL_ENCODE.BASE64_ENCODE (
			DBMS_CRYPTO.ENCRYPT(
				UTL_I18N.STRING_TO_RAW (v_str, 'UTF8' ),
				DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
				UTL_I18N.STRING_TO_RAW (v_key, 'UTF8' ) 
			) 
		) 
	);
	END IF;
    return res;
    END AES_ENCRYPT;

二、经纬度计算

1.MySQL中计算经纬度距离方法

select 
   round( ( st_distance (
            point ( sf.longitude, sf.latitude ),
            point (#{searchDto.currentLongitude}, #   {searchDto.currentLatitude} ) )
            /0.0111 ) * 1000 ) AS distance
from t1             

2. 达梦自定义计算经纬度

  需要定义GETDISTANCE 和 RAD 两个方法,而且计算出来距离和MySQL存在一定误差
CREATE OR REPLACE FUNCTION "GETDISTANCE"("LNG1" IN NUMBER(22, 6),"LAT1" IN NUMBER(22, 6),"LNG2" IN NUMBER(22, 6),"LAT2" IN NUMBER(22, 6))
RETURN NUMBER(22, 6)
AUTHID DEFINER

is
earth_padius number := 6378393;
radLat1      number := rad(LAT1);
radLat2      number := rad(LAT2);
a            number := radLat1   - radLat2;
b            number := rad(LNG1) - rad(LNG2);
s            number := 0;
BEGIN
s := 2*Asin(Sqrt(power(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));
s := s*earth_padius;
s := Round(s * 10000) / 10000;
return s;
END;


CREATE OR REPLACE FUNCTION "RAD"("d" IN NUMBER(22, 6))
RETURN NUMBER(22, 6)
AUTHID DEFINER
is
PI number :=3.141592625;
BEGIN
return d* PI/180.0;
END;

SQL示例

select round(
            GetDistance(st.longitude, st.latitude,#{searchDto.currentLongitude}, #{searchDto.currentLatitude})
            ) AS distance,
 from tb1           

暂时就遇到这几个,以后遇到继续完善!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值