๐Ÿ’ผ ์ž๊ฒฉ์ฆ/SQLD

[SQLD] SQL๊ธฐ๋ณธ&ํ™œ์šฉ : ํ•จ์ˆ˜, NULLํ•จ์ˆ˜, ๊ทธ๋ฃนํ•จ์ˆ˜, ์œˆ๋„์šฐํ•จ์ˆ˜, CASEํ‘œํ˜„์‹, ์ ˆ์ฐจํ˜• SQL, ํ”„๋กœ์‹œ์ €, ํ•จ์ˆ˜, ํŠธ๋ฆฌ๊ฑฐ

์—ฐ_์šฐ๋ฆฌ 2021. 11. 10. 01:19
๋ฐ˜์‘ํ˜•

https://lotuus.tistory.com/42

 

[SQLD] 21.11.20 ์ œ43ํšŒ SQL๊ฐœ๋ฐœ์ž ํ›„๊ธฐ, ๊ณต๋ถ€๋ฐฉ๋ฒ•, ์ •๋ฆฌ๋ณธ, 43ํšŒ ์ถœ์ œ๋ฌธ์ œ

2021๋…„ 11์›” 20์ผ ํ† ์š”์ผ ์ œ43ํšŒ SQL๊ฐœ๋ฐœ์ž ์ž๊ฒฉ์ฆ ์‹œํ—˜ ํ›„๊ธฐ ์˜ค๋Š˜ ๋ณด๊ณ ์™”๋‹ค! ๋‚ด ๊ณต๋ถ€๋ฐฉ๋ฒ•๊ณผ ์ •๋ฆฌ๋ณธ, ์ด๋ฒˆ์— ์‹œํ—˜์— ์ถœ์ œ๋œ ๋ฌธ์ œ๋“ค์„ ๊ธฐ์–ต๋‚˜๋Š”๋Œ€๋กœ ์ ์–ด๋ณด๊ฒ ๋‹ค ๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ์ถœ์ด๋‚˜ ๋ณต์›๋œ ๋ฌธ์ œ๊ฐ€

lotuus.tistory.com

 

[๋ชฉ์ฐจ]

๐Ÿ’š ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’์ด ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ์ถœ๋ ฅ์€ 1๊ฐ€์ง€๋งŒ ๋‚˜์˜จ๋‹ค.
๐Ÿ’š ๋‹จ์ผํ–‰ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’ ๋‹จ์ผํ–‰
  ๋ฌธ์žํ˜•ํ•จ์ˆ˜
  ์ˆซ์žํ˜•ํ•จ์ˆ˜
  ๋‚ ์งœ, ๋ฐ˜ํ™˜, NULLํ•จ์ˆ˜
  ๋‹ค์ค‘์กฐ๊ฑดํ•จ์ˆ˜ : CASE ํ‘œํ˜„์‹
๐Ÿ’š ๋‹ค์ค‘ํ–‰ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’ ๋‹ค์ค‘ํ–‰
  ์ง‘๊ณ„ํ•จ์ˆ˜, ๊ทธ๋ฃนํ•จ์ˆ˜
  ์œˆ๋„์šฐํ•จ์ˆ˜
    ์œˆ๋„์šฐํ•จ์ˆ˜๊ตฌ๋ฌธ
    WINDOWING์ ˆ (SQL Server ์ง€์› X)
๐Ÿ’š ์ ˆ์ฐจํ˜• SQL
  PROCEDURE ํ”„๋กœ์‹œ์ €
  USER DEFINED FUNCTION ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜
  TRIGGER ํŠธ๋ฆฌ๊ฑฐ

 

 

๐Ÿ’š ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’์ด ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ์ถœ๋ ฅ์€ 1๊ฐ€์ง€๋งŒ ๋‚˜์˜จ๋‹ค.

 

๐Ÿ’š ๋‹จ์ผํ–‰ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’ ๋‹จ์ผํ–‰

