工作後纔開始接觸數據庫增刪改查的多重複雜場景,學校自學的時候都是小打小鬧。記錄一下工作中常用的 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的效率更高,時間縮短了近一倍