ORACLE的SQL集錦

1. 一張自關聯的表,查詢的結果集要求先顯示父數據,再顯示其子數據。其中下面語句中的-1就是父數據

SELECT A.* FROM XT_NOSAFE_VINDI A START WITH A.PARENT_CODE='-1'
CONNECT BY PRIOR A.FACTOR_CODE=A.PARENT_CODE 
ORDER SIBLINGS BY A.FACTOR_CODE

結果集:
1  粉塵類  0001  -1
2  遊離二氧化硅粉塵  4001  0001
3  煤塵(包括煤矽塵)  4002  0001
4  石棉粉塵  4003  0001
5  其它粉塵  4004  0001
6  棉塵(包括亞麻、軟大麻、黃麻粉塵)  4005  0001
7  放射性物質類  0002  -1
8  射線  3001A  0002
9  化學物質類  0003  -1
10  鉛及其無機化合物  1001  0003
11  四乙基鉛  1002  0003
12  汞及其無機化合物  1003  0003
13  鈹及其無機化合物  1004  0003
14  鎘及其無機化合物  1005  0003
15  鉻及其無機化合物  1006  0003


2. WM_CONCAT以及LISTAGG用法,其中建議使用LISTAGG,其效率高。

 SELECT A.DESMTD_ID, WM_CONCAT(A.RID)
        FROM BX_SELRST_BE A WHERE A.REPSUB_ID IN(201258,201279)
        GROUP BY A.DESMTD_ID

 SELECT A.DESMTD_ID, LISTAGG(A.RID,',') 
        WITHIN GROUP (ORDER BY A.DESMTD_ID) ALL_FORMS
        FROM BX_SELRST_BE A WHERE A.REPSUB_ID IN(201258,201279)  
        GROUP BY A.DESMTD_ID

3. 創建JOB

CREATE OR REPLACE PROCEDURE PRO_CHG_NETTAG(VAL_ IN VARCHAR2) IS
BEGIN
UPDATE TS_SYSTEM_PARAM SET PARAM_VALUE=VAL_ WHERE PARAM_NAME='VERIFYCODE_NETTAG';
COMMIT;
END PRO_CHG_NETTAG;
/


--每天早上一點
DECLARE JOB_CHG_NET1 NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB_CHG_NET1,'PRO_CHG_NETTAG(3);',TRUNC(SYSDATE+1)+1/24, 'TRUNC(SYSDATE+1)+1/24');
END;
/

--每天早上7點
DECLARE JOB_CHG_NET2 NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB_CHG_NET2,'PRO_CHG_NETTAG(1);',TRUNC(SYSDATE+1)+7/24, 'TRUNC(SYSDATE+1)+7/24');
END;
/

4.行轉列

SELECT * FROM (SELECT ORGIDX, GDSIDX, STM_CNT FROM TD_JXC_CNTSTM_INFO) T
PIVOT (SUM(STM_CNT) FOR GDSIDX IN (202,301,402,3)) ORDER BY ORGIDX;

     ORGIDX  202  301  402  3
1  1  0  0    1361
2  655480        4
3  655482  1000  720  1046  
4  700099  21400  11080  10954  645
5  700381  600      
6  35197450        49000



SELECT ORGIDX,GDSIDX, SUM(STM_CNT) FROM TD_JXC_CNTSTM_INFO 
WHERE GDSIDX IN (202,301,402,3)
GROUP BY ORGIDX,GDSIDX
ORDER BY ORGIDX

     ORGIDX  GDSIDX  SUM(STM_CNT)
1  1  3  1361
2  1  202  0
3  1  301  0
4  655480  3  4
5  655482  202  1000
6  655482  301  720
7  655482  402  1046
8  700099  3  645
9  700099  202  21400
10  700099  301  11080
11  700099  402  10954
12  700381  202  600
13  35197450  3  49000

5. 獲取日期所在周

SELECT TO_CHAR(TO_DATE('2013-12-31','YYYY-MM-DD'), 'IYYY-IW') FROM DUAL

6. 根據某列分組,並獲取其中rid最大的

MAX(A.IDX) OVER(PARTITION BY A.UNIT_ID)

7.限制允許IP訪問設置

