Oracle 2 - ynjch97/YNJCH_WIKI GitHub Wiki

1. GTT(Global Temporary Table, μ „μ—­ μž„μ‹œ ν…Œμ΄λΈ”)

  • Oracleμ—μ„œ μ‚¬μš©ν•˜λŠ” μž„μ‹œ ν…Œμ΄λΈ”μ„ Global Temporary ν…Œμ΄λΈ”μ΄λΌκ³  함
  • 생성 방법에 따라 νŠΈλžœμž­μ…˜ GTT, μ„Έμ…˜ GTT둜 ꡬ뢄
  • νŠΈλžœμž­μ…˜ GTT : 같은 νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œλ§Œ 데이터가 μœ μ§€
  • μ„Έμ…˜ GTT : 같은 μ„Έμ…˜ λ‚΄μ—μ„œ 데이터가 μœ μ§€

1-1. νŠΈλžœμž­μ…˜ GTT

  • νŠΈλžœμž­μ…˜μ΄ μ‚΄μ•„ μžˆλŠ” λ™μ•ˆμ—λ§Œ 데이터가 μœ μ§€λ¨
  • CREATE λ‹€μŒμ— "GLOBAL TEMPORARY", 맨 λ§ˆμ§€λ§‰μ— "ON COMMIT DELETE ROWS" ꡬ문을 μΆ”κ°€
  • ON COMMIT DELETE ROWS : COMMIT μ‹œμ— rowλ₯Ό μ‚­μ œν•˜λΌλŠ” 의미
    • DML둜 GTT ν…Œμ΄λΈ”μ— 데이터λ₯Ό 생성, μˆ˜μ •ν•  λ‹Ήμ‹œμ—λŠ” 데이터가 남아 μžˆμ§€λ§Œ COMMIT을 μ‹€ν–‰ν•˜λ©΄ λͺ¨λ“  데이터(Row)κ°€ 없어짐
    • μƒλž΅μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 이 ꡬ문을 λΉΌκ³  GTTλ₯Ό μƒμ„±ν•˜λ©΄ λ””ν΄νŠΈλ‘œ νŠΈλžœμž­μ…˜ GTTκ°€ λ§Œλ“€μ–΄μ§
CREATE GLOBAL TEMPORARY TABLE ν…Œμ΄λΈ”λͺ… (
    컬럼1 λ°μ΄ν„°νƒ€μž…, ...
)
[ON COMMIT DELETE ROWS];

1-1-1. νŠΈλžœμž­μ…˜ GTT 예제

  • μ•„λž˜μ™€ 같이 ν…Œμ΄λΈ” 생성
CREATE GLOBAL TEMPORARY TABLE TX_GTT (
    NO      NUMBER,
    NAME    VARCHAR(20)
)
ON COMMIT DELETE ROWS;
  • 데이터 INSERT ν›„, COMMIT μ „ν›„μ˜ 데이터 μœ μ§€ μ—¬λΆ€ ν™•μΈν•˜κΈ°
DECLARE
    txGttCnt NUMBER;
BEGIN
    INSERT INTO TX_GTT (NO, NAME)
    SELECT 1, 'Kate' FROM DUAL
    UNION ALL 
    SELECT 2, 'Bob' FROM DUAL
    UNION ALL
    SELECT 3, 'Alex' FROM DUAL
    ;
    SELECT COUNT(1) INTO txGttCnt FROM TX_GTT;
    dbms_output.put_line('txGttCnt : ' || txGttCnt);
    COMMIT;
    SELECT COUNT(1) INTO txGttCnt FROM TX_GTT;
    dbms_output.put_line('txGttCnt : ' || txGttCnt);
END
;

/* κ²°κ³Ό
txGttCnt : 6
txGttCnt : 0
*/

