工作后才开始接触数据库增删改查的多重复杂场景,学校自学的时候都是小打小闹。记录一下工作中常用的 Oracle 数据库的技巧。
去重:DISTINCT
SELECT DISTINCT TRIM(NET_BUS_NET) FROM ZWR_HST_NET_T
去空格:TRIM
SELECT DISTINCT TRIM(NET_BUS_NET) FROM ZWR_HST_NET_T
截取某一个字符前的值:SUBSTR INSTR
SELECT SUBSTR('AAA-BBB-CCC-DDD', 1, INSTR('AAA-BBB-CCC-DDD', '-', -1)-1) FROM dual
第一个1:从哪一位开始,如果改成3,结果为 A-BBB-CCC-D
INSTR(‘AAA-BBB-CCC-DDD’, ‘-’, -1)-1 : 最后不减去1,则结果为AAA-BBB-CCC- , 所以第一个1和最后的-1决定了结果长度
:括号里面的-1是从后往前数第几个符号,改成1的话结果为 AAA-
实战案例:资源中心函数,ZWRCMD_NetCheck CMDB查询结果网段检查 ——
SELECT DISTINCT SUBSTR(VWA_SRV_IPA, 1, INSTR(VWA_SRV_IPA, '.', -1))
FROM ZWR_CMD_VWA_T
AS后的字段取不到问题-视图问题
SELECT DISTINCT SUBSTR(VWA_SRV_IPA, 1, INSTR(VWA_SRV_IPA, '.', -1)) AS SEG , VWA_PRD_STS, VWA_RUN_STS, VWA_VWA_COD, VWA_VMA_NAM
FROM ZWR_CMD_VWA_T
WHERE SUBSTR(VWA_SRV_IPA, 1, INSTR(VWA_SRV_IPA, '.', -1)) != ' '
AND TRIM(SUBSTR(VWA_SRV_IPA, 1, INSTR(VWA_SRV_IPA, '.', -1))) NOT IN (SELECT DISTINCT TRIM(NET_BUS_NET) FROM ZWR_HST_NET_T)
前面可以用AS SEG,但是AND 后面接的不能写 SEG NOT IN …
查看ORACLE数据库版本
SELECT * FROM v$version
一张表增加数据时,该表的属性附加表也增加一条数据:MERGE INTO
MERGE INTO ZWR_DAP_ART_T A
USING (SELECT APP_SVC_COD, APP_APP_NAM FROM ZWR_DAP_APP_T) B
ON (A.ART_APP_NAM = B.APP_APP_NAM AND A.ART_SVC_COD = B.APP_SVC_COD)
WHEN NOT MATCHED THEN
INSERT (ART_SVC_COD, ART_APP_NAM, ART_DTB_NAM, ART_MOV_TAG, ART_GRY_TAG, ART_ERR_TAG, ART_MNT_DAT, ART_MNT_TIM, ART_RCD_VER, ART_RCD_STS)
VALUES (B.APP_SVC_COD, B.APP_APP_NAM, ' ', ' ', ' ', ' ',
TO_NUMBER (TO_CHAR (SYSDATE, 'yyyyMMdd')), TO_NUMBER (TO_CHAR (SYSDATE, 'hh24miss')), '1', 'A');`
用一张表数据去更新领一张表(多行批量更新不能用UPDATE否则会报错“单行子查询返回多个行”):MERGE INTO
MERGE INTO ZWR_DWA_VWA_T A
USING (SELECT APP_NAM,DIV_NAM ,DIV_RAC, RDD_NBR , DPL_SEQ ,VWA_IPA FROM APP1.NEWTABLE) B
ON (A.VWA_VWA_IPA = B.VWA_IPA)
WHEN MATCHED THEN
UPDATE SET A.VWA_APP_NAM = B.APP_NAM, A.VWA_DIV_NAM = B.DIV_NAM ,
A.VWA_DIV_RAC = B.DIV_RAC, A.VWA_RDD_NBR B.RDD_NBR , A.VWA_APP_SEQ = B.DPL_SEQ
接上一条,批量更新只能是主动给值
UPDATE APP1.NEWTABLE SET MSG = 'N' WHERE VWA_IPA IN
(SELECT VWA_IPA FROM ZWR_DWA_VWA_T INNER JOIN APP1.NEWTABLE
ON VWA_VWA_IPA = VWA_IPA AND VWA_APP_NAM != APP_NAM)
Oracle查看数据库最大连接数与当前连接数
数据库允许的最大连接数
select value from v$parameter where name = 'processes'
–当前的连接数
select count(*) from v$process
数据库时间
TO_NUMBER(TO_CHAR(SYSDATE,'yyyymmdd')) #注意用yyyy,小写y表示当天所在的年份,大写YYYY代表week in which year
TO_NUMBER(TO_CHAR(SYSDATE,'hh24miss'))
分页查询
使用ROWNUM的方式进行分页查询,查询页起始记录和结束记录,使用两层嵌套的查询方式
SELECT *
FROM
(
SELECT ROWNUM RN, T1.*
FROM (
SELECT * FROM TRANS_XDT_T
WHERE TRS_SEQ <= '查询条件'
ORDER BY TRS_SEQ ASC
) T1
WHERE ROWNUM <= endIndex
)T2
WHERE RN >= beginIndex
ORDER BY T2.TRS_SEQ ASC
使用ROWNUM的方式进行分页查询,查询页起始记录和结束记录,使用一层筛选的查询方式
SELECT *
FROM
(
SELECT ROWNUM RN, T1.*
FROM (
SELECT * FROM TRANS_XDT_T
WHERE TRS_SEQ <= '查询条件'
ORDER BY TRS_SEQ ASC
) T1
)T2
WHERE RN >= beginIndex AND RN <= endIndex
ORDER BY T2.TRS_SEQ ASC
⭐使用续传键值进行续传查询
SELECT T1.*
FROM (
SELECT * FROM TRANS_XDT_T
WHERE TRS_SEQ >= '流水号'
ORDER BY TRS_SEQ ASC
) T1
WHERE ROWNUM <= N
ORDER BY T1.TRS_SEQ ASC
使用ROWNUM的方式进行分页查询,查询页起始记录和结束记录,使用两层嵌套的查询方式。并通过先读索引,再关联查询其他字段的方式进行优化。
SELECT T4.*
FROM
(
SELECT T2.TRS_SEQ
FROM
(
SELECT ROWNUM RN, T1.TRS_SEQ
FROM (
SELECT TRS_SEQ
FROM TRANS_XDT_T
WHERE TRS_SEQ <= '查询条件'
ORDER BY TRS_SEQ ASC
) T1
WHERE ROWNUM <= endIndex
)T2
WHERE RN >= beginIndex
) T3
INNER JOIN TRANS_XDT_T T4
ON T3.TRS_SEQ = T4.TRS_SEQ
ORDER BY T4.TRS_SEQ ASC
取前10名,然后给这十条记录排序
SELECT RANK() OVER(ORDER BY OPR_CNT) AS RANK, T.* FROM TABLE ORDER BY T.SORT #这种方式会有并列第一名的情况
SELECT ROW_NUMBER() OVER(ORDER BY OPR_CNT DESC) AS RANK, T.* FROM TABLE ORDER BY T.SORT #这种方式不会有并列第一名的情况,DESC的用处是数量最多的给第一名
ORACLE使用场景甄别
当需要从A表中查出数据放到B表中,一次又要重复查多项时,也就是插入是批量插入时有两种方法,
一、addBatch()然后executeBatch();
二、
INSERT INTO TABLE_A VALUES(...)
SLECET * FROM TABLE_B
UNION ALL
SELECT * FROM TABLE_B
实践证明,用executeBatch的效率比拼接SQL的效率更高,时间缩短了近一倍