在ORACLE\PRODUCT\10.2.0\DB_1\NETWORK\ADMIN\SQLNET.ORA最後添加
TCP.VALIDNODE_CHECKING=YES
TCP.INVITED_NODES=(127.0.0.1,10.88.99.2,10.88.99.168,10.88.99.24,10.88.99.13)  --可以訪問的IP

8.ORACLE10G修改內存

ALTER SYSTEM SET SGA_MAX_SIZE=960M SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=960M SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=240M SCOPE=SPFILE;

9.編寫SCHEDULER

-- 執行業務操作
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
JOB_NAME => 'DX_NETTAG_JOB',
JOB_TYPE => 'PLSQL_BLOCK',
JOB_ACTION => 'BEGIN UPDATE TD_TASKLIST SET NET_TAG = 3 WHERE SYSTEM_MARK = 1; COMMIT; END;',
START_DATE => SYSDATE,
REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=10;BYHOUR=1,2,3,4,5,6',
ENABLED => TRUE
);
END;
/


--啓動JOB
BEGIN
DBMS_SCHEDULER.ENABLE('DX_NETTAG_JOB');
END;
/

-- 運行job  
BEGIN  
   DBMS_SCHEDULER.RUN_JOB('DX_NETTAG_JOB',TRUE); -- TRUE代表同步執行  
END;  
/  

--刪除JOB
BEGIN
DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'DX_NETTAG_JOB',FORCE => TRUE);  
END;
/

-- 停止job  
BEGIN  
   DBMS_SCHEDULER.STOP_JOB(JOB_NAME => 'DX_NETTAG_JOB',FORCE => TRUE);  
END;   
/  

-- 查詢job  
SELECT * FROM USER_SCHEDULER_JOBS;  
SELECT * FROM DBA_SCHEDULER_JOBS;  


--查看數據
SELECT T.*, T.ROWID FROM AAA T



--更改DATE的格式
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';  
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS';  
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH:MI:SS.FF AM TZR'; 

--查看DATE的格式
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER LIKE '%_DATE_%' OR PARAMETER LIKE '%_TIMESTAMP_%';  

--授權 sys
 GRANT CREATE JOB TO DXCDC;
 GRANT MANAGE SCHEDULER TO DXCDC;

--測試JOB執行的時間
SET SERVEROUTPUT ON SIZE 999999

DECLARE
  L_START_DATE  TIMESTAMP;
  L_NEXT_DATE   TIMESTAMP;
  L_RETURN_DATE TIMESTAMP;

BEGIN
  L_START_DATE  := TRUNC(SYSTIMESTAMP);
  L_RETURN_DATE := L_START_DATE;
  FOR CTR IN 1 .. 50 LOOP
    DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=DAILY;BYHOUR=0,1,2,3,4,5,6,7,22,23',
                                            L_START_DATE,
                                            L_RETURN_DATE,
                                            L_NEXT_DATE);
  
    DBMS_OUTPUT.PUT_LINE('NEXT RUN ON: ' ||
                         TO_CHAR(L_NEXT_DATE, 'YYYY-MM-DD HH24:MI:SS'));
  
    L_RETURN_DATE := L_NEXT_DATE;
  
  END LOOP;
END;
/

10. 查詢ORACLE限制

select count(*) from v$session;   42
select * from v$license;