1-2. μ„Έμ…˜ GTT

  • 같은 μ„Έμ…˜ 내에 μžˆλŠ” ν•œ 데이터가 μœ μ§€λ¨
  • ON COMMIT PRESERVE ROWSλŠ” COMMIT을 μ‹€ν–‰ν•œ 후에도 데이터(둜우)λ₯Ό λ³΄μ‘΄ν•˜λΌλŠ” 뜻
  • COMMIT 여뢀에 상관없이 같은 μ„Έμ…˜μ—μ„œ 데이터가 보쑴됨(λ‹€λ₯Έ μ„Έμ…˜μ— μžˆλŠ” μ‚¬μš©μžλŠ” 이 데이터λ₯Ό κ³΅μœ ν•  수 μ—†μŒ)
    • μ„Έμ…˜μ—μ„œλ§Œ 데이터가 곡유되며, μ„Έμ…˜μ„ μ’…λ£Œν•˜λ©΄ λ°μ΄ν„°λŠ” 사라짐
    • ν…Œμ΄λΈ” 이름 μ•žμ— '#'이 λΆ™λŠ” MSSQL의 μž„μ‹œ ν…Œμ΄λΈ”κ³Ό 같은 νŠΉμ„±μ„ 가짐
CREATE GLOBAL TEMPORARY TABLE ν…Œμ΄λΈ”λͺ… (
    컬럼1 λ°μ΄ν„°νƒ€μž…, ...
)
ON COMMIT PRESERVE ROWS;

1-2-1. μ„Έμ…˜ GTT 예제

  • μ•„λž˜μ™€ 같이 ν…Œμ΄λΈ” 생성
CREATE GLOBAL TEMPORARY TABLE SS_GTT (
    NO      NUMBER,
    NAME    VARCHAR(20)
)
ON COMMIT PRESERVE ROWS;
  • 데이터 INSERT ν›„, COMMIT μ „ν›„μ˜ 데이터 μœ μ§€ μ—¬λΆ€ ν™•μΈν•˜κΈ°
DECLARE
    ssGttCnt NUMBER;
BEGIN
    INSERT INTO SS_GTT
    SELECT 1, 'Alex' FROM DUAL
    UNION ALL 
    SELECT 2, 'Rose' FROM DUAL
    UNION ALL 
    SELECT 3, 'Peter' FROM DUAL;
    SELECT COUNT(1) INTO ssGttCnt FROM SS_GTT;
    dbms_output.put_line('ssGttCnt : ' || ssGttCnt);
    COMMIT;
    SELECT COUNT(1) INTO ssGttCnt FROM SS_GTT;
    dbms_output.put_line('ssGttCnt : ' || ssGttCnt);
END;

/* κ²°κ³Ό
ssGttCnt : 6
ssGttCnt : 6
*/

1-3. GTT의 νŠΉμ§•

  • GTT의 ν•œκ³„
    • νŒŒν‹°μ…˜ GTTλ₯Ό λ§Œλ“€ 수 μ—†μŒ
    • GTT에 μΈλ±μŠ€λŠ” λ§Œλ“€ 수 μžˆμœΌλ‚˜ μ™Έλž˜ν‚€λ₯Ό λ§Œλ“€ 수 μ—†μŒ
    • λ³‘λ ¬λ‘œ UPDATE, DELETE, MERGE 문을 μ‹€ν–‰ν•  수 μ—†μŒ
    • GTT μ»¬λŸΌμœΌλ‘œλŠ” 쀑첩 ν…Œμ΄λΈ” νƒ€μž…μ„ μ‚¬μš©ν•  수 μ—†μŒ
  • GTT의 ν™œμš©

   μ—¬λŸ¬ 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•΄μ„œ λ³΅μž‘ν•œ 연산을 μˆ˜ν–‰ν•œ κ²°κ³Όλ₯Ό λ³΄μ—¬μ£ΌλŠ” 리포트λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ° ν•΄λ‹Ή κ²°κ³Όλ₯Ό μ‚°μΆœν•˜κΈ°μ—λŠ” 단일 SELECT문으둜 κ΅¬ν˜„ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€κ³  ν•˜μž. 이럴 λ•Œ, κ³Όκ±°μ—λŠ” μ΅œμ’… 리포트 ꡬ쑰에 맞게 ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  ν”„λ‘œμ‹œμ € μ•ˆμ—μ„œ μ—¬λŸ¬ 단계에 걸쳐 데이터λ₯Ό μž…λ ₯ν•˜κ³  μ‘°μž‘ν•΄ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό λ§Œλ“€μ—ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 리포트 ν™”λ©΄μ—μ„œλŠ” WHERE 쑰건도 ν•„μš” μ—†λŠ” λ‹¨μˆœ SELECT문만 μ‹€ν–‰ν•˜λ©΄ 됐닀.
   ν•˜μ§€λ§Œ 이 방법은, λ‹€λ₯Έ μ„Έμ…˜μ˜ μ‚¬μš©μžκ°€ 거의 λ™μ‹œμ— 같은 ν”„λ‘œμ‹œμ €λ₯Ό μ‹€ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό μ‘°νšŒν•˜λ©΄ 데이터가 μ€‘λ³΅λ˜κ±°λ‚˜ λˆ„λ½λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  μ†Œμ§€κ°€ μžˆλ‹€. ν•˜μ§€λ§Œ GTTλ₯Ό μ‚¬μš©ν•˜λ©΄ 데이터가 μ„Έμ…˜λ³„λ‘œ κ΄€λ¦¬λ˜λ―€λ‘œ 데이터가 κΌ¬μ΄λŠ” ν˜„μƒμ΄ λ°œμƒν•  κ°€λŠ₯성은 거의 없을 뿐만 μ•„λ‹ˆλΌ μ›ν•˜λ˜ κΈ°λŠ₯도 κ΅¬ν˜„ν•  수 μžˆλ‹€.

