| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| 스포츠 토토 베트맨 PostgreSQL : 문서 : 9.2 : 명령 실행 함수 | 위로 | 31장.libpq- C 라이브러리 | 다음 | |
그PQexec기능이 적절함
일반적인 동기 애플리케이션에서 무지개 토토을 제출하는 데 사용됩니다. 그것
그러나 몇 가지 결함이 있으며 이는 중요할 수 있습니다.
일부 사용자:
PQexec무지개 토토을 기다립니다
완료됩니다. 애플리케이션에 수행할 다른 작업이 있을 수 있음
(예: 사용자 인터페이스 유지), 이 경우
응답을 기다리는 것을 차단하고 싶지 않을 것입니다.
클라이언트 응용 프로그램의 실행이 일시 중지되었으므로 결과를 기다리는 동안 신청이 어렵습니다. 진행 중인 작업을 취소하기로 결정 무지개 토토. (신호 처리기에서 수행할 수 있지만 그렇지 않으면.)
PQexec하나만 반환할 수 있습니다.PGresult구조. 만약
제출된 무지개 토토 문자열에 여러 개가 포함되어 있습니다.SQL무지개 토토, 마지막을 제외한 모든 무지개 토토PGresult다음에 의해 삭제됨PQexec.
PQexec항상 수집합니다.
무지개 토토의 전체 결과를 단일로 버퍼링합니다.PGresult. 이것이 단순화되면서
애플리케이션에 대한 오류 처리 논리는 다음과 같습니다.
많은 행이 포함된 결과에는 실용적이지 않습니다.
이러한 제한이 마음에 들지 않는 응용 프로그램은 대신
다음과 같은 기본 함수를 사용하세요.PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult. 또한 있습니다PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribePrepared및PQsendDescribePortal, 다음과 함께 사용할 수 있습니다.PQgetResult복제하려면
기능PQexecParams,
PQprepare, PQexec준비됨, PQdescribe준비됨및PQdescribePortal각각.
PQsendQuery기다리지 않고 서버에 명령을 제출합니다.
결과. 명령이 성공적으로 수행되면 1이 반환됩니다.
전달되고 그렇지 않은 경우 0(이 경우 다음을 사용)PQerrorMessage더 많은 정보를 얻으려면
실패에 대해).
int PQsendQuery(PGconn *conn, const char *command);
성공적으로 호출한 후PQsendQuery, 전화PQgetResult1회 이상 획득
결과입니다.PQsendQuery다음까지 (동일한 연결에서) 다시 호출할 수 없습니다.PQgetResult다음을 반환했습니다.
명령이 완료되었음을 나타내는 널 포인터입니다.
PQsendQueryParams서버에 무지개 토토과 별도의 매개변수를 제출합니다. 결과를 기다리지 않고.
int PQsendQueryParams(PGconn *conn,
const char *명령,
정수 nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
이것은 다음과 같습니다.PQsendQuery쿼리 매개변수 제외
쿼리 문자열과 별도로 지정할 수 있습니다. 는
함수의 매개변수는 다음과 동일하게 처리됩니다.PQexecParams. 좋아요PQexecParams, 그렇지 않습니다
2.0 프로토콜 연결에서 작동하며 하나만 허용합니다.
쿼리 문자열의 무지개 토토입니다.
PQsendPrepare다음과 함께 준비된 명령문을 생성하라는 요청을 보냅니다. 완료를 기다리지 않고 지정된 매개변수를 사용합니다.
int PQsendPrepare(PGconn *conn,
const char *stmt이름,
const char *쿼리,
정수 nParams,
const Oid *paramTypes);
이것은 비동기 버전입니다.PQprepare: 가능하다면 1을 반환합니다.
요청을 발송하고 그렇지 않은 경우 0입니다. 성공한 후
전화해, 전화해PQgetResult에
서버가 성공적으로 생성되었는지 확인
준비된 진술. 함수의 매개변수가 처리됩니다.
동일하게PQprepare.
좋아요PQprepare, 그렇지 않습니다
2.0 프로토콜 연결에서 작업합니다.
PQsendQuery준비됨다음과 함께 준비된 명령문을 실행하라는 요청을 보냅니다. 결과를 기다리지 않고 주어진 매개변수를 사용합니다.
int PQsendQueryPrepared(PGconn *conn,
const char *stmt이름,
정수 nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
이것은 다음과 유사합니다.PQsendQueryParams, 그러나 명령은
실행은 이전에 준비된 이름을 지정하여 지정됩니다.
쿼리 문자열을 제공하는 대신 문. 함수의
매개변수는 다음과 동일하게 처리됩니다.PQexec준비됨. 좋아요PQexec준비됨, 다음에서는 작동하지 않습니다.
2.0 프로토콜 연결.
PQsendDescribe준비됨다음에 관한 정보를 얻기 위해 요청을 제출합니다. 지정된 준비된 명령문을 기다리지 않고 완료.
int PQsendDescribePrepared(PGconn *conn, const char *stmtName);
이것은 비동기 버전입니다.PQdescribe준비됨: 다음과 같은 경우 1을 반환합니다.
요청을 전달할 수 있었고 그렇지 않은 경우 0입니다. 이후
통화 성공, 통화PQgetResult결과를 얻으려면. 는
함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribe준비됨. 좋다PQdescribe준비됨, 그렇죠
2.0 프로토콜 연결에서는 작동하지 않습니다.
PQsendDescribePortal다음에 관한 정보를 얻기 위해 요청을 제출합니다. 완료를 기다리지 않고 지정된 포털입니다.
int PQsendDescribePortal(PGconn *conn, const char *portalName);
이것은 비동기 버전입니다.PQdescribePortal: 그렇다면 1을 반환합니다.
요청을 전달할 수 있고 그렇지 않은 경우 0입니다. 이후
통화 성공, 통화PQgetResult결과를 얻으려면. 는
함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribePortal. 좋아요PQdescribePortal, 그렇지 않습니다
2.0 프로토콜 연결에서 작업합니다.
PQgetResult이전의 다음 결과를 기다립니다.PQsendQuery, PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribePrepared, 또는PQsendDescribePortal호출하고 반환
그것. 무지개 토토이 완료되면 널 포인터가 반환됩니다.
그러면 더 이상 결과가 나오지 않습니다.
PGresult *PQgetResult(PGconn *conn);
PQgetResult호출되어야 합니다
null 포인터를 반환할 때까지 반복적으로 다음을 나타냅니다.
명령이 완료되었습니다. (활성화된 명령이 없을 때 호출되는 경우,PQgetResult그냥 돌아올 거예요
한 번에 null 포인터입니다.) null이 아닌 각 결과는PQgetResult해야 합니다
동일한 방법으로 처리됨PGresult이전 접근자 기능
설명했습니다. 다음을 사용하여 각 결과 객체를 해제하는 것을 잊지 마세요.PQclear완료되면.
참고하세요PQgetResult할 것이다
무지개 토토이 활성화되어 있고 필요한 경우에만 차단합니다.
응답 데이터를 아직 읽지 않았습니다.PQconsumeInput.
참고:그때에도
PQresultStatus치명적인 상황을 나타냅니다. 오류,PQgetResult해야 한다 허용하기 위해 널 포인터를 반환할 때까지 호출됩니다.libpq처리하기 위해 오류 정보를 완전히 삭제합니다.
사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 무지개 토토이
문자열에 여러 개가 포함되어 있습니다.SQL명령을 실행하면 해당 명령의 결과를 얻을 수 있습니다.
개별적으로. (이것은 간단한 형태의 중첩을 허용합니다.
그건 그렇고, 처리: 클라이언트는 다음의 결과를 처리할 수 있습니다.
서버가 이후 쿼리를 계속 작업하는 동안 명령 하나
동일한 명령 문자열입니다.)
다음으로 얻을 수 있는 자주 원하는 또 다른 기능PQsendQuery그리고PQgetResult대규모 쿼리 결과를 검색 중입니다.
한 번에 행. 이에 대해서는에서 논의됩니다.섹션 31.5.
저절로 호출됨PQgetResult서버가 완료될 때까지 클라이언트가 계속 차단됩니다.
다음SQL무지개 토토. 이것은 할 수 있다
두 가지 추가 기능을 적절하게 사용하면 피할 수 있습니다.
PQconsumeInput서버에서 입력이 가능하다면, 그것을 소비하세요.
int PQconsumeInput(PGconn *conn);
PQconsumeInput보통
나타내는 1을 반환합니다."오류 없음",
하지만 어떤 종류의 문제가 있으면 0을 반환합니다.
사례PQerrorMessage될 수 있습니다
상담). 결과는 어떤 것인지 말하지 않습니다.
입력 데이터가 실제로 수집되었습니다. 통화 후PQconsumeInput,
응용프로그램에서 확인할 수 있습니다PQisBusy및/또는PQ알림그들의 상태가
변경되었습니다.
PQconsumeInput될 수 있습니다
애플리케이션이 처리할 준비가 되지 않은 경우에도 호출됩니다.
아직 결과나 알림이 없습니다. 함수는 읽을 것입니다
사용 가능한 데이터를 버퍼에 저장하여 다음과 같은 오류가 발생합니다.선택()읽기 준비 완료
떠나라는 표시. 따라서 애플리케이션은 다음을 사용할 수 있습니다.PQconsumeInput깨끗하게선택()조건
즉시 결과를 검토하고 여유 시간에 결과를 검토하십시오.
PQisBusy명령이 사용 중이면 1을 반환합니다. 즉,PQgetResult기다리는 것을 차단할 것입니다.
입력. 0 반환은 다음을 나타냅니다.PQgetResult확실하게 호출할 수 있습니다.
차단하지 않는 것입니다.
int PQisBusy(PGconn *conn);
PQisBusy그 자체로는 그렇지 않을 것입니다
서버에서 데이터를 읽으려고 시도합니다. 그러므로PQconsumeInput반드시
먼저 호출되지 않으면 통화 중 상태가 끝나지 않습니다.
이러한 기능을 사용하는 일반적인 응용프로그램에는 기본
다음을 사용하는 루프선택()또는설문조사()모든 것을 기다리다
응답해야 하는 조건입니다. 조건 중 하나는 다음과 같습니다.
서버에서 사용할 수 있는 입력은 다음과 같습니다.선택()파일에서 읽을 수 있는 데이터를 의미합니다.
descriptor identified byPQsocket.
메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다.
그런 다음 호출할 수 있습니다.PQisBusy, 팔로우됨
으로PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림탐지하다알림메시지(참조섹션 31.8).
다음을 사용하는 클라이언트PQsendQuery/PQgetResult또한 취소를 시도할 수 있습니다.
서버에서 아직 처리 중인 무지개 토토입니다. 참조섹션 31.6. 그러나 상관없이
반환 값PQ취소,
애플리케이션은 일반적인 결과 판독 순서를 계속 진행해야 합니다.
사용 중PQgetResult. 성공적인
취소하면 무지개 토토이 더 빨리 종료됩니다.
그렇지 않았다면 그랬을 것입니다.
위에 설명된 기능을 사용하면 다음이 가능합니다. 데이터베이스 서버의 입력을 기다리는 동안 차단을 피하십시오. 그러나 여전히 응용 프로그램이 차단될 가능성이 있습니다. 서버로 출력을 보내기를 기다리고 있습니다. 이는 비교적 드문 일입니다. 그러나 매우 긴 SQL 명령이나 데이터 값이 전송되는 경우 발생할 수 있습니다. (애플리케이션이 다음을 통해 데이터를 보내는 경우 가능성이 훨씬 더 높습니다.복사단.) 이를 방지하려면 가능성과 완전한 비차단 데이터베이스 달성 동작 시 다음과 같은 추가 기능을 사용할 수 있습니다.
PQset비차단연결의 비차단 상태를 설정합니다.
int PQsetnonblocking(PGconn *conn, int arg);
다음의 경우 연결 상태를 비차단으로 설정합니다.arg는 1이거나 다음과 같은 경우 차단됩니다.argis 0. 정상이면 0을 반환하고, 괜찮으면 -1을 반환합니다. 오류.
비차단 상태에서 호출PQsendQuery, PQputline, PQputnbytes및PQendcopy차단하지 않고 대신
다시 호출해야 하면 오류를 반환합니다.
참고하세요PQexec하지 않습니다
비차단 모드를 존중합니다. 호출되면 다음에서 작동합니다.
어쨌든 패션을 막는다.
PQis비차단데이터베이스의 차단 상태를 반환합니다. 연결.
int PQisnonblocking(const PGconn *conn);
연결이 비차단 모드로 설정된 경우 1을 반환합니다. 차단하는 경우 0입니다.
PQflush대기 중인 출력 데이터를 서버로 플러시하려고 시도합니다. 성공하면(또는 전송 큐가 비어 있으면) 0을 반환하고, -1을 반환합니다. 어떤 이유로든 실패한 경우, 보낼 수 없는 경우 1 아직 전송 대기열에 있는 모든 데이터(이 경우에만 가능) 연결이 비차단인 경우 발생합니다).
int PQflush(PGconn *conn);
비차단 연결에서 무지개 토토이나 데이터를 보낸 후,
전화PQflush. 1이 반환되면 기다리세요.
소켓이 읽기 또는 쓰기 가능 상태가 되도록 합니다. 만약에
쓰기 준비, 호출PQ플러시다시. 만약에
읽을 준비가 되었습니다. 전화하세요.PQconsumeInput그런 다음 전화하세요PQflush다시. 까지 반복하세요.PQflush0을 반환합니다. (확인이 필요합니다.
읽기 준비를 위해 다음을 사용하여 입력을 배출합니다.PQconsumeInput, 서버가 차단할 수 있기 때문입니다.
우리에게 데이터를 보내려고 합니다. NOTICE 메시지는 읽지 않습니다.
읽을 때까지 데이터입니다.) 한 번PQflush0을 반환하고 소켓이
읽을 준비가 된 다음 위에 설명된 대로 응답을 읽습니다.