wiki:MariaDB 복합 SQL문

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_SQLSTATEVARCHAR(5)'00': 성공, '01%': 경고, '02%': NOT FOUND
MYSQL_ERRNOSMALLINT UNSIGNED에러 번호. 0은 성공. mysql_errno()로 에러 내용 알 수 있음
MESSAGE_TEXTVARCHAR(512)
CONSTRAINT_SCHEMAVARCHAR(64)위반한 제약조건이 있는 스키마
CONSTRAINT_NAMEVARCHAR(64)위반한 제약조건
SCHEMA_NAMEVARCHAR(64)오류가 발생한 데이터베이스
TABLE_NAMEVARCHAR(64)실패한 SQL문에서 접근한 테이블
COLUMN_NAMEVARCHAR(64)실패한 SQL문에서 접근한 컬럼
CURSOR_NAMEVARCHAR(64)오류가 발생한 커서

처음으로

Last modified 4 weeks ago Last modified on Nov 11, 2025, 6:17:38 PM
Note: See TracWiki for help on using the wiki.