2. WITH λ¬Έ

  • 이름을 κ°€μ§„ SubQuery Block을 μ •μ˜ν•œ ν›„ μ‚¬μš©ν•˜λŠ” ꡬ문
  • Query의 전체적인 가독성을 높이고, μž¬μ‚¬μš©ν•  수 있음
    • 였라클 곡유 λ©”λͺ¨λ¦¬μ— μž„μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜μ—¬ 반볡 μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ„λ‘ 함
    • 자주 μ‹€ν–‰λ˜λŠ” 경우 ν•œ 번만 Parsing되고 Plan κ³„νšμ΄ 수립됨
    • 쿼리의 μ„±λŠ₯ ν–₯상 : 동일 ν…Œμ΄λΈ” 접근을 μ΅œμ†Œν™”ν•˜λ©° λ©”λͺ¨λ¦¬μ— μƒμ„±λœ μž„μ‹œ ν…Œμ΄λΈ”μ—μ„œ ν•„μš”ν•œ 데이터λ₯Ό λ©”λͺ¨λ¦¬λ‘œ μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— λ””μŠ€ν¬ IO둜 ν…Œμ΄λΈ”μ— μ ‘κ·Όν•˜λŠ” 것보닀 효율적
  • κ³„μΈ΅ν˜• 쿼리 κ΅¬ν˜„ κ°€λŠ₯
  • λŒ€λΆ€λΆ„μ˜ DBMSμ—μ„œ 지원, λͺ¨λ“  DMLμ—μ„œ μ‚¬μš© κ°€λŠ₯
  • μ°Έκ³ ) UNION ALL, DECODE/CASE, WITH, ROLLUP/Grouping Sets λ¬Έμž₯λ“€κ³Ό μ„œλ‘œ ν˜•νƒœ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜μ—¬ ν•¨κ»˜ μ“°λ©΄ μ„±λŠ₯상 유리

2-1. WITH 문 ꡬ쑰

  • WITH [별λͺ…] AS (SUB QUERY)
  • 컬럼λͺ…은 μƒλž΅ν•  수 있음
  • μ‰Όν‘œ(,)둜 κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬κ°œλ₯Ό μ •μ˜ κ°€λŠ₯
  • λ¨Όμ € μƒμ„±λœ SubQueryλŠ” λ‚˜μ€‘μ— μƒμ„±ν•˜λŠ” SubQueryμ—μ„œ μ‚¬μš©ν•  수 있음
    • 예) [별λͺ…2]μ—μ„œ [별λͺ…1]을 μ‚¬μš©ν•  수 있음.
WITH [별λͺ…1] [(컬럼λͺ…1 [,컬럼λͺ…2])] AS (
    SUB QUERY
) [,별λͺ…2 AS ...]
MAIN QUERY
  • Oracleμ—μ„œλŠ” ν•œ 번만 μ‚¬μš©λ˜λ©΄ Inline View, 두 번 이상 μ‚¬μš©λ˜λ©΄ Materialize View둜 μ²˜λ¦¬ν•¨
    • ν•œλ²ˆλ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ [ORA-01762] 였λ₯˜ λ°œμƒ
    • /*+ Materialize */ 힌트둜 Inline Viewλ₯Ό Materialize View둜 λ§Œλ“€ 수 있음

