: 일반적인 개발 언어처럼 SQL문들을 순서대로 실행할 수 있게하는 SQL
SHOW [ERROS|WARNINGS];
[값] INTO [변수명]
DECLARE [변수명] [변수 타입];
: 절차형 SQL은 내부에서 세미콜론(;)을 사용하므로 절차형 SQL 구문을 구분하기 어려움. 따라서, 다른 문자($$ 나 //)를 사용하여 절차형 SQL 구문을 구분.
: SQL문들의 집합으로 프로그래밍 언어의 함수와 비슷함
DELIMITER $$ -- $$ or // 자주 사용
CREATE {OR REPLACE} PROCEDURE [프로시저명](파라미터)
{IS [지역변수명] [자료형(크기)];, ...}
BEGIN
[control | sql | exception | transaction]
END $$
DELIMITER;
in
& out
sql
문이 존재해야 함DML
, DCL
unique
옵션을 가지는 속성에 중복 데이터를 삽입할 때[EXECUTE|EXEC|CALL] [프로시저명(인자)];
DROP PROCEDURE {IF EXISTS} [프로시저명];
DELIMITER //
CREATE OR REPLACE PROCEDURE emp_change_s(i_사원번호 IN INT)
BEGIN
UPDATE 급여 SET 지급방식='s' WHERE 사원번호=i_사원번호;
exception
WHEN program_error THEN
ROLLBACK;
COMMIT;
END //
DELIMITER ;
```sql
DELIMITER //
CREATE PROCEDURE return_session_count(IN channelName varchar(64), INOUT
totalRecord int)
BEGIN
SELECT COUNT(1) INTO totalRecord FROM session_details
WHERE channel = channelName;
END //
DELIMITER ;
SET @facebook_count = 0;
CALL return_session_count('Facebook', @facebook_count);
SELECT @facebook_count;
```
: Stored Procedure와 사용 방법이 동일
SUM()
, AVG()
DELIMITER $$ -- $$ or // 자주 사용
CREATE {or REPLACE} FUNCTION[사용자 정의 함수명](파라미터)
RETURNS [리턴자료형]
[DETERMINISTIC | NON DETERMINISTIC]
{IS [지역변수명] [자료형(크기)];, ...}
BEGIN
[control | sql | exception]
RETURN ([반환 값 | 변수]);
END$$
sql
문이 존재해야 함select
문💡 DETERMINISTIC VS NON DITERMINISTIC
- DETERMINISTIC : 입력 동일 -> 결과 무조건 동일
- NON DITERMINISTIC : 입력 동일 -> 결과 비동일 가능 (ex> random 값)
SELECT [사용자 정의 함수명] FROM [테이블명];
INSERT INTO [테이블명](속성명) VALUES (사용자 정의 함수명);
DELETE FROM [테이블명] WHERE [속성명] = [사용자 정의 함수명];
UPDATE [테이블명] SET [속성명] = [사용자 정의 함수명];
DROP FUNCTION [사용자 정의 함수명];
DELIMITER $$
CREATE FUNCTION GET_S_성별(i_성별코드 IN INT)
RETURN VARCHAR(2)
DETERMINISTIC
BEGIN
IF i_성별코드 = 1 THEN
RETURN '남자';
ELSE
RETURN '여자';
END IF;
END$$
```sql
DELIMITER $$
CREATE FUNCTION Channel_Type(channel varchar(32))
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE channel_type VARCHAR(20);
IF channel in ('Facebook', 'Instagram', 'Tiktok') THEN
SET channel_type = 'Social Network';
ELSEIF channel in ('Google', 'Naver') THEN
SET channel_type = 'Search Engine';
ELSE
SET channel_type = channel;
END IF;
RETURN (channel_type);
END$$
```
: INSERT/DELETE/UPDATE 실행 전 후에 관련 작업이 자동으로 실행되게 하는 절차형 SQL
CREATE {OR REPLACE} TRIGGER [트리거명] -- 트리거명 작명법 : 트리거 시기_동작_이름
{트리거 시기} {동작} on [테이블명]
{FOR EACH ROW} -- 모든 레코드마다 트리거가 작동되면 명시
{when (조건식)}
BEGIN
[control | sql | exception];
END;
insert
delete
update
sql
문이 존재해야 함DML
DROP TRIGGER {IF EXISTS} [트리거명];
CREATE TRIGGER before_update_name_gender
BEFORE UPDATE ON name_gender
FOR EACH ROW
INSERT INTO name_gender_audit
SET name = OLD.name,
gender = OLD.gender,
modified = NOW();