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
暂时就遇到这几个,以后遇到继续完善!