2-2. WITH 문 예제

WITH TEMP_USER_INFO_SCORE AS 
(
    SELECT I.USER_NUM, I.USER_NM, I.USER_BIRTH, S.USER_GRADE
    FROM USER_INFO I
    LEFT JOIN USER_SCORE S
    ON I.USER_NUM = S.USER_NUM
)
SELECT 
    TEMP.USER_NUM
    , TEMP.USER_NM
    , TEMP.USER_BIRTH
    , TEMP.USER_GRADE
FROM TEMP_USER_INFO_SCORE TEMP
WHERE USER_GRADE <> 'A'
;

3. μ‚¬μš©μž ν•¨μˆ˜

3-1. κΈ°λ³Έ ν•¨μˆ˜ 생성

  • CREATE OR REPLACE : CREATE 만 μ‚¬μš©ν•˜μ—¬ 재컴파일 μ‹œ 였λ₯˜κ°€ λ°œμƒν•˜λ―€λ‘œ REPLACE λ₯Ό ν•¨κ»˜ μ‚¬μš©
CREATE OR REPLACE FUNCTION [ν•¨μˆ˜λͺ…] ([νŒŒλΌλ―Έν„°λͺ…] [νŒŒλΌλ―Έν„°νƒ€μž…])
    RETURN [λ¦¬ν„΄νƒ€μž…]
IS
    [λ³€μˆ˜λͺ…] [λ³€μˆ˜νƒ€μž…]
BEGIN
    (μƒλž΅)
    RETURN [리턴값(λ³€μˆ˜ λ“±)]
END;
/

-- μ˜ˆμ‹œ
CREATE OR REPLACE FUNCTION fn_get_user_nm (p_user_num NUMBER)
    RETURN VARCHAR2
IS 
    v_user_nm VARCHAR2(30);
BEGIN
    SELECT USER_NM INTO v_user_nm
    FROM USER_INFO 
    WHERE USER_NUM = p_user_num;
    RETURN v_user_nm;
END; 
/

3-1-1. κΈ°λ³Έ ν•¨μˆ˜ μ‚¬μš©

SELECT
    USER_NUM
    , fn_get_user_nm(USER_NUM) AS USER_NM
FROM USER_SCORE;

3-2. νŒŒμ΄ν”„λΌμΈ ν…Œμ΄λΈ” ν•¨μˆ˜ 생성

  • Object νƒ€μž…, ν…Œμ΄λΈ” νƒ€μž…μ„ μ •μ˜ν•˜μ—¬, νŒŒμ΄ν”„λΌμΈ ν…Œμ΄λΈ” ν•¨μˆ˜ 생성 μ‹œμ— μ‚¬μš©
  • νŒŒμ΄ν”„λΌμΈ ν…Œμ΄λΈ” ν•¨μˆ˜ μ‚¬μš© μ‹œ μž₯점
    • κ²°κ³Ό 집합이 λͺ¨λ‘ 생성될 λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³  μ™„λ£Œλœ 뢀뢄을 순차적으둜 μ²˜λ¦¬ν•˜λ―€λ‘œ 응닡 μ‹œκ°„μ΄ 빠름
    • 슀트리밍(ν•˜λ‚˜μ˜ 연산을 μ’…λ£Œν•˜μ§€ μ•Šκ³  일련의 연산을 순차적으둜 반볡 처리)
    • νŒŒμ΄ν”„λΌμ΄λ‹(μ—¬λŸ¬ 연산을 μ—°μ†ν•΄μ„œ μˆ˜ν–‰)
    • μœ μ—°μ„±(SQL λ¬Έμž₯으둜 ν‘œν˜„ν•˜κΈ° μ–΄λ €μš΄ 과정을 μœ μ—°ν•˜κ²Œ 처리)

3-2-1. Object νƒ€μž… 생성

  • ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•˜λŠ” λ ˆμ½”λ“œμ˜ μŠ€ν‚€λ§ˆλ₯Ό μ •μ˜
