[Oracle] 오라클 시스템 객체 쿼리 모음
Laptop
1. 테이블 DML 쿼리 Lock 조회
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SELECT DISTINCT T1.SESSION_ID , T2.SERIAL# , T4.OBJECT_NAME , T2.MACHINE , T2.TERMINAL , T2.PROGRAM , T3.ADDRESS , T3.PIECE , T3.SQL_TEXT , T2.PREV_EXEC_START , 'ALTER SYSTEM KILL SESSION ' || '''' || T1.SESSION_ID || ', ' || T2.SERIAL# || ''';' KILL_SQL , T5.SPID PID FROM V$LOCKED_OBJECT T1 , V$SESSION T2 , V$SQLTEXT T3 , DBA_OBJECTS T4 , V$PROCESS T5 WHERE T1.SESSION_ID = T2.SID AND T1.OBJECT_ID = T4.OBJECT_ID AND T2.SQL_ADDRESS = T3.ADDRESS AND T2.PADDR = T5.ADDR -- AND MACHINE = 'PC명' -- AND OBJECT_NAME = '테이블명' ORDER BY T3.ADDRESS, T3.PIECE; |
1 2 3 4 5 6 7 8 9 10 11 | SELECT S.SID, S.SERIAL#, L.LOCK_TYPE, L.MODE_HELD, L.MODE_REQUESTED, L.LOCK_ID1, 'ALTER SYSTEM KILL SESSION ' || '''' || S.SID || ', ' || S.SERIAL#, || ''';' KILL_SQL FROM DBA_LOCK_INTERNAL L, V$SESSION S WHERE S.SID = L.SESSION_ID AND L.LOCK_TYPE = 'Body Definition Lock' AND UPPER(L.LOCK_ID1) = UPPER('패키지명'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT JOB, WHAT, INTERVAL, TO_CHAR(NEXT_DATE, 'YYYY-MM-DD HH24:MI:SS') NEXT_DATE, TO_CHAR(THIS_DATE, 'YYYY-MM-DD HH24:MI:SS') THIS_DATE FROM USER_JOBS WHERE BROKEN = 'N' AND what LIKE '%' || 'JOB명' || '%' ORDER BY NEXT_DATE; |
4. 실행 중인 JOB 조회
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT D.JOB, S.SID, S.SERIAL#, STATUS, LOG_USER USERNAME, WHAT, DECODE (TRUNC (SYSDATE - LOGON_TIME), 0, NULL, TRUNC (SYSDATE - LOGON_TIME) || ' Days' || ' + ') || TO_CHAR (TO_DATE(TRUNC(MOD(SYSDATE - LOGON_TIME, 1) * 86400), 'SSSSS'), 'HH24:MI:SS') RUNNING, D.FAILURES, 'ALTER SYSTEM KILL SESSION ' || '''' || S.SID || ', ' || S.SERIAL# || ''';' KILL_SQL FROM DBA_JOBS_RUNNING D, V$SESSION S, DBA_JOBS J WHERE S.SID = D.SID AND D.JOB = J.JOB; |
5. 객체(Package, Procedure, Function, Trigger...) 스크립트 검색
1 2 3 4 5 | SELECT * FROM USER_SOURCE WHERE UPPER('%' || '검색어' || '%') AND NAME LIKE '%' || '객체명' || '%'; |
단, 위 쿼리에서 VIEW는 USER_VIEWS 라는 별도의 테이블을 쓰기 때문에 조회되지 않는데, 스크립트가 나오는 TEXT 컬럼의 타입이 LONG으로 되어있어서 LIKE문을 쓸 수 없기 때문에 만약 함께 포함된 결과를 보고싶다면 CLOB 타입으로 변환할 임시 테이블을 쓰는 약간 번거로운 과정을 거쳐야 한다.
또한 LINE의 경우 VIEW 스크립트에서는 CREATE 부분을 없앤 상태로 주 쿼리만을 보여주기 때문에 developer 등의 기능으로 조회해서 볼 경우 맞지 않아보일 수 있다.
편하게 쓰기 위해 프로시저로 정의했다.
(임시 테이블이 남는게 싫다면 프로시저 내에서 EXECUTE로 CREATE/DROP을 할 수도 있을 것 같은데, DDL이 너무 자주 수행되는 것도 낭비같아서 일단은 남겨두기로...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | CREATE GLOBAL TEMPORARY TABLE USER_VIEWS_CLOB ( NAME VARCHAR2(30 BYTE), TEXT CLOB ); CREATE OR REPLACE PROCEDURE SP_SEARCH_OBJ( p_text IN VARCHAR2, p_type IN VARCHAR2, p_name IN VARCHAR2, v_result OUT SYS_REFCURSOR ) IS BEGIN INSERT INTO USER_VIEWS_CLOB SELECT VIEW_NAME, TO_LOB(TEXT) FROM USER_VIEWS; OPEN v_result FOR SELECT * FROM ( SELECT NAME, TYPE, LINE, TEXT FROM USER_SOURCE UNION SELECT NAME, 'VIEW' TYPE, LINE, TO_CHAR(TEXT) FROM ( SELECT NAME, LEVEL LINE, REGEXP_SUBSTR (TEXT, '.+', 1, LEVEL) TEXT FROM ( SELECT NAME, TEXT FROM USER_VIEWS_CLOB WHERE UPPER(text) LIKE UPPER('%' || p_text || '%') ) CONNECT BY LEVEL <= REGEXP_COUNT (TEXT, '.+') ) ) WHERE UPPER(text) LIKE UPPER('%' || p_text || '%') AND TYPE = NVL(UPPER(p_type), TYPE) AND NAME LIKE '%' || UPPER(p_name) || '%'; DELETE FROM USER_VIEWS_CLOB; COMMIT; END; -- EXEC SP_SEARCH_OBJ('검색어', '타입', '객체명', :v_result); |
6. 임의 날짜로부터 특정 일수동안의 목록 조회
ex) 2022년 1월 1일부터 1년(365일)
1 2 3 | SELECT TO_DATE('20220101','YYYYMMDD') + (LEVEL-1) AS v_date FROM DUAL CONNECT BY LEVEL <= (365) |
0 개의 댓글:
댓글 쓰기