ORACLE 中非常有用的語句

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章