이 섹션에서는 임베디드 SQL 프로그램에서 탁월한 조건과 경고를 처리하는 방법에 대해 설명합니다. 이를위한 두 개의 비 독점 시설이 있습니다.
언제든지
명령.SQLCA
변수.무지개 토토와 경고를 포착하는 간단한 방법 중 하나는 특정 조건이 발생할 때마다 특정 조치를 실행하도록 설정하는 것입니다. 일반적으로 :
exec sql 언제라도조건
action
;
조건
다음 중 하나 일 수 있습니다.
Action
다음 중 하나 일 수 있습니다.
계속
#이것은 효과적으로 조건이 무시되었음을 의미합니다. 이것은 기본입니다.
goto레이블
이동레이블
#지정된 레이블로 점프 (C 사용goto
Statement).
sqlprint
#표준 무지개 토토로 메시지를 인쇄합니다. 이것은 간단한 프로그램이나 프로토 타이핑 중에 유용합니다. 메시지의 세부 사항은 구성 할 수 없습니다.
정지
#Call출구 (1)
, 프로그램을 종료 할 예정입니다.
브레이크
#c 문장 실행break
. 이것은 루프 또는에서만 사용해야합니다.스위치
진술.
계속
#c 문을 실행계속
. 이것은 루프 문에만 사용해야합니다. 실행되면 제어 흐름이 루프 상단으로 돌아갑니다.
콜이름
(args
)
do이름
(args
)
#지정된 인수와 함께 지정된 C 함수를 호출하십시오. (이 용도는의 의미와 다릅니다.Call
및do
일반 Postgresql 문법에서.)
SQL 표준은 동작 만 제공합니다계속
andgoto
(및이동
).
간단한 프로그램에서 사용하려는 예가 있습니다. 경고가 발생하면 간단한 메시지를 인쇄하고 무지개 토토가 발생하면 프로그램을 중단합니다.
sqlwarning sqlprint가있을 때마다 EXEC SQL; sqlerror 중지 될 때마다 EXEC SQL;
진술exec sql 언제라도
| C는 C 문이 아닌 SQL 사전 처리기의 지침입니다. 설정 한 오류 또는 경고 조치는 첫 번째 사이에 동일한 조건에 대해 다른 조치가 설정되지 않는 한 핸들러가 설정된 지점 아래에 나타나는 모든 임베디드 SQL 문에 적용됩니다.exec sql 언제라도
및 C 프로그램의 제어 흐름에 관계없이 조건을 유발하는 SQL 문. 따라서 다음 두 프로그램의 프로그램 중 어느 것도 원하는 효과가 없습니다.
/* * 잘못된 */ int main (int argc, char *argv []) ... if (verbose) SQLWARNING SQLPRINT가있을 때마다 EXEC SQL; ... Exec SQL Select ...; ...
/* * 잘못된 */ int main (int argc, char *argv []) ... set_error_handler (); ... Exec SQL Select ...; ... 정적 void set_error_handler (void) SQLERROR가 중지 될 때마다 SQL EXEC;
보다 강력한 오류 처리를 위해 임베디드 SQL 인터페이스는 이름의 전역 변수를 제공합니다SQLCA
(SQL Communication Area)는 다음 구조를 갖는다 :
구조 char sqlcaid [8]; 긴 sqlabc; 긴 sqlcode; 구조 int sqlerrml; char sqlerrmc [sqlerrmc_len]; sqlerrm; char sqlerrp [8]; 긴 sqlerrd [6]; char sqlwarn [8]; char sqlstate [5]; sqlca;
(멀티 스레드 프로그램에서 모든 스레드는 자동으로 자체 사본을 얻습니다SQLCA
. 이것은 표준 C 글로벌 변수의 처리와 유사하게 작동합니다errno
.)
SQLCA
경고와 오류를 모두 다룹니다. 진술을 실행하는 동안 여러 경고 나 오류가 발생하면SQLCA
마지막 정보 만 포함됩니다.
마지막에서 무지개 토토가 발생하지 않은 경우SQLStatement,sqlca.sqlcode
|sqlca.sqlstate
"00000"
. 경고 또는 무지개 토토가 발생하면sqlca.sqlcode
부정적이며sqlca.sqlstate
"00000"
. 긍정적sqlca.sqlcode
마지막 쿼리가 0 행을 반환하는 것과 같은 무해한 조건을 나타냅니다.sqlcode
andsqlstate
두 가지 다른 무지개 토토 코드 체계입니다. 세부 사항은 아래에 나타납니다.
마지막 SQL 문이 성공하면SQLCA.SQLERRD [1]
해당되는 경우 처리 된 행의 OID를 포함하고SQLCA.SQLERRD [2]
명령에 적용 가능한 경우 처리 된 행 또는 반환 된 행의 수를 포함합니다.
무지개 토토 또는 경고의 경우SQLCA.SQLERRM.SQLERRMC
무지개 토토를 설명하는 문자열이 포함됩니다. 필드SQLCA.SQLERRM.SQLERRML
저장된 무지개 토토 메시지의 길이를 포함합니다SQLCA.SQLERRM.SQLERRMC
(의 결과strlen ()
, C 프로그래머에게는 실제로 흥미롭지 않음). 일부 메시지는 너무 길어서 고정 크기에 맞지 않습니다SQLERRMC
배열; 그들은 잘릴 것입니다.
경고의 경우SQLCA.SQLWARN [2]
로 설정되었습니다w
. (다른 모든 경우에, 그것은와 다른 것으로 설정됩니다.W
.) ifsqlca.sqlwarn [1]
로 설정되었습니다W
, 호스트 변수에 저장 될 때 값이 잘 렸습니다.sqlca.sqlwarn [0]
로 설정되었습니다W
다른 요소 중 하나가 경고를 표시하도록 설정된 경우
필드SQLCAID
, SQLABC
, SQLERRP
및 나머지 요소SQLERRD
andsqlwarn
현재 유용한 정보가 포함되어 있지 않습니다.
구조SQLCA
는 SQL 표준에 정의되어 있지 않지만 다른 여러 SQL 데이터베이스 시스템에서 구현됩니다. 정의는 핵심에서 비슷하지만 휴대용 응용 프로그램을 작성하려면 다른 구현을주의 깊게 조사해야합니다.
다음은의 사용을 결합한 예입니다.언제든지
andSQLCA
, 내용을 인쇄SQLCA
무지개 토토가 발생한 경우. 이것은 더 설치하기 전에 디버깅 또는 프로토 타이핑 애플리케이션에 유용 할 것입니다“사용자 친화적”무지개 토토 핸들러.
SQLERROR를 호출 할 때마다 EXEC SQL PRINT_SQLCA (); 무효의 print_sqlca () fprintf (stderr, "==== SQLCA ==== \ n"); fprintf (stderr, "sqlcode : %ld \ n", sqlca.sqlcode); fprintf (stderr, "sqlerrm.sqlerrml : %d \ n", sqlca.sqlerrm.sqlerrml); fprintf (stderr, "sqlerrm.sqlerrmc : %s \ n", sqlca.sqlerrm.sqlerrmc); fprintf (stderr, "sqlerrd : %ld %ld %ld %ld %ld %ld \ n", sqlca.sqlerrd [0], sqlca.sqlerrd [1], sqlca.sqlerrd [2], sqlca.sqlerrd [3], sqlca.sqlerrd [4], sqlca.sqlerrd [5]); fprintf (stderr, "sqlwarn : %d %d %d %d %d %d %d %d %d \ n", sqlca.sqlwarn [0], sqlca.sqlwarn [1], sqlca.sqlwarn [2], sqlca.sqlwarn [3], sqlca.sqlwarn [4], sqlca.sqlwarn [5], sqlca.sqlwarn [6], sqlca.sqlwarn [7]; fprintf (stderr, "sqlstate : %5s \ n", sqlca.sqlstate); fprintf (stderr, "================ \ n");
결과는 다음과 같이 보일 수 있습니다 (여기서는 틀린 테이블 이름으로 인한 오류) :
==== SQLCA ==== sqlcode : -400 sqlerrm.sqlerrml : 49 SQLERRM.SQLERRMC : 관계 "PG_DATABASEP"관계는 38 행에 존재하지 않습니다 SQLERRD : 0 0 0 0 0 SQLWARN : 0 0 0 0 0 0 0 SQLSTATE : 42P01 ===============
sqlstate
vs.sqlcode
#필드sqlca.sqlstate
및sqlca.sqlcode
는 오류 코드를 제공하는 두 가지 다른 체계입니다. 둘 다 SQL 표준에서 파생되었지만sqlcode
는 표준의 SQL-92 에디션에서 더 이상 사용되지 않았으며 이후 버전에서 삭제되었습니다. 따라서 새로운 응용 프로그램은 강력히 사용하도록 권장됩니다sqlstate
.
sqlstate
는 5 자 배열입니다. 다섯 문자에는 다양한 오류 및 경고 조건의 코드를 나타내는 숫자 또는 상단 문자가 포함되어 있습니다.sqlstate
계층 적 체계가 있습니다. 처음 두 문자는 조건의 일반 클래스를 나타내고 마지막 세 문자는 일반 조건의 서브 클래스를 나타냅니다. 성공적인 상태는 코드로 표시됩니다00000
. 그만큼sqlstate
코드는 대부분 SQL 표준에 정의되어 있습니다. 그만큼postgresql서버 기본적으로 지원sqlstate
무지개 토토 코드; 따라서 모든 애플리케이션 에서이 무지개 토토 코드 체계를 사용하여 높은 수준의 일관성을 달성 할 수 있습니다. 자세한 내용은 참조PostgreSQL : 문서 : 17 : 부록 A. PostgreSQL 메이저 토토 사이트 코드.
sqlcode
24753_25255PostgreSQL일부 특정 할당sqlcode
사용을위한 값은 숫자 값과 상징적 이름으로 아래에 나열되어 있습니다. 이들은 다른 SQL 구현에 휴대 할 수 없음을 기억하십시오. 응용 프로그램의 포팅을 단순화하려면sqlstate
Scheme, 해당sqlstate
도 나열됩니다. 그러나 두 체계 사이에 일대일 또는 일대일 매핑이 없으므로 (실제로는 다수입니다) 글로벌 상담해야합니다.sqlstate
Listing inPostgreSQL : 문서 : 17 : 부록 A. PostgreSQL 메이저 토토 사이트 코드각각의 경우.
이들은 할당되었습니다sqlcode
값 :
ecpg_no_error
) #오류가 없습니다. (SQLSTATE 00000)
ecpg_not_found
) #이것은 마지막 명령이 0 행을 검색하거나 처리했거나 커서의 끝에 있음을 나타내는 무해한 조건입니다. (SQLSTATE 02000)
루프에서 커서를 처리 할 때이 코드를 사용하여 루프를 중단 할 때를 감지하는 방법 으로이 코드를 사용할 수 있습니다..
while (1) Exec SQL Fetch ...; if (sqlca.sqlcode == ecpg_not_found) 부서지다;
그러나찾을 수 없을 때마다 휴식을 취하십시오
내부적으로 효과적으로 수행하므로 일반적으로 이것을 명시 적으로 기록하는 데 이점이 없습니다.
ecpg_out_of_memory
) #가상 메모리가 소진되었음을 나타냅니다. 숫자 값은로 정의됩니다.-enomem
. (SQLSTATE YE001)
ecpg_unsupported
) #사전 처리기가 라이브러리가 모르는 것을 생성했음을 나타냅니다. 아마도 당신은 호환되지 않는 버전의 사전 처리기와 라이브러리를 실행하고있을 것입니다. (SQLSTATE YE002)
ecpg_too_many_arguments
) #이는 명령이 예상 한 명령보다 더 많은 호스트 변수를 지정했음을 의미합니다. (SQLSTATE 07001 또는 07002)
ecpg_too_few_arguments
) #이는 명령이 예상했던 것보다 더 적은 호스트 변수를 지정했음을 의미합니다. (SQLSTATE 07001 또는 07002)
ecpg_too_many_matches
) #이것은 쿼리가 여러 행을 반환했지만 명령문은 하나의 결과 행을 저장할 준비가되었음을 의미합니다 (예 : 지정된 변수가 배열이 아니기 때문에). (SQLSTATE 21000)
ecpg_int_format
) #호스트 변수는 유형입니다int
및 데이터베이스의 데이텀은 다른 유형이며로 해석 할 수없는 값을 포함합니다int
. 라이브러리 사용strtol ()
이 변환의 경우. (SQLSTATE 42804)
ecpg_uint_format
) #호스트 변수는 유형입니다서명되지 않은 int
그리고 데이터베이스의 데이텀은 다른 유형이며로 해석 할 수없는 값을 포함합니다.부호없는 int
. 라이브러리 사용strtoul ()
이 변환의 경우. (SQLSTATE 42804)
ecpg_float_format
) #호스트 변수는 유형입니다float
및 데이터베이스의 데이텀은 다른 유형이며 A로 해석 할 수없는 값을 포함합니다.float
. 라이브러리 사용strtod ()
이 변환의 경우. (SQLSTATE 42804)
ecpg_numeric_format
) #호스트 변수는 유형입니다숫자
및 데이터베이스의 데이텀은 다른 유형이며 A로 해석 할 수없는 값을 포함합니다.숫자
값. (SQLSTATE 42804)
ecpg_interval_format
) #호스트 변수는 유형입니다간격
그리고 데이터베이스의 데이텀은 다른 유형이며로 해석 할 수없는 값을 포함합니다.간격
값. (SQLSTATE 42804)
ecpg_date_format
) #호스트 변수는 유형입니다날짜
및 데이터베이스의 데이텀은 다른 유형이며 A로 해석 할 수없는 값을 포함합니다날짜
값. (SQLSTATE 42804)
ecpg_timestamp_format
) #호스트 변수는 유형입니다타임 스탬프
및 데이터베이스의 데이텀은 다른 유형이며 A로 해석 할 수없는 값을 포함합니다타임 스탬프
값. (SQLSTATE 42804)
ecpg_convert_bool
) #이것은 호스트 변수가 유형임을 의미합니다bool
그리고 데이터베이스의 데이텀은 아니야't'
NOR'F'
. (SQLSTATE 42804)
ecpg_empty
) #진술은PostgreSQL서버가 비어있었습니다. (이것은 일반적으로 임베디드 SQL 프로그램에서 발생할 수 없으므로 내부 오류를 가리킬 수 있습니다.) (SQLSTATE YE002)
ecpg_missing_indicator
) #널 값이 반환되었고 널 표시기 변수가 공급되지 않았습니다. (SQLSTATE 22002)
ecpg_no_array
) #배열이 필요한 장소에서 일반 변수가 사용되었습니다. (SQLSTATE 42804)
ecpg_data_not_array
) #데이터베이스는 배열 값이 필요한 장소에서 일반 변수를 반환했습니다. (SQLSTATE 42804)
ecpg_array_insert
) #값을 배열에 삽입 할 수 없습니다. (SQLSTATE 42804)
ECPG_NO_CONN
) #프로그램은 존재하지 않는 연결에 액세스하려고 시도했습니다. (SQLSTATE 08003)
ecpg_not_conn
) #프로그램은 존재하지만 열려있는 연결에 액세스하려고 시도했습니다. (이것은 내부 오류입니다.) (sqlstate ye002)
ecpg_invalid_stmt
) #사용하려는 진술은 준비되지 않았습니다. (SQLSTATE 26000)
ecpg_informix_duplication_key
) #중복 키 오류, 고유 한 제약 조건 위반 (Informix 호환성 모드). (SQLSTATE 23505)
ecpg_unknown_descriptor
) #지정된 설명자를 찾을 수 없었습니다. 사용하려는 진술은 준비되지 않았습니다. (SQLSTATE 33000)
ecpg_invalid_descriptor_index
) #지정된 서술자 인덱스는 범위를 벗어났습니다. (SQLSTATE 07009)
ecpg_unknown_descriptor_item
) #잘못된 디스크립터 항목이 요청되었습니다. (이것은 내부 오류입니다.) (sqlstate ye002)
ecpg_var_not_numeric
) #동적 문을 실행하는 동안 데이터베이스는 숫자 값을 반환했으며 호스트 변수는 숫자가 아닙니다. (SQLSTATE 07006)
ecpg_var_not_char
) #동적 명령문 실행 중에 데이터베이스는 비수체 값을 반환했으며 호스트 변수는 숫자였습니다. (SQLSTATE 07006)
ecpg_informix_subselect_not_one
) #하위 쿼리의 결과는 단일 행이 아닙니다 (Informix 호환성 모드). (SQLSTATE 21000)
ECPG_PGSQL
) #일부 무지개 토토로 인한PostgreSQL서버. 메시지에는의 무지개 토토 메시지가 포함됩니다.PostgreSQLServer.
ECPG_TRANS
) #thePostgreSQLServer는 트랜잭션을 시작, 커밋 또는 롤백 할 수 없다는 신호를 보냈습니다. (SQLSTATE 08007)
ecpg_connect
) #데이터베이스에 대한 연결 시도는 성공하지 못했습니다. (SQLSTATE 08001)
ecpg_duplice_key
) #중복 키 오류, 고유 한 제약 조건 위반. (SQLSTATE 23505)
ecpg_subselect_not_one
) #하위 쿼리의 결과는 단일 행이 아닙니다. (SQLSTATE 21000)
ecpg_warning_unknown_portal
) #잘못된 커서 이름이 지정되었습니다. (SQLSTATE 34000)
ecpg_warning_in_transaction
) #거래가 진행 중입니다. (SQLSTATE 25001)
ecpg_warning_no_transaction
) #활성 (진행중인) 트랜잭션이 없습니다. (sqlstate 25p01)
ecpg_warning_portal_exists
) #기존 커서 이름이 지정되었습니다. (SQLSTATE 42P03)
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면