이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 32.4. 비동기 윈 토토 처리버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

28.4. 비동기 명령 처리

PQexec기능이 적절함 일반적인 동기 애플리케이션에서 젠 토토을 제출하는 데 사용됩니다. 그것 그러나 이는 중요할 수 있는 몇 가지 결함이 있습니다. 일부 사용자에게:

  • PQexec젠 토토을 기다립니다 완료됩니다. 애플리케이션에 수행할 다른 작업이 있을 수 있습니다. (예: 사용자 인터페이스 유지), 이 경우 응답을 기다리는 것을 차단하고 싶지 않을 것입니다.

  • 클라이언트 응용 프로그램의 실행이 일시 중지되었으므로 결과를 기다리는 동안 신청이 어렵습니다. 진행 중인 작업을 취소하기로 결정 젠 토토. (신호 처리기에서 수행할 수 있지만 그렇지 않으면.)

  • PQexec하나만 반환할 수 있습니다.PGresult구조. 만약 제출된 젠 토토 문자열에 여러 개가 포함되어 있습니다.SQL젠 토토, 마지막을 제외한 모든 젠 토토PGresult다음에 의해 삭제됨PQexec.

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 다음과 같은 기본 함수를 사용하세요.PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult. 또한 있습니다PQsendQueryParams, PQsendPreparePQsendQuery준비됨, 다음과 함께 사용할 수 있습니다.PQgetResult복제하려면 기능PQexecParams, PQpreparePQexec준비됨각각.

PQsendQuery

기다리지 않고 서버에 명령을 제출합니다. 결과. 명령이 성공적으로 수행되면 1이 반환됩니다. 전달되고 그렇지 않은 경우 0(이 경우 다음을 사용)PQerrorMessage더 많은 정보를 얻으려면 실패에 대해).

int PQsendQuery(PGconn *conn, const char *command);

성공적으로 호출한 후PQsendQuery, 전화PQgetResult1회 이상 획득 결과입니다.PQsendQuery5월 때까지 (동일한 연결에서) 다시 호출되지 않습니다.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 프로토콜 연결.

PQgetResult

이전의 다음 결과를 기다립니다.PQsendQuery, PQsendQueryParams, PQsendPrepare또는PQsendQuery준비됨호출하고 반환합니다. 젠 토토이 완료되면 널 포인터가 반환되고 더 이상 결과가 없습니다.

PGresult *PQgetResult(PGconn *conn);

PQgetResult호출되어야 합니다 null 포인터를 반환할 때까지 반복적으로 다음을 나타냅니다. 명령이 완료되었습니다. (활성화된 명령이 없을 때 호출되는 경우,PQgetResult그냥 돌아올 거예요 한 번에 null 포인터입니다.) null이 아닌 각 결과는PQgetResult해야 합니다 동일한 방법으로 처리됨PGresult이전 접근자 기능 설명했습니다. 다음을 사용하여 각 결과 객체를 해제하는 것을 잊지 마세요.PQclear완료되면. 참고하세요PQgetResult할 것이다 젠 토토이 활성화되어 있고 필요한 경우에만 차단합니다. 응답 데이터를 아직 읽지 않았습니다.PQconsumeInput.

사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 젠 토토이 문자열에 여러 개가 포함되어 있습니다.SQL명령을 실행하면 해당 명령의 결과를 얻을 수 있습니다. 개별적으로. (이것은 간단한 형태의 중첩을 허용합니다. 그건 그렇고, 처리: 클라이언트는 다음의 결과를 처리할 수 있습니다. 서버가 이후 쿼리를 계속 작업하는 동안 명령 하나 동일한 명령 문자열입니다.) 그러나 호출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반드시 먼저 호출되지 않으면 통화 중 상태가 끝나지 않습니다.

이러한 기능을 사용하는 일반적인 응용 프로그램에는 기본 다음을 사용하는 루프선택()또는설문조사()모든 것을 기다리다 응답해야 하는 조건입니다. 조건 중 하나는 다음과 같습니다. 서버에서 사용할 수 있는 입력은 다음과 같습니다.선택()파일에서 읽을 수 있는 데이터를 의미합니다. 다음으로 식별되는 설명자PQsocket. 메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그런 다음 호출할 수 있습니다.PQisBusy, 팔로우됨 으로PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림감지하다알림메시지(참조섹션 28.7).

다음을 사용하는 클라이언트PQsendQuery/PQgetResult또한 취소를 시도할 수 있습니다. 서버에서 아직 처리 중인 젠 토토입니다. 참조섹션 28.5. 그러나 상관없이 반환 값PQ취소, 애플리케이션은 일반적인 결과 판독 순서를 계속 진행해야 합니다. 사용 중PQgetResult. 성공적인 취소하면 젠 토토이 더 빨리 종료됩니다. 그렇지 않았다면 그랬을 것입니다.

위에 설명된 기능을 사용하면 다음이 가능합니다. 데이터베이스 서버의 입력을 기다리는 동안 차단을 피하십시오. 그러나 여전히 응용 프로그램이 차단될 가능성이 있습니다. 서버로 출력을 보내기를 기다리고 있습니다. 이는 비교적 드문 일입니다. 그러나 매우 긴 SQL 명령이나 데이터 값이 전송되는 경우 발생할 수 있습니다. (애플리케이션이 다음을 통해 데이터를 보내는 경우 가능성이 훨씬 더 높습니다.복사단.) 이를 방지하려면 가능성과 완전한 비차단 데이터베이스 달성 동작 시 다음과 같은 추가 기능을 사용할 수 있습니다.

PQset비차단

연결의 비차단 상태를 설정합니다.

int PQsetnonblocking(PGconn *conn, int arg);

다음의 경우 연결 상태를 비차단으로 설정합니다.arg은 1이거나 다음과 같은 경우 차단됩니다.인수is 0. 정상이면 0을 반환하고, 괜찮으면 -1을 반환합니다. 오류.

비차단 상태에서 호출PQsendQuery, PQputline, PQputnbytesPQendcopy차단하지 않고 대신 다시 호출해야 하면 오류를 반환합니다.

참고하세요PQexec하지 않습니다 비차단 모드를 존중합니다. 호출되면 다음에서 작동합니다. 어쨌든 패션을 막는다.

PQis비차단

데이터베이스의 차단 상태를 반환합니다. 연결.

int PQisnonblocking(const PGconn *conn);

연결이 비차단 모드로 설정된 경우 1을 반환합니다. 차단하는 경우 0입니다.

PQflush

대기 중인 출력 데이터를 서버로 플러시하려고 시도합니다. 성공하면(또는 전송 큐가 비어 있으면) 0을 반환하고, -1을 반환합니다. 어떤 이유로든 실패한 경우, 보낼 수 없는 경우 1 아직 전송 대기열에 있는 모든 데이터(이 경우에만 가능) 연결이 비차단인 경우 발생합니다).

int PQflush(PGconn *conn);

비차단 연결에서 젠 토토이나 데이터를 보낸 후, 전화PQ플러시. 1이 반환되면 기다리세요. 소켓이 쓰기 준비 상태가 되도록 하고 다시 호출합니다. 까지 반복 0을 반환합니다. 한 번PQ플러시반환 0, 소켓이 읽기 준비가 될 때까지 기다린 다음 위에서 설명한 대로 응답합니다.