๋ฌธ์žํ˜•ํ•จ์ˆ˜

์ˆซ์žํ˜•ํ•จ์ˆ˜

๋‚ ์งœ, ๋ฐ˜ํ™˜, NULLํ•จ์ˆ˜

๐Ÿ“Œ '201501' = TO_CHAR(์„œ๋น„์Šค์ข…๋ฃŒ์ผ์‹œ, 'YYYYMM') : ์„œ๋น„์Šค์ข…๋ฃŒ์ผ์‹œ์˜ ๋…„๊ณผ ์›”์ด 2015๋…„ 01์›”๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ฐพ์•„๋‚ธ๋‹ค. 01์›” 01์ผ ~ 01์›” 31์ผ์ด ํ•ด๋‹น๋œ๋‹ค.

๐Ÿ“Œ 'TO_DATE('201501', 'YYYYMM') = ์„œ๋น„์Šค์ข…๋ฃŒ์ผ์‹œ : ์ง€์ •๋˜์ง€ ์•Š์€ DD๋Š” 01๋กœ ์ง€์ •๋˜์–ด 2015๋…„ 01์›” 01์ผ์ด ์„œ๋น„์Šค์ข…๋ฃŒ์ผ์‹œ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ฐพ์•„๋‚ธ๋‹ค.

 

๋‹ค์ค‘์กฐ๊ฑดํ•จ์ˆ˜ : CASE ํ‘œํ˜„์‹

 

 

๐Ÿ’š ๋‹ค์ค‘ํ–‰ํ•จ์ˆ˜ : ์ž…๋ ฅ๊ฐ’ ๋‹ค์ค‘ํ–‰

์ง‘๊ณ„ํ•จ์ˆ˜, ๊ทธ๋ฃนํ•จ์ˆ˜

 

์œˆ๋„์šฐํ•จ์ˆ˜

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์นผ๋Ÿผ๊ณผ ์นผ๋Ÿผ์˜ ์—ฐ์‚ฐ์€ ์‰ฌ์šด๋ฐ˜๋ฉด ํ–‰๊ณผ ํ–‰์˜ ์—ฐ์‚ฐ์€ ๋งค์šฐ ์–ด๋ ค์› ๋‹ค.

PL/SQL, T-SQL ๋“ฑ์˜ ์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ INLINE VIEW๋กœ ํ•ด๊ฒฐํ•ด์•ผํ–ˆ๋˜ ๊ฒƒ์„ ํ•จ์ˆ˜๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œˆ๋„์šฐํ•จ์ˆ˜๊ตฌ๋ฌธ

SELECT ์œˆ๋„์šฐํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜) OVER (
      [PARTITION BY ์นผ๋Ÿผ๋ช…]     //GROUP BY ์—ญํ• 
      [ORDER BY์ ˆ]                //ORDER BY ์—ญํ• 
      [WINDOWING์ ˆ]            //WHERE ์—ญํ• , SQL Server ์ง€์› X
)

FROM ํ…Œ์ด๋ธ”๋ช…;

WINDOWING์ ˆ (SQL Server ์ง€์› X)

์ข…๋ฅ˜ ์˜๋ฏธ ์˜ˆ์ œ
ROWS ํ–‰  
CURRENT ROW ํ˜„์žฌ ํ–‰  
RANGE ์นผ๋Ÿผ๊ฐ’  
BETWEEN A AND B A์™€ B์‚ฌ์ด ๊ฐ’ RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
์นผ๋Ÿผ๊ฐ’์„              ์ œํ•œ์—†์ด      ์ดํ•˜๊ฐ’์œผ๋กœ          ํ˜„์žฌํ–‰์˜
PRECEDING ์ด์ „ ํ–‰, ๋นผ๋Š” ๊ฐ’ ROWS 2 PRECEDING : ํ–‰์˜ 2ํ–‰ ์ „
RANGE 2 PRECEDING : ์นผ๋Ÿผ๊ฐ’์˜ -2
FOLLOWING ๋‹ค์Œ ํ–‰, ๋”ํ•˜๋Š” ๊ฐ’ ROWS 2 FOLLOWING : ํ–‰์˜ 2ํ–‰ ํ›„
RANGE 2 FOLLOWING : ์นผ๋Ÿผ๊ฐ’์˜ +2
UNBOUNDED ์ œํ•œ์—†์Œ ROWS UNBOUNDED PRECEDING : ์ฒซํ–‰~ํ˜„์žฌํ–‰๊นŒ์ง€
RANGE UNBOUNDED PRECEDING : ํ˜„์žฌ ์นผ๋Ÿผ๊ฐ’ ์ดํ•˜ ์ „๋ถ€

