| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 토토 커뮤니티 실행 함수 | PostgreSQL : 문서 : 9.3 : LIBPQ -C 토토 커뮤니티 | 31장.libpq- C 라이브러리 | 다음 | |
그PQexec기능이 적절함
일반적인 동기 애플리케이션에서 명령을 제출하는 데 사용됩니다. 그것은 가지고있다
그러나 일부에게는 중요할 수 있는 몇 가지 결함이 있습니다.
사용자:
PQexec명령이 수행되기를 기다립니다.
완료되었습니다. 애플리케이션에 수행할 다른 작업이 있을 수 있습니다(예:
사용자 인터페이스 유지), 이 경우 차단을 원하지 않습니다.
응답을 기다리고 있습니다.
클라이언트 응용 프로그램의 실행이 일시 중지되었으므로 결과를 기다리기 때문에 애플리케이션이 결정하기가 어렵습니다. 진행 중인 명령을 취소하려고 합니다. (그럴수도 있지 신호 토토기에서 수행되지만 그렇지 않으면 수행되지 않습니다.)
PQexec하나만 반환할 수 있습니다.PGresult구조. 제출된 경우
명령 문자열에 여러 개가 포함되어 있습니다.SQL명령, 마지막을 제외한 모든 명령PGresult다음에 의해 삭제됨PQexec.
PQexec항상 수집합니다.
명령의 전체 결과를 단일로 버퍼링합니다.PGresult. 이는 오류 토토를 단순화하지만
애플리케이션의 논리가 결과에 비실용적일 수 있음
많은 행을 포함합니다.
이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 다음을 사용할 수 있습니다.
기본 기능은PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult. 또한 있습니다PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribe준비됨및PQsendDescribePortal,와 함께 사용할 수 있습니다.PQgetResult복제하려면
기능PQexecParams,
PQprepare, PQexec준비됨, PQdescribe준비됨및PQdescribePortal각각.
PQsendQuery기다리지 않고 서버에 명령을 제출합니다.
결과. 명령이 성공적으로 전달되면 1이 반환됩니다.
그렇지 않은 경우 0입니다. 이 경우에는 다음을 사용하세요.PQerrorMessage에 대한 추가 정보를 얻으려면
실패).
int PQsendQuery(PGconn *conn, const char *command);
성공적으로 호출한 후PQsendQuery, 전화PQgetResult한 번 이상 획득하여
결과.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 프로토콜 연결.
PQsendDescribePrepared지정된 항목에 대한 정보를 얻기 위한 요청을 제출합니다. 완료를 기다리지 않고 준비된 진술.
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준비됨, PQsendDescribe준비됨, 또는PQsendDescribePortal호출하고 반환합니다. 널
명령이 완료되면 포인터가 반환되고
더 이상 결과가 없습니다.
PGresult *PQgetResult(PGconn *conn);
PQgetResult호출되어야 합니다
null 포인터를 반환할 때까지 반복적으로
명령이 완료되었습니다. (활성화된 명령이 없을 때 호출되는 경우,PQgetResult그냥 널 포인터를 반환할 것입니다
한 번.) 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
return은 다음을 나타냅니다.PQgetResult할 수 있다
차단하지 않는다는 확신을 가지고 호출됩니다.
int PQisBusy(PGconn *conn);
PQisBusy자체는 시도하지 않을 것입니다
서버에서 데이터를 읽습니다. 그러므로PQconsumeInput먼저 호출되어야 합니다. 그렇지 않으면 사용 중입니다.
상태는 결코 끝나지 않을 것입니다.
이러한 기능을 사용하는 일반적인 응용프로그램에는 기본
다음을 사용하는 루프선택()또는설문조사()모든 조건을 기다리다
응답해야 한다는 것입니다. 조건 중 하나가 입력됩니다.
서버에서 사용할 수 있습니다.선택()파일에서 읽을 수 있는 데이터를 의미합니다.
다음으로 식별되는 설명자PQsocket.
메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그러면 가능하다
전화PQisBusy, 이어서PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림감지하다알림메시지(참조섹션 31.8).
다음을 사용하는 클라이언트PQsendQuery/PQgetResult명령 취소를 시도할 수도 있습니다.
아직 서버에서 토토 중입니다. 참조섹션 31.6. 하지만 반품 여부와 상관없이
값PQ취소, 애플리케이션
다음을 사용하여 일반적인 결과 읽기 시퀀스를 계속해야 합니다.PQgetResult. 성공적인
취소하면 명령이 다음보다 빨리 종료됩니다.
그렇지 않았다면 그랬을 것입니다.
위에 설명된 기능을 사용하면 다음을 피할 수 있습니다. 데이터베이스 서버의 입력을 기다리는 동안 차단됩니다. 그러나, 애플리케이션이 대기를 차단할 가능성은 여전히 있습니다. 서버로 출력을 보냅니다. 이는 상대적으로 흔하지 않지만 매우 긴 SQL 명령이나 데이터 값이 전송되면 발생합니다. (이것은 애플리케이션이 다음을 통해 데이터를 보내는 경우 훨씬 더 가능성이 높습니다.복사25181_25325
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);
비차단 연결에서 명령이나 데이터를 보낸 후,
전화PQ플러시. 1이 반환되면 기다리세요.
소켓이 읽기 또는 쓰기 가능 상태가 되도록 합니다. 만약에
쓰기 준비, 호출PQflush다시. 만약에
읽을 준비가 되었습니다. 전화하세요.PQconsumeInput그런 다음 전화하세요PQ플러시다시. 까지 반복하세요.PQ플러시0을 반환합니다. (다음을 확인해야 합니다.
읽기 준비가 되어 있고 다음을 사용하여 입력을 배출합니다.PQconsumeInput, 서버가 차단할 수 있기 때문입니다.
우리에게 데이터를 보내려고 합니다. NOTICE 메시지는 읽지 않습니다.
읽을 때까지 데이터입니다.) 한 번PQflush0을 반환하고 소켓이 읽기 준비가 될 때까지 기다린 다음
위에서 설명한 대로 응답합니다.