| | 1 | [[PageOutline]] |
| | 2 | = MariaDB 복합 SQL문 = |
| | 3 | |
| | 4 | 드디어, 프로시저가 아닌 곳에서도 복합 SQL문을 사용할 수 있다. |
| | 5 | |
| | 6 | |
| | 7 | == 형식 == |
| | 8 | |
| | 9 | 다음과 같이 BEGIN NOT ATOMIC ... END 구문 안에 복합 SQL문을 적어주면 된다. 트랜잭션을 시작하는 BEGIN과 구별하기 위해서 복합 SQL문을 시작할 때 BEGIN 대신 BEGIN NOT ATOMIC으로 쓰는 점에 주의하자. |
| | 10 | {{{ |
| | 11 | DELIMITER // |
| | 12 | BEGIN NOT ATOMIC |
| | 13 | |
| | 14 | --- 여기부터 복합 SQL문을 적어주면 된다. |
| | 15 | ... |
| | 16 | |
| | 17 | END// |
| | 18 | DELIMITER ; |
| | 19 | }}} |
| | 20 | |
| | 21 | == 예제 == |
| | 22 | |
| | 23 | 예를 들어 다음과 같이 사용이 가능하다. 참고로 예제의 ["MariaDB FOR 루프" for 문]은 10.3부터 지원한다. |
| | 24 | {{{ |
| | 25 | DELIMITER // |
| | 26 | BEGIN NOT ATOMIC |
| | 27 | |
| | 28 | -- 에러 발생시의 처리 |
| | 29 | declare exit handler for sqlexception |
| | 30 | begin |
| | 31 | |
| | 32 | -- 에러 갯수 불러옴 |
| | 33 | get diagnostics @num_conditions = number; |
| | 34 | |
| | 35 | for i in 1 .. @num_conditions |
| | 36 | do |
| | 37 | get diagnostics condition i @sqlstate = returned_sqlstate, |
| | 38 | @errno = mysql_errno, @text = message_text; |
| | 39 | |
| | 40 | select @sqlstate, @errno, @text; |
| | 41 | |
| | 42 | end for; |
| | 43 | |
| | 44 | rollback; |
| | 45 | |
| | 46 | end; |
| | 47 | |
| | 48 | select min(num), max(num) into @min_num, @max_num |
| | 49 | from switch_trans_json where transtime < '2020-12-01'; |
| | 50 | |
| | 51 | for i in @min_num .. @max_num |
| | 52 | do |
| | 53 | start transaction; |
| | 54 | |
| | 55 | insert into switch_trans_json_backup (num, json) |
| | 56 | select num, json_compact(json) from switch_trans_json where num = i; |
| | 57 | |
| | 58 | delete from switch_trans_json where num = i; |
| | 59 | |
| | 60 | commit; |
| | 61 | |
| | 62 | end for; |
| | 63 | |
| | 64 | END// |
| | 65 | DELIMITER ; |
| | 66 | }}} |
| | 67 | |
| | 68 | GET DIAGNOSTICS 명령은 가장 최근의 SQL문에서 생성한 다음과 같은 정보를 볼 수 있다. 이 명령은 10.0부터 가능하다. |
| | 69 | ||항목||TYPE||설명|| |
| | 70 | ||RETURNED_SQLSTATE||VARCHAR(5)||'00': 성공, '01%': 경고, '02%': NOT FOUND|| |
| | 71 | ||MYSQL_ERRNO||SMALLINT UNSIGNED||에러 번호. 0은 성공. mysql_errno()로 에러 내용 알 수 있음|| |
| | 72 | ||MESSAGE_TEXT||VARCHAR(512)|||| |
| | 73 | ||CONSTRAINT_SCHEMA||VARCHAR(64)||위반한 제약조건이 있는 스키마|| |
| | 74 | ||CONSTRAINT_NAME||VARCHAR(64)||위반한 제약조건|| |
| | 75 | ||SCHEMA_NAME||VARCHAR(64)||오류가 발생한 데이터베이스|| |
| | 76 | ||TABLE_NAME||VARCHAR(64)||실패한 SQL문에서 접근한 테이블|| |
| | 77 | ||COLUMN_NAME||VARCHAR(64)||실패한 SQL문에서 접근한 컬럼|| |
| | 78 | ||CURSOR_NAME||VARCHAR(64)||오류가 발생한 커서|| |
| | 79 | |
| | 80 | ---- |
| | 81 | [WikiStart 처음으로] |