CREATE OR REPLACE TYPE OBJ_STORE AS OBJECT (
    USER_NUM NUMBER(10)
    , USER_NM VARCHAR2(20)
    , STORE_NUM NUMBER(10)
    , STORE_NM VARCHAR2(50) 
    , STORE_ADDR VARCHAR2(30)
);

3-2-2. ν…Œμ΄λΈ” νƒ€μž… μ •μ˜

  • ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•˜λŠ” λ ˆμ½”λ“œμ˜ μ§‘ν•©(ν…Œμ΄λΈ”) μ •μ˜
CREATE OR REPLACE TYPE TABLE_STORE AS TABLE OF OBJ_STORE;

3-2-3. νŒŒμ΄ν”„λΌμΈ ν…Œμ΄λΈ” ν•¨μˆ˜ μž‘μ„±

  • RETURN νƒ€μž…μ€ μœ„μ˜ ν…Œμ΄λΈ” νƒ€μž…μœΌλ‘œ μ§€μ •
  • λ³€μˆ˜λŠ” μœ„μ˜ Object νƒ€μž…μœΌλ‘œ μ§€μ •
CREATE OR REPLACE FUNCTION [ν•¨μˆ˜λͺ…] ([νŒŒλΌλ―Έν„°λͺ…] [νŒŒλΌλ―Έν„°νƒ€μž…])
    RETURN [λ¦¬ν„΄νƒ€μž…] PIPELINED
IS
    [λ³€μˆ˜λͺ…] [λ³€μˆ˜νƒ€μž…]
BEGIN
    (μƒλž΅)
    RETURN;
END;

-- μ˜ˆμ‹œ
CREATE OR REPLACE FUNCTION fn_get_store_info (p_user_num NUMBER)
    RETURN TABLE_STORE PIPELINED
IS
    v_obj_store OBJ_STORE;
BEGIN 
    FOR v_row IN (
        SELECT 
            U.USER_NUM
            , fn_get_user_nm(U.USER_NUM) AS USER_NM
            , S.STORE_NUM
            , S.STORE_NM
            , S.STORE_ADDR
        FROM USER_INFO U
        INNER JOIN STORE_INFO S
        ON U.USER_NUM = S.OWNER_NUM
        WHERE U.USER_NUM = p_user_num
    ) LOOP
        v_obj_store := OBJ_STORE(v_row.USER_NUM, v_row.USER_NM, v_row.STORE_NUM, v_row.STORE_NM, v_row.STORE_ADDR);
        PIPE ROW(v_obj_store);
    END LOOP;
    RETURN;
END;
/

3-2-4. νŒŒμ΄ν”„λΌμΈ ν…Œμ΄λΈ” ν•¨μˆ˜ μ‚¬μš©

SELECT * FROM TABLE(fn_get_store_info(1));

3-3. ν•¨μˆ˜ 쑰회

SELECT * FROM USER_SOURCE WHERE TYPE = 'FUNCTION';
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION';
-- μ‚­μ œ
DROP FUNCTION [ν•¨μˆ˜λͺ…];

4. ν”„λ‘œμ‹œμ €

  • Transact-SQL λ¬Έμž₯의 μ§‘ν•©
  • ν”„λ‘œμ‹œμ €λŠ” PL/SQL을 톡해 λ§Œλ“€μ–΄μ§
  • 자주 μ‚¬μš©ν•˜λŠ” SQL문을 ν”„λ‘œμ‹œμ €λ‘œ λ§Œλ“€μ–΄ ν•„μš”ν•  λ•Œλ§ˆλ‹€ 호좜, μ‚¬μš©ν•˜μ—¬ μž‘μ—… 효율 증가
  • νŠΉμ • λ‘œμ§μ„ μ²˜λ¦¬ν•  뿐 κ²°κ³Ό 값은 λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ
  • SQL Serverμ—μ„œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° κΈ°λŠ₯
  • λΉ λ₯΄κ³ , μ—¬λŸ¬ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ³΅μœ ν•  수 있음