SESSIONS_MAX:指定允許同時進行的並行用戶會話的最大數量。達到該限制後, 
只有具有 RESTRICTED SESSION 權限的用戶才能連接到服務器。
所有其他用戶都會收到一條警告消息, 表明已達到系統最大容量的限制
SESSIONS_WARNING:指定對並行用戶會話數量的警告限制。達到該限制後, 
其他用戶仍然可以連接, 但一條消息將被寫入 ALERT 文件。
具有RESTRICTED SESSION 權限的用戶將收到一條警告消息, 表明系統已接近最大容量。
USERS_MAX:指定您可在該數據庫中創建的用戶的最大數量。
並行會話使用許可和用戶使用許可不應被同時啓用。LICENSE_MAX_SESSIONS 或 LICENSE_MAX_USERS 或這兩者的值應爲零。
SESSIONS_CURRENT 表示已經連接的 SESSION 數量(注:該值並不等於 v$session 中查詢出來的數量,
似乎並不包括 Oracle 本身連接的 SESSION,

11.生成執行計劃步驟

(1). sys進入
--創建 plan table
SQL> @?rdbms/admin/utlxplan
SQL> create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public ;
--創建plustrace 角色
SQL> @?sqlplus/admin/plustrce --執行plustrce.sql
--plustrace授予public
SQL> grant plustrace to public;

(2).普通用戶進入
set autotrace traceonly;
sqlcontent;

或者 explain plan for sqlcontent;
select * from table(dbms_xplan.display)

12.強制使用索引

SELECT /*+index_ffs(B idx_TD_JXC_PURMTB_4)*/
       NVL(SUBSTR(Z.ZONE_GB, 0, 4), '合計') AS ZONE_CODE,
       NVL(SUM(DECODE(B.INXTYPEID, 1, 1, 17, 1, 0)), '0') AS RST1,
       NVL(SUM(DECODE(B.INXTYPEID, 1, B.IF_INTIME, 17, B.IF_INTIME, 0)), '0') AS RST2
  FROM XT_ZONE Z
  LEFT JOIN XT_UNIT A ON A.ZONE_ID = Z.RID AND A.ORGIDX IS NULL
  LEFT JOIN TD_JXC_PURMTB B ON B.ORGIDX = A.RID AND B.INXDAY BETWEEN TO_DATE('2013-01-01', 'YYYY-MM-DD') 
           AND TO_DATE('2013-12-31', 'YYYY-MM-DD')
 WHERE 1 = 1
   AND Z.ZONE_GB LIKE '32%'
 GROUP BY ROLLUP(SUBSTR(Z.ZONE_GB, 0, 4))

全表掃描
SELECT /*+full(B) full(C)*/
       NVL(SUBSTR(Z.ZONE_GB, 0, 4), '合計') AS ZONE_CODE,
       NVL(SUM(DECODE(B.INXTYPEID, 1, 1, 17, 1, 0)), '0') AS RST1,
       NVL(SUM(DECODE(B.INXTYPEID, 1, B.IF_INTIME, 17, B.IF_INTIME, 0)),'0') AS RST2
  FROM XT_ZONE Z
  LEFT JOIN XT_UNIT A ON A.ZONE_ID = Z.RID AND A.ORGIDX IS NULL
  LEFT JOIN TD_JXC_PURSUB C ON C.ORGIDX = A.RID
  LEFT JOIN TD_JXC_PURMTB B ON C.MTBIDX = B.RID AND B.INXDAY BETWEEN TO_DATE('2013-01-01', 'YYYY-MM-DD') AND TO_DATE('2013-12-31', 'YYYY-MM-DD')
 WHERE 1 = 1 AND Z.ZONE_GB LIKE '32%'
 GROUP BY ROLLUP(SUBSTR(Z.ZONE_GB, 0, 4));

13.查看錶佔用的空間

select table_name,(blocks+empty_blocks)*8*1024 from   user_tables  where table_name in ('TD_JXC_PURMTB', 'TD_JXC_PURSUB')

14.索引管理

(1).移動索引的表空間
ALTER INDEX INDEX_OWNER.INDEX_NAME REBUILD TABLESPACE NEW_TBS;
(2).獲得某個SCHEMA下移動索引表空間的所有語句
SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD TABLESPACE NEW_TBS;'  
FROM DBA_INDEXES   
WHERE TABLE_OWNER='SCHEMA_NAME'  
ORDER BY INDEX_NAME;  
(3).創建新表,指定唯一索引的表空間
CREATE TABLE TMP(   
MON VARCHAR2(6) ,   
IDNO VARCHAR2(10) ,   
CONSTRAINT PK_NAME PRIMARY KEY ( MON, IDNO )   
USING INDEX TABLESPACE INDEX_TBS,  
CONSTRAINT UK_NAME UNIQUE (MON)  
USING INDEX TABLESPACE INDEX_TBS  

15.清空緩存

--sys用戶
--清空共享池:
ALTER SYSTEM FLUSH SHARED_POOL;

--清空BUFER 
ALTER SYSTEM FLUSH BUFFER_CACHE;

ALTER SESSION SET RESULT_CACHE_MODE = MANUAL;

16查詢ORACLE的CPU個數
Select * FROM V$OPTION where parameter like 'Parallel%';
select * from V$pq_sesstat;

發佈了28 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章