๐Ÿ“Œ ๋‹ค์Œ ์„ค๋ช… ์ค‘ ์ ์ ˆํ•œ ๊ฒƒ์€?

1) PARTITION๊ณผ GROUP BY๊ตฌ๋ฌธ์€ ์˜๋ฏธ์ ์œผ๋กœ ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค     //์œ ์‚ฌํ•˜๋‹ค

2) SUM, MAX, MIN ๋“ฑ๊ณผ ๊ฐ™์€ ์ง‘๊ณ„ WINDOW FUNCTION์„ ์‚ฌ์šฉํ•  ๋•Œ WINDOW ์ ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ง‘๊ณ„์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

3) WINDOW FUNCTION ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค        //๊ฒฐ๊ณผ๊ฑด์ˆ˜๋Š” ์ƒ๊ด€์—†๋‹ค.

4) GROUP BY ๊ตฌ๋ฌธ๊ณผ WINDOW FUNCTION์€ ๋ณ‘ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.     //๋ณ‘ํ–‰ ๋ถˆ๊ฐ€ํ•˜๋‹ค 

 

 

๋ฐ˜์‘ํ˜•

 

๐Ÿ’š ์ ˆ์ฐจํ˜• SQL

SQL๋„ ์ ˆ์ฐจ ์ง€ํ–ฅ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ ˆ์ฐจํ˜• SQL์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

์—ฐ์†์ ์ธ ์‹คํ–‰์ด๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ €์žฅ๋ชจ๋“ˆ๋กœ PROCEDURE, USER DEFINED FUNCTION, TRIGGER๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

๊ตฌ๋ถ„ PROCEDURE ํ”„๋กœ์‹œ์ € FUNCTION ํ•จ์ˆ˜ TRIGGER ํŠธ๋ฆฌ๊ฑฐ
์„ค๋ช… ํŠน์ • ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ INSERT, UPDATE, DELETE ์ž‘์—…์—
์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ
Oracle
๊ตฌ๋ฌธ
CREATE [or REPLACE] Procedure ํ”„๋กœ์‹œ์ €๋ช…
(
      ๋งค๊ฐœ๋ณ€์ˆ˜๋ช… [MODE] ๋ฐ์ดํ„ฐํƒ€์ž…, ....  )

IS [AS] ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
EXCEPTION  ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‚ด์šฉ
END;
/
CREATE Function ํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž…)
RETURN ๋ฐ์ดํ„ฐํƒ€์ž…
IS[AS] ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
  RETURN ๋ฐ˜ํ™˜ํ•  ๊ฐ’
  EXCEPTION ์˜ˆ์™ธ์‹œ ๋‚ด์šฉ
END
/
CREATE Trigger ํŠธ๋ฆฌ๊ฑฐ๋ช…
BEFORE or AFTER
INSERT or UPDATE or DELETE ON ํ…Œ์ด๋ธ”๋ช…
[FOR EACH ROW]
[WHEN ์กฐ๊ฑด์‹]
๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
END
/
SQL Server ๊ตฌ๋ฌธ CREATE Procedure ํ”„๋กœ์‹œ์ €๋ช…
  @๋งค๊ฐœ๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… [MODE], ....
