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的效率更高,时间缩短了近一倍

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