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;