4-1. ν”„λ‘œμ‹œμ € 생성

  • IN 뒀에 인수의 νƒ€μž…μ„ μ„ μ–Έ
    • [νŒŒλΌλ―Έν„°λͺ…] IN VARCHAR2 (byte ν¬κΈ°λŠ” μ§€μ •ν•˜μ§€ μ•ŠμŒ)
    • [νŒŒλΌλ―Έν„°λͺ…] IN [ν…Œμ΄λΈ”λͺ…].[컬럼λͺ…]%TYPE;
    • [νŒŒλΌλ―Έν„°λͺ…] IN [ν…Œμ΄λΈ”λͺ…].[컬럼λͺ…]%TYPE := κ°’;
    • [νŒŒλΌλ―Έν„°λͺ…] IN [ν…Œμ΄λΈ”λͺ…].[컬럼λͺ…]%TYPE DEFAULT κ°’;
CREATE OR REPLACE PROCEDURE [ν”„λ‘œμ‹œμ €λͺ…] ([νŒŒλΌλ―Έν„°λͺ…] IN [νŒŒλΌλ―Έν„°νƒ€μž…])
IS
    [λ³€μˆ˜λͺ…] [λ³€μˆ˜νƒ€μž…];
BEGIN
    (μƒλž΅)
END;
/
  • νšŒμ› 정보 INSERTν•˜λŠ” ν”„λ‘œμ‹œμ € μ˜ˆμ‹œ
CREATE OR REPLACE PROCEDURE PROC_INSERT_USER
    (p_user_nm IN VARCHAR2, p_user_birth IN VARCHAR2)
IS
    v_user_num NUMBER(10) := USER_NUM_SEQ.NEXTVAL;
BEGIN
    INSERT INTO USER_INFO values(v_user_num, p_user_nm, p_user_birth);
    COMMIT;
END;
/

4-2. ν”„λ‘œμ‹œμ € μ‹€ν–‰

  • EXEC [ν”„λ‘œμ‹œμ €λͺ…](); 을 μž…λ ₯ν•˜μ—¬ μ‹€ν–‰
EXEC PROC_INSERT_USER('YNJCH','20000101');
  • DECLARE μ ˆμ—μ„œ λ³€μˆ˜ μ„ μ–Έ ν›„ μ‹€ν–‰
DECLARE 
    param1 VARCHAR2(30) := 'TEST';
    param2 VARCHAR2(30) := '19991231';
BEGIN
    PROC_INSERT_USER(param1, param2);
END;
/

4-2-1. ν”„λ‘œμ‹œμ € μ˜ˆμ™Έ 처리

  • BEGIN~END 사이에 μ•„λž˜μ™€ 같이 μ˜ˆμ™Έ 처리
(SELECT λ¬Έ)

EXCEPTION 
    WHEN NO_DATA_FOUND THEN dbms_output.put_line('EXCEPTION 1'); RETURN;
    WHEN OTHERS THEN dbms_output.put_line('EXCEPTION 2'); RETURN;

4-3. ν”„λ‘œμ‹œμ € 쑰회

  • μž‘μ„±λœ ν”„λ‘œμ‹œμ €λ₯Ό μ°ΎκΈ° μœ„ν•΄ 데이터 사전 이용
  • 데이터 사전은 λŒ€λ¬Έμžλ‘œ 값을 μ €μž₯ν•˜λ―€λ‘œ 유의
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE';
SELECT * FROM USER_SOURCE WHERE TYPE = 'PROCEDURE' AND NAME = '[ν”„λ‘œμ‹œμ €λͺ…]';

4-3-1. ν”„λ‘œμ‹œμ € μˆ˜μ •μΌ 쑰회

SELECT	
    OBJECT_TYPE, OBJECT_NAME, STATUS
    , TO_CHAR(CREATED, 'YYYY.MM.DD HH24:MI:SS') AS CRT_DT
    , TO_CHAR(LAST_DDL_TIME, 'YYYY.MM.DD HH24:MI:SS') AS UPD_DT 
FROM USER_OBJECTS	
WHERE OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE') -- νƒ€μž… μ§€μ • (ν•¨μˆ˜, ν”„λ‘œμ‹œμ € λ“±)
    AND TO_CHAR(LAST_DDL_TIME, 'YYYYMMDD') > '20230101'
    AND OBJECT_NAME LIKE '%TB_PDBS_PD_BAS%'
ORDER BY 1, 2, 3, 4, 5;