Translate

2022년 3월 22일 화요일

유용한 프로그램 모음


2022년 3월 18일 금요일

[Oracle] 오라클 시스템 객체 쿼리 모음


Laptop
운영체제Windows 10 Pro 64bit
개발환경Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production


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;


2.  Package DDL Lock 조회

 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('패키지명');


3. JOB 목록 조회

 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)

~ 



- 참고 사이트




2021년 3월 18일 목요일

[Eclipse, JSTL] 이클립스 정규 표현식을 이용한 Find/Replace로 웹 취약점 XSS 조치 (${} -> c:out 변환)





(\$\{.+?\})

<c:out value='\1'/>

웹 취약점 조치 작업중 단축키 Ctrl+F 로 나오는 Find/Replace에서 ${abc} -> <c:out value='${abc}'/> 로 일괄 변환할 수 있는 정규 표현식이다.

또한 이미 기존 JSTL태그에서 사용된것도 구분없이 변환되므로 위 바꾸기를 한 후에
<c:out value=.<c:out value
이런식으로 중복처리된 데이터를 탐색할 수 있다.

Regular Expression는 반드시 체크해야함

2021년 3월 17일 수요일

[Oracle] 가장 긴 소수점자리 길이 구하기


Laptop
운영체제 Windows 10 Pro 64bit
개발환경 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production



1. 가장 긴 소수점자리 수 조회

SELECT MAX(LENGTH(SUBSTR(VL, INSTR(VL, '.') + 1)))
FROM TB
WHERE INSTR(VL, '.') != 0 -- 소수점자리가 없는 정수 제외
>> 3 


 2. 특정 소수점자리 길이를 가진 값 조회
 
SELECT *
FROM TB
WHERE INSTR(VL, '.') != 0
AND LENGTH(SUBSTR(VL, INSTR(VL, '.')+ 1)) = 3
>>


2019년 12월 13일 금요일

[JavaScript] 부모창이 닫힐 때 함께 닫히는 종속 자식창



Laptop
운영체제 Windows 10 Pro 64bit
개발환경 Chrome 버전 78.0.3904.108

window.open으로 여는 팝업에서 부모창이 종료될 때 그 부모창에서 열었던 팝업들을 함께 닫아야 하는 경우가 있다.
원래는 dependent라는 옵션이 있었지만, 구버전에서만 지원하는듯 했다.

방법은 window.onunload 이벤트를 이용하는 것이다.
window.load 이벤트와 반대로 페이지가 종료될 때 함께 실행되는 함수라고 보면 된다.
다음 예제에서는 pop 이라는 전역변수를 선언한 뒤 버튼을 클릭할 때 객체를 리턴받고,
onunload 시 pop을 닫아 열렸던 팝업을 닫아준다.


<script>
var pop;
window.onunload = function() { pop.close(); }
</script>
<input onclick="pop = window.open('', '_blank', 'dialog,width=320,height=150,scrollbars=0'); " type="button" value="팝업" />

결과는 현재 이 글에 적용되어 있다.
아래 버튼을 누르면 작은 빈 창이 뜰텐데, 이 페이지를 닫거나 새로고침, 뒤로가기 해보면 함께 닫히는 것을 볼 수 있다.




- 참고 사이트: https://stackoverflow.com/questions/33523873/close-child-window-on-f5-refresh

[jQuery] option 태그 주석 처리하는 방법 (select 검색 기능 만들기)


Laptop
운영체제 Windows 10 Pro 64bit
개발환경 Chrome 버전 78.0.3904.108
jQuery 1.9.1

select 내부의 option 태그를 조건에 따라 보이거나 숨기고 싶을때, <span>태그로 둘러쌈으로써 구현할 수 있다.
jquery로 .wrap(), .unwrap() 함수를 이용하면 된다.

예)
<select>
  <option value="C">C</option>
  <option value="C++">C++</option>
  <option value="Java">Java</option>
  <option value="JavaScript">JavaScript</option>
</select>


$("select option[value='C']").wrap("<span/>");


<select>
  <span><option value="C">C</option></span>
  <option value="C++">C++</option>
  <option value="Java">Java</option>
  <option value="JavaScript">JavaScript</option>
</select>

단, unrwrap 시 html 구조가 select > span > option이 되므로 선택자 입력 시 주의해야한다. (지금의 경우에는 위 wrap 코드에서 unwrap으로만 바꾸면 된다.)

이것을 응용하여 검색창에 입력된 단어를 포함하는 내용만 나오도록 option을 조정하는 기능을 만들 수 있다.




- 참고 사이트: https://stackoverflow.com/questions/36066953/css-hide-options-from-select-menu-on-iphone-safari/44332652

2019년 11월 27일 수요일

[jQuery] 숫자만 입력되는 input 칸 만들기 (+ 날짜 포맷)


Laptop
운영체제 Windows 10 Pro 64bit
개발환경 Chrome 버전 78.0.3904.108
jQuery 1.9.1

입력칸에서 숫자만 입력받아야 할 경우, 입력 이벤트를 받아 정규 표현식을 사용하여 입력한 값이 숫자가 아닐 경우 지워버리는 기능과
이를 응용하여 사용자가 숫자를 입력할때 날짜 포맷으로 자동으로 바뀌도록 하고, 맞는 날짜인지 체크하는 예제이다.