AS ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
ERROR  ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‚ด์šฉ
END;
CREATE Function ํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž…)
RETURNS ๋ฐ์ดํ„ฐํƒ€์ž…
AS ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
   RETURN ๋ฐ˜ํ™˜ํ•  ๊ฐ’
END
CREATE Trigger ํŠธ๋ฆฌ๊ฑฐ๋ช…
ON ํ…Œ์ด๋ธ”๋ช…
FOR or AFTER or INSTEAD OF
INSERT or UPDATE or DELETE
AS ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰๋‚ด์šฉ
END;
์‹คํ–‰๋ฐฉ๋ฒ• EXECUTE ํ”„๋กœ์‹œ์ €๋ช…( ๋งค๊ฐœ๋ณ€์ˆ˜ ) ํ•จ์ˆ˜๋ช…( ๋งค๊ฐœ๋ณ€์ˆ˜ ) DBMS์— ์˜ํ•ด ์ž๋™์‹คํ–‰
RETURN RETURN ํ•„์ˆ˜ X RETURN ํ•„์ˆ˜ O ์‚ฌ์šฉ์•ˆํ•จ
TCL BEGIN~END์—
COMMIT, ROLLBACK ์‚ฌ์šฉ O
  BEGIN~END์—
COMMIT, ROLLBACK ์‚ฌ์šฉ X

 

PROCEDURE ํ”„๋กœ์‹œ์ €

  Oracle SQL Server
์ ˆ์ฐจํ˜• SQL PL(Procedural Language)/SQL
BLOCK ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์–ด ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
T-SQL

Stored
Procedure
์ƒ์„ฑ๋ฐฉ๋ฒ•
CREATE [or REPLACE] Procedure ํ”„๋กœ์‹œ์ €๋ช…
(
      ๋งค๊ฐœ๋ณ€์ˆ˜๋ช… [MODE] ๋ฐ์ดํ„ฐํƒ€์ž…, ....  )

IS [AS] ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰ํ•  ๋‚ด์šฉ
EXCEPTION  ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‚ด์šฉ
END;
/
CREATE Procedure ํ”„๋กœ์‹œ์ €๋ช…
  @๋งค๊ฐœ๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… [MODE], ....
AS ๋ณ€์ˆ˜์„ ์–ธ
BEGIN ์‹คํ–‰ํ•  ๋‚ด์šฉ
ERROR  ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‚ด์šฉ
END;

๋งค๊ฐœ๋ณ€์ˆ˜ MODE
- IN : ์™ธ๋ถ€์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
- OUT : ํ”„๋กœ์‹œ์ € ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ
- INOUT : IN๊ณผ OUT์˜ ๋‚ด์šฉ ๋™์‹œ์— ์ˆ˜ํ–‰


/ : ํ”„๋กœ์‹œ์ €๋ฅผ ์ปดํŒŒ์ผํ•˜๋„๋ก ๋ช…๋ นํ•˜๋Š” ๊ฒƒ.

๋งค๊ฐœ๋ณ€์ˆ˜ MODE
- VARING : ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์ด ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋„๋ก
- DEFAULT : ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ
- OUT/OUTPUT : ํ”„๋กœ์‹œ์ € ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
- READONLY : ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค


Stored
Procedure
์ˆ˜์ •๋ฐฉ๋ฒ•
REPLACE Procedure ํ”„๋กœ์‹œ์ €๋ช…... ์„ ์ž‘์„ฑํ•˜๋ฉด
์ƒˆ๋กœ์šด ๋‚ด์šฉ์œผ๋กœ ๋ฎ์–ด์“ฐ๊ฒŒ๋œ๋‹ค.
ALTER Procedure .... ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
Stored
Procedure
์‚ญ์ œ๋ฐฉ๋ฒ•
DROP Procedure ํ”„๋กœ์‹œ์ €๋ช…; DROP Procedure ํ”„๋กœ์‹œ์ €๋ช…;
Stored
Procedure
์‹คํ–‰๋ฐฉ๋ฒ•
EXECUTE ํ”„๋กœ์‹œ์ €๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜, ...); EXECUTE ํ”„๋กœ์‹œ์ €๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜, ...;
์˜ˆ์ œ CREATE Procedure p_DEPT_insert 
(  v_DEPTNO in number,
   v_dname in varchar2,
   v_loc in varchar2,
   v_result out varchar2  )
