17,140
社区成员




CREATE OR REPLACE FUNCTION TRANSSCALETOINT(PRM_SCALE NUMBER, --进制
V_VALUE VARCHAR2) --传入值
RETURN NUMBER
AS
N_NUM NUMBER(20);
BEGIN
N_NUM :=0;
FOR I IN (SELECT CASE
WHEN REGEXP_LIKE(SUBSTR(V_VALUE, LEVEL, 1), '[[:digit:]]') THEN
--挑出是0-9数字的
TO_NUMBER(SUBSTR(V_VALUE, LEVEL, 1))
ELSE
--转换A-Z,没有对取值范围做校验!
ASCII(UPPER(SUBSTR(V_VALUE, LEVEL, 1))) - 55
END AS NUM,
--所在位
LENGTH(V_VALUE) - LEVEL AS POW
FROM DUAL
CONNECT BY LEVEL <= LENGTH(V_VALUE))
LOOP
--乘以权重
N_NUM:=N_NUM + I.NUM*POWER(PRM_SCALE,I.POW);
END LOOP;
RETURN N_NUM;
END;
CREATE OR REPLACE FUNCTION TRANSSCALETOINT(PRM_SCALE NUMBER, V_VALUE VARCHAR2)
RETURN NUMBER
AS
CONSSTR CONSTANT VARCHAR2(40) :='0123456789ABCDEFGHJKLMNPQRSTUVWYZ';
N_NUM NUMBER(20);
BEGIN
N_NUM :=0;
FOR I IN (SELECT CASE
WHEN REGEXP_LIKE(SUBSTR(V_VALUE, LEVEL, 1), '[[:digit:]]') THEN
TO_NUMBER(SUBSTR(V_VALUE, LEVEL, 1))
ELSE
INSTR(CONSSTR,SUBSTR(V_VALUE, LEVEL, 1))-1
END AS NUM,
LENGTH(V_VALUE) - LEVEL AS POW
FROM DUAL
CONNECT BY LEVEL <= LENGTH(V_VALUE))
LOOP
N_NUM:=N_NUM + I.NUM*POWER(PRM_SCALE,I.POW);
END LOOP;
RETURN N_NUM;
END;
SELECT TRANSSCALETOINT(33,'0J6') FROM DUAL;
TRANSSCALETOINT(33,'0J6')
600
--创建一个SEQUENCE,获取序列,在此基础上进行加工
create sequence SEQ_TEXT
minvalue 0
maxvalue 10000000
start with 0
increment by 1
cache 20
order;
CREATE OR REPLACE FUNCTION getSequence
RETURN VARCHAR2
AS
N_SHANG NUMBER(10);
N_YUSHU NUMBER(10);
HEXRES VARCHAR2(10);
V_FLAG VARCHAR2(4);
BEGIN
--使用序列获取序列值
N_SHANG :=SEQ_TEXT.NEXTVAL;
--获取生成序列的前缀,奇数次循环为CE,偶数次循环为CO
SELECT DECODE(MOD(TRUNC(N_SHANG/(35*POWER(36,0)+35*POWER(36,1) + 35*POWER(36,2)+1)),2),1,'CO','CE')
INTO V_FLAG
FROM DUAL;
--对ZZZ取模,方便转换
N_SHANG := N_SHANG MOD (35*POWER(36,0)+35*POWER(36,1) + 35*POWER(36,2)+1);
--特殊情况返回000
IF N_SHANG = 0 THEN
HEXRES := '000';
END IF;
--对36进制处理
WHILE N_SHANG>0 LOOP
N_YUSHU:=N_SHANG MOD 36;
SELECT CONCAT(CASE WHEN N_YUSHU >9 THEN CHR(N_YUSHU+55) ELSE TO_CHAR(N_YUSHU) END,HEXRES)
INTO HEXRES
FROM DUAL;
N_SHANG := TRUNC(N_SHANG/36);
END LOOP;
--返回结果
RETURN CONCAT(V_FLAG,LPAD(HEXRES,3,0));
END;
前台调用方式:
13:23:46 ChenZw> select getSequence() as seq from dual;
SEQ
-------------------------------------------------------------
CE9XI