| Version 1 (modified by , 4 weeks ago) ( diff ) |
|---|
MariaDB 복합 SQL문
드디어, 프로시저가 아닌 곳에서도 복합 SQL문을 사용할 수 있다.
형식
다음과 같이 BEGIN NOT ATOMIC … END 구문 안에 복합 SQL문을 적어주면 된다. 트랜잭션을 시작하는 BEGIN과 구별하기 위해서 복합 SQL문을 시작할 때 BEGIN 대신 BEGIN NOT ATOMIC으로 쓰는 점에 주의하자.
DELIMITER //
BEGIN NOT ATOMIC
--- 여기부터 복합 SQL문을 적어주면 된다.
...
END//
DELIMITER ;
예제
예를 들어 다음과 같이 사용이 가능하다. 참고로 예제의 for 문은 10.3부터 지원한다.
DELIMITER //
BEGIN NOT ATOMIC
-- 에러 발생시의 처리
declare exit handler for sqlexception
begin
-- 에러 갯수 불러옴
get diagnostics @num_conditions = number;
for i in 1 .. @num_conditions
do
get diagnostics condition i @sqlstate = returned_sqlstate,
@errno = mysql_errno, @text = message_text;
select @sqlstate, @errno, @text;
end for;
rollback;
end;
select min(num), max(num) into @min_num, @max_num
from switch_trans_json where transtime < '2020-12-01';
for i in @min_num .. @max_num
do
start transaction;
insert into switch_trans_json_backup (num, json)
select num, json_compact(json) from switch_trans_json where num = i;
delete from switch_trans_json where num = i;
commit;
end for;
END//
DELIMITER ;
GET DIAGNOSTICS 명령은 가장 최근의 SQL문에서 생성한 다음과 같은 정보를 볼 수 있다. 이 명령은 10.0부터 가능하다.
| 항목 | TYPE | 설명 |
| RETURNED_SQLSTATE | VARCHAR(5) | '00': 성공, '01%': 경고, '02%': NOT FOUND |
| MYSQL_ERRNO | SMALLINT UNSIGNED | 에러 번호. 0은 성공. mysql_errno()로 에러 내용 알 수 있음 |
| MESSAGE_TEXT | VARCHAR(512) | |
| CONSTRAINT_SCHEMA | VARCHAR(64) | 위반한 제약조건이 있는 스키마 |
| CONSTRAINT_NAME | VARCHAR(64) | 위반한 제약조건 |
| SCHEMA_NAME | VARCHAR(64) | 오류가 발생한 데이터베이스 |
| TABLE_NAME | VARCHAR(64) | 실패한 SQL문에서 접근한 테이블 |
| COLUMN_NAME | VARCHAR(64) | 실패한 SQL문에서 접근한 컬럼 |
| CURSOR_NAME | VARCHAR(64) | 오류가 발생한 커서 |
Note:
See TracWiki
for help on using the wiki.