IS

cnt number := 0;
--SCALAR ๋ณ€์ˆ˜ cnt : ์ž„์‹œ๋ฐ์ดํ„ฐ 1๊ฐœ ์ €์žฅ๊ฐ€๋Šฅ
--๋Œ€์ž…์—ฐ์‚ฐ์ž :=

BEGIN
SELECT COUNT(*) INTO CNT
FROM DEPT
--์ž…๋ ฅ๋ฐ›์€ ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
--SELECT๋ฌธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผํ•œ๋‹ค.
WHERE DEPTNO = v_DEPTNO
AND ROWNUM = 1;

if cnt >0 then --๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด


   v_result := '์ด๋ฏธ ๋“ฑ๋ก๋œ ๋ถ€์„œ๋ฒˆํ˜ธ์ด๋‹ค';


   else --๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด


   INSERT INTO DEPT (DEPTNO, DNAME, LOC)
   VALUES (v_DEPTNO, v_dname, v_loc);
   -- ๋ ˆ์ฝ”๋“œ ์ž…๋ ฅ


   COMMIT; --์ปค๋ฐ‹
   v_result := '์ž…๋ ฅ ์™„๋ฃŒ!!';
end if;



EXCEPTION --์—๋Ÿฌ๋ฐœ์ƒ ์‹œ
WHEN OTHERS THEN
ROLLBACK;
v_result := 'ERROR ๋ฐœ์ƒ';
END;
/
CREATE Procedure dbo.p_DEPT_insert 
   @v_DEPTNO int,
   @v_dname varchar(30),
   @v_loc varchar(30),
   @v_result varchar(100) OUTPUT
AS
DECLARE @cnt int -- ๋ณ€์ˆ˜ ์„ ์–ธ
SET @cnt = 0
--SCALAR ๋ณ€์ˆ˜ cnt : ์ž„์‹œ๋ฐ์ดํ„ฐ 1๊ฐœ ์ €์žฅ๊ฐ€๋Šฅ
--๋Œ€์ž…์—ฐ์‚ฐ์ž =

BEGIN
SELECT @cnt=COUNT(*)
FROM DEPT
--์ž…๋ ฅ๋ฐ›์€ ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
--SELECT๋ฌธ ๊ฒฐ๊ณผ๊ฐ€ ์—†์–ด๋„ ๋œ๋‹ค.
WHERE DEPTNO = @v_DEPTNO


IF @cnt >0 --๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด

  BEGIN
  SET @v_result = '์ด๋ฏธ ๋“ฑ๋ก๋œ ๋ถ€์„œ๋ฒˆํ˜ธ์ด๋‹ค'
  RETURN
  END
ELSE --๋ถ€์„œ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด
  BEGIN
    BEGIN TRAN
    INSERT INTO DEPT (DEPTNO, DNAME, LOC)
    VALUES (@v_DEPTNO, @v_dname, @v_loc)
    -- ๋ ˆ์ฝ”๋“œ ์ž…๋ ฅ
    IF @@ERROR<>0
       BEGIN
       ROLLBACK --์—๋Ÿฌ๋ฐœ์ƒ ์‹œ
       SET @v_result = 'ERROR ๋ฐœ์ƒ'
       RETURN
       END
  ELSE
     BEGIN
     COMMIT --์ปค๋ฐ‹
     SET @v_result = '์ž…๋ ฅ ์™„๋ฃŒ!!'
     RETURN
     END
  END
END

 

 

FUNCTION ํ•จ์ˆ˜

ํ•จ์ˆ˜๋Š” ํ”„๋กœ์‹œ์ €์™€ ๋‹ฌ๋ฆฌ, RETURN์„ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

  Oracle SQL Server
ABS
๊ตฌํ˜„
์˜ˆ์ œ
CREATE Function UTIL_ABS
(v_input in number)
return NUMBER
IS


v_return number := 0; 
BEGIN
if v_input <0 then 
   v_return := v_input * -1;
else 
   v_return := v_input;
end if;

RETURN v_return; 
END;
/
CREATE Function dbo.UTIL_ABS
(@v_input int)
RETURNS int
AS
BEGIN
DECLARE @v_return int 
SET @v_return=0

IF @v_input <0 
   SET @v_return = @v_input * -1
ELSE
   SET @v_return = @v_input


RETURN @v_return; 
END

 

 

TRIGGER ํŠธ๋ฆฌ๊ฑฐ

ํŠธ๋ฆฌ๊ฑฐ๋Š” ํŠน์ • ํ…Œ์ด๋ธ”์— INSERT, UPDATE, DELETE ๋“ฑ์ด ์ˆ˜ํ–‰๋˜์—ˆ์„ ๋•Œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

ํŠธ๋ฆฌ๊ฑฐ๋Š” ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ž‘์—…์œผ๋กœ ๋ณผ์ˆ˜๋„์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ROLLBACK์„ ํ•˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ ์ž‘์—…๋‚ด์—ญ๋„ ๋ชจ๋‘ ์ทจ์†Œ๋œ๋‹ค!

  Oracle SQL Server
์˜ˆ์ œ CREATE Trigger SUMMARY_SALES
AFTER INSERT --๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž…๋ ฅ๋œ ํ›„ ํŠธ๋ฆฌ๊ฑฐ์‹คํ–‰
ON ORDER_LIST -- ํ…Œ์ด๋ธ”์— ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •
FOR EACH ROW --๊ฐ ํ–‰๋งˆ๋‹ค ํŠธ๋ฆฌ๊ฑฐ ์‹คํ–‰

DECLARE 
o_date ORDER_LIST.order_date%TYPE;
o_prod ORDER_LIST.product%TYPE;

BEGIN
o_date := :NEW.order_date;  --NEW ์‹ ๊ทœํ–‰์˜ ์ •๋ณด
o_prod := :NEW.product;


UPDATE SALES_PER_DATE
SET qty = qty + :NEW.qty,
amount = amount + :NEW.amount

WHERE sale_date = o_date
AND product = o_prod;
if SQL%NOTFOUND then 
  INSERT INTO SALES_PER_DATE
  VALUES(o_date, o_prod, :NEW.qty, :NEW.amount);
end if;
END;
/
CREATE Trigger dbo.SUMMARY_SALES 
ON ORDER_LIST -- ํ…Œ์ด๋ธ”์— ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •
AFTER INSERT --๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž…๋ ฅ๋œ ํ›„ ํŠธ๋ฆฌ๊ฑฐ์‹คํ–‰
AS

DECLARE
@o_date DATETIME,@o_prod INT,
@qty int, @amount int

BEGIN
SELECT @o_date=order_date, @o_prod=product, @qty=qty, @amount=amount
FROM inserted -- inserted ์‹ ๊ทœํ–‰์˜ ์ •๋ณด

UPDATE SALES_PER_DATE 
SET qty = qty + @qty,
amount = amount + @amount

WHERE sale_date = @o_date
AND product = @o_prod;
IF @@ROWCOUNT=0
  INSERT INTO SALES_PER_DATE
  VALUES(@o_date, @o_prod, @qty, @amount)

END

 

 

 

๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
  • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