鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 数据库 > oracle > >

常用Oracle语句

来源:互联网 作者:佚名 时间:2018-03-04 11:24
将查询结果进行拼接的方法 SELECT T.CASE_ID, LISTAGG(T.OWNER_NAME, ',') WITHIN GROUP(ORDER BY T.OWNER_NAME) FROM DZAJ_PERSON_INFO T GROUP BY T.CASE_ID 数字汉字与阿拉伯数字转换 CREATE OR REPLACE PACKAGE czutilAS--将数字转化为汉字,支持千兆级

将查询结果进行拼接的方法

SELECT T.CASE_ID,
       LISTAGG(T.OWNER_NAME, ',') WITHIN GROUP(ORDER BY T.OWNER_NAME)
  FROM DZAJ_PERSON_INFO T
 GROUP BY T.CASE_ID

  

数字汉字与阿拉伯数字转换

CREATE OR REPLACE PACKAGE czutil
AS
--将数字转化为汉字,支持千兆级数字的操作
FUNCTION num2chi (numvalue IN NUMBER)
RETURN VARCHAR2;

--将汉字转化为数字,支持千兆级数字的操作
FUNCTION chi2num (chivalue IN VARCHAR2)
RETURN NUMBER;
END;

CREATE OR REPLACE PACKAGE BODY czutil
AS
FUNCTION num2chi (numvalue IN NUMBER)
RETURN VARCHAR2
IS
--汉字映射数字的映射表
TYPE MAP IS TABLE OF VARCHAR2 (10)
INDEX BY BINARY_INTEGER;

ling_jiu_map MAP;
shibaiqian_map MAP;
wanyizhao_map MAP;
--临时变量
i INT := 0; --'临时变量
j INT := 0; --临时变量
k INT := 0; --临时变量
x INT := 0; --临时变量
y INT := 0; --临时变量
str VARCHAR2 (100) := ''; --临时变量
tmp VARCHAR2 (100) := ''; --临时变量
integer_part VARCHAR2 (100) := ''; --数字形式整数部分
float_part VARCHAR2 (100) := ''; --数字形式小数部分
returnvalue VARCHAR2 (100) := ''; --返回值
BEGIN
--初始化数组
ling_jiu_map (0) := '零';
ling_jiu_map (1) := '一';
ling_jiu_map (2) := '二';
ling_jiu_map (3) := '三';
ling_jiu_map (4) := '四';
ling_jiu_map (5) := '五';
ling_jiu_map (6) := '六';
ling_jiu_map (7) := '七';
ling_jiu_map (8) := '八';
ling_jiu_map (9) := '九';
shibaiqian_map (0) := '';
shibaiqian_map (1) := '十';
shibaiqian_map (2) := '百';
shibaiqian_map (3) := '千';
wanyizhao_map (0) := '';
wanyizhao_map (1) := '万';
wanyizhao_map (2) := '亿';
wanyizhao_map (3) := '兆';
--将数字拆分为整数与浮点数两个数字数组
i := INSTR (numvalue, '.', 1);

IF i = 0
THEN
integer_part := SUBSTR (numvalue, 1);
ELSE
integer_part := FLOOR (numvalue);
float_part := SUBSTR (numvalue, i + 1);
END IF;

--计算整数部分
i := LENGTH (integer_part);
j := CEIL (i / 4);
k := 0;

--将整数部分每四个分为一个组
FOR k IN 0 .. j - 1
LOOP
IF k = 0
THEN
str := SUBSTR (integer_part, 1, i - 4 * j + 4);
ELSE
str := SUBSTR (integer_part, i - 4 * j + 4 * k + 1, 4);
END IF;

x := LENGTH (str);
y := 0;
tmp := '';

--将每个组中数据转化为汉字
FOR y IN 0 .. x - 1
LOOP
tmp :=
tmp
|| ling_jiu_map (SUBSTR (str, y + 1, 1))
|| shibaiqian_map (x - y - 1);
END LOOP;

--零处理
tmp := RTRIM (tmp, '零'); --去掉兆亿万前面个位上的零
tmp := REGEXP_REPLACE (tmp, '(零[千百十])', '零'); --千百十位上的零
tmp := REGEXP_REPLACE (tmp, '(零{2,})', '零'); --将千百十位上的零结合
returnvalue := returnvalue || tmp || wanyizhao_map (j - k - 1);
END LOOP;

--零处理
--去掉兆亿万上的零
returnvalue := REGEXP_REPLACE (returnvalue, '(零[兆亿万])', '零');
--将兆亿万位上的零结合
returnvalue := REGEXP_REPLACE (returnvalue, '(零{2,})', '零');
--简称十位上的一
returnvalue := REGEXP_REPLACE (returnvalue, '^一十', '十');
returnvalue := REGEXP_REPLACE (returnvalue, '零一十', '零十');

--放进返回结果
IF returnvalue IS NULL
THEN
returnvalue := '零';
END IF;

IF float_part IS NOT NULL
THEN
--计算小数部分
k := 0;
tmp := '';

FOR k IN 1 .. LENGTH (float_part)
LOOP
tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1));
END LOOP;

returnvalue := returnvalue || '点' || tmp;
END IF;

RETURN returnvalue;
END;

FUNCTION chi2num (chivalue IN VARCHAR2)
RETURN NUMBER
IS
--汉字映射数字的映射表
TYPE MAP IS TABLE OF BINARY_INTEGER
INDEX BY VARCHAR2 (10);

ling_jiu_map MAP;
shibaiqian_map MAP;
wanyizhao_map MAP;
--临时变量
i INT := 0; --'临时变量
j INT := 0; --临时变量
k INT := 0; --临时变量
x INT := 0; --临时变量
y INT := 0; --临时变量
str VARCHAR2 (100) := ''; --临时变量
tmp INT := 0; --临时变量
tmp2 INT := 0; --临时变量
integer_part VARCHAR2 (100) := ''; --数字形式整数部分
float_part VARCHAR2 (100) := ''; --数字形式小数部分
returnvalue NUMBER := 0; --返回值
BEGIN --初始化数组
ling_jiu_map ('零') := 0;
ling_jiu_map ('一') := 1;
ling_jiu_map ('二') := 2;
ling_jiu_map ('三') := 3;
ling_jiu_map ('四') := 4;
ling_jiu_map ('五') := 5;
ling_jiu_map ('六') := 6;
ling_jiu_map ('七') := 7;
ling_jiu_map ('八') := 8;
ling_jiu_map ('九') := 9;
shibaiqian_map ('') := 0;
shibaiqian_map ('十') := 1;
shibaiqian_map ('百') := 2;
shibaiqian_map ('千') := 3;
wanyizhao_map ('') := 0;
wanyizhao_map ('万') := 1;
wanyizhao_map ('亿') := 2;
wanyizhao_map ('兆') := 3;
--将十位上的一补充完整
str := REGEXP_REPLACE (chivalue, '^十', '一十');
str := REGEXP_REPLACE (str, '零十', '零一十');
--将数字拆分为整数与浮点数两个数字数组
i := INSTR (str, '点', 1);

IF i = 0
THEN
integer_part := SUBSTR (str, 1);
ELSE
integer_part := SUBSTR (str, 1, i - 1);
float_part := SUBSTR (str, i + 1);
END IF;

--整型部分
x := LENGTH (integer_part);
str := '';
tmp := 0;
tmp2 := 0;

FOR k IN 1 .. x
LOOP
str := SUBSTR (integer_part, k, 1);

IF str IN ('万', '亿', '兆')
THEN
--当碰到万亿兆时
tmp := tmp + tmp2;
returnvalue :=
returnvalue + tmp * POWER (10000, wanyizhao_map (str));
tmp := 0;
tmp2 := 0;
ELSIF str IN ('十', '百', '千')
THEN
--当碰到十百千时
tmp := tmp + tmp2 * POWER (10, shibaiqian_map (str));
tmp2 := 0;
ELSE
--当碰到数字时
tmp2 := ling_jiu_map (str);
END IF;
END LOOP;

--最后将没有小于万位数加到整数中去
tmp := tmp + tmp2;
returnvalue := returnvalue + tmp;

IF float_part IS NOT NULL
THEN
--计算小数部分
k := 0;
tmp := '';

FOR k IN 1 .. LENGTH (float_part)
LOOP
tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1));
END LOOP;

returnvalue := returnvalue || '.' || tmp;
END IF;

RETURN returnvalue;
END;
END czutil;

  使用方法:

1、先建立packages

2、使用下列SQL即可查询

SELECT CZUTIL.NUM2CHI(T) FROM TABLE

 

 

查看数据库版本:

1)select * from PRODUCT_COMPONENT_VERSION;

2)select * from v$version;

 

根据子节点查询所有的父节点:

SELECT X_LEVEL, X_ID
  FROM TAB_X
 START WITH X_ID = '子节点编号'
CONNECT BY NOCYCLE PRIOR PARENTID = X_ID;

根据父节点查询所有子节点:

SELECT X_LEVEL, X_ID
  FROM TAB_X
 START WITH X_ID = '父节点编号'
CONNECT BY NOCYCLE PRIOR X_ID = PARENTID;

 纯Oracle实现的日历

SELECT MONTH 年月,"星期日", "星期一", "星期二",
"星期三", "星期四", "星期五", "星期六"
FROM (
SELECT TO_CHAR(dt,'fmMonthfm YYYY') MONTH,
decode(to_char(dt,'ww'),52,decode(TO_CHAR(dt+1,'iw'),1,53,52),53,decode(TO_CHAR(dt+1,'iw'),1,53,52),TO_CHAR(dt+1,'iw')) week,
MAX(DECODE(TO_CHAR(dt,'d'),'1',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期日",
MAX(DECODE(TO_CHAR(dt,'d'),'2',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期一",
MAX(DECODE(TO_CHAR(dt,'d'),'3',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期二",
MAX(DECODE(TO_CHAR(dt,'d'),'4',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期三",
MAX(DECODE(TO_CHAR(dt,'d'),'5',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期四",
MAX(DECODE(TO_CHAR(dt,'d'),'6',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期五",
MAX(DECODE(TO_CHAR(dt,'d'),'7',LPAD(TO_CHAR(dt,'fmdd'),2))) "星期六"
FROM (SELECT TRUNC(SYSDATE,'y')-1+ROWNUM dt
FROM all_objects
WHERE ROWNUM <= ADD_MONTHS(TRUNC(SYSDATE,'y'),12) - TRUNC(SYSDATE,'y'))
GROUP BY TO_CHAR(dt,'fmMonthfm YYYY'), 
         decode(to_char(dt,'ww'),52,decode(TO_CHAR(dt+1,'iw'),1,53,52),53,decode(TO_CHAR(dt+1,'iw'),1,53,52),TO_CHAR(dt+1,'iw'))
         )
ORDER BY TO_DATE( MONTH, 'Month YYYY'), 
         TO_NUMBER(week)

 如何分辨用户是从哪台机器登录的用户

SELECT * FROM V$SESSION T

 

网友评论
<