이 섹션에서는 임베디드 SQL 프로그램에서 탁월한 조건과 경고를 처리하는 방법에 대해 설명합니다. 이를위한 두 개의 비 독점 시설이 있습니다.
언제라도
명령.SQLCA
가변.무지개 토토와 경고를 포착하는 간단한 방법 중 하나는 특정 조건이 발생할 때마다 특정 조치를 실행하도록 설정하는 것입니다. 일반적으로 :
exec sql 언제라도조건
Action
;
조건
다음 중 하나 일 수 있습니다.
Action
다음 중 하나 일 수 있습니다.
계속
#이것은 효과적으로 조건이 무시된다는 것을 의미합니다. 이것은 기본입니다.
GOTO레이블
이동레이블
#지정된 레이블로 점프 (C 사용goto
Statement).
sqlprint
#표준 무지개 토토로 메시지를 인쇄합니다. 이것은 간단한 프로그램이나 프로토 타이핑 중에 유용합니다.
STOP
#Call출구 (1)
, 프로그램을 종료 할 예정입니다.
브레이크
#c 문장 실행break
. 이것은 루프 또는에서만 사용해야합니다.스위치
진술.
계속
#c 문장 실행계속
. 이것은 루프 문에만 사용해야합니다.
Call이름
(args
)
do이름
(args
)
#지정된 인수와 함께 지정된 C 함수를 호출하십시오. (이 용도는의 의미와 다릅니다.Call
anddo
일반 Postgresql 문법에서.)
SQL 표준은 동작 만 제공합니다계속
andGOTO
(및이동
).
간단한 프로그램에서 사용할 수있는 예입니다. 경고가 발생하면 간단한 메시지를 인쇄하고 무지개 토토가 발생하면 프로그램을 중단합니다.
SQLWARNING SQLPRINT가있을 때마다 EXEC SQL;
진술exec sql 언제라도
는 C 문이 아닌 SQL 사전 처리기의 지침입니다. 설정 한 오류 또는 경고 조치는 첫 번째 사이에 동일한 조건에 대해 다른 조치가 설정되지 않는 한 핸들러가 설정된 지점 아래에 나타나는 모든 임베디드 SQL 문에 적용됩니다.exec sql 언제라도
및 C 프로그램의 제어 흐름에 관계없이 조건을 유발하는 SQL 문. 따라서 다음 두 프로그램의 프로그램 중 어느 것도 원하는 효과가 없습니다.
/*
/*
보다 강력한 오류 처리를 위해 임베디드 SQL 인터페이스는 이름의 전역 변수를 제공합니다SQLCA
(SQL Communication Area)는 다음 구조를 갖는다 :
구조
(멀티 스레드 프로그램에서는 모든 스레드가 자동으로 자체 사본을 가져옵니다SQLCA
. 이것은 표준 C 글로벌 변수의 처리와 유사하게 작동합니다errno
.)
SQLCA
경고와 오류를 모두 다룹니다. 진술을 실행하는 동안 여러 경고 나 오류가 발생하면SQLCA
마지막 정보 만 포함됩니다.
마지막에서 무지개 토토가 발생하지 않은 경우SQLStatement,sqlca.sqlcode
는 0이고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 call print_sqlca ()를 호출 할 때마다 EXEC SQL;
결과는 다음과 같이 보일 수 있습니다 (여기서는 틀린 테이블 이름으로 인한 오류) :
==== SQLCA ====
sqlstate
vs.sqlcode
#필드sqlca.sqlstate
andsqlca.sqlcode
는 오류 코드를 제공하는 두 가지 다른 체계입니다. 둘 다 SQL 표준에서 파생되었지만sqlcode
는 표준의 SQL-92 에디션에서 더 이상 사용되지 않았으며 이후 버전에서 삭제되었습니다. 따라서 새로운 응용 프로그램은 강력히 사용하도록 권장됩니다sqlstate
.
sqlstate
는 5 자 배열입니다. 다섯 문자에는 다양한 오류 및 경고 조건의 코드를 나타내는 숫자 또는 상단 문자가 포함되어 있습니다.sqlstate
계층 적 체계가 있습니다. 처음 두 문자는 조건의 일반 클래스를 나타내고 마지막 세 문자는 일반 조건의 서브 클래스를 나타냅니다. 성공적인 상태는 코드로 표시됩니다00000
. 그만큼sqlstate
코드는 대부분 SQL 표준에 정의되어 있습니다. 그만큼postgresql서버 기본적으로 지원sqlstate
무지개 토토 코드; 따라서 모든 애플리케이션 에서이 무지개 토토 코드 체계를 사용하여 높은 수준의 일관성을 달성 할 수 있습니다.PostgreSQL : 문서 : 17 : 부록 A. PostgreSQL 메이저 토토 사이트 코드.
sqlcode
, 더 이상 사용되지 않은 무지개 토토 코드 체계는 간단한 정수입니다. 0의 값은 성공을 나타내고, 양수 값은 추가 정보가있는 성공을 나타내고, 음수 값은 무지개 토토를 나타냅니다.postgresql일부 특정 할당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)
그러나찾을 수 없을 때마다 휴식을 취하십시오
내부적으로 효과적으로이를 수행하므로 일반적으로 이것을 명시 적으로 기록하는 데 이점이 없습니다.
ecpg_out_of_memory
) #가상 메모리가 소진되었음을 나타냅니다. 숫자 값은로 정의됩니다.-Enomem
. (SQLSTATE YE001)
ecpg_unsupported
) #사전 처리기가 라이브러리가 모르는 것을 생성했음을 나타냅니다. 아마도 당신은 호환되지 않는 버전의 사전 처리기와 라이브러리를 실행하고있을 것입니다.
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
) #지정된 설명자를 찾을 수 없었습니다. 사용하려는 진술은 준비되지 않았습니다.
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
) #thepostgresql서버는 트랜잭션을 시작, 커밋 또는 롤백 할 수 없다는 신호를 보냈습니다. (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)
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면