이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.사설 토토 사이트 : 문서 : 17 : 32.22. 예제 프로그램버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

27.16. 예제 프로그램

이러한 예와 기타 예는 디렉토리에서 찾을 수 있습니다.src/테스트/예제소스 코드에서 배포.

예 27-1.libpq예제 프로그램 1

/*
 * 테스트libpq.c
 *
 * POSTGRES 프런트엔드 라이브러리인 LIBPQ의 C 버전을 테스트합니다.
 */
#include <stdio.h
#include <stdlib.h
#include "libpq-fe.h"

정적 공백
exit_nicely(PGconn *conn)

        PQfinish(콘);
        출구(1);

정수
메인(int argc, char **argv)

        const char *conninfo;
        PGconn *콘;
        PGresult *res;
        int nFields;
        나는,
                                j;

        /*
         * 사용자가 명령줄에 매개변수를 제공하는 경우 이를 다음과 같이 사용합니다.
         * conninfo 문자열; 그렇지 않으면 기본적으로 dbname=template1로 설정됩니다.
         * 그리고 다른 모든 연결에는 환경 변수 또는 기본값을 사용합니다.
         * 매개변수.
         */
        if (argc  1)
                conninfo = argv[1];
        그렇지 않으면
                conninfo = "dbname = template1";

        /* 데이터베이스에 연결 */
        conn = PQconnectdb(conninfo);

        /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
        if (PQstatus(conn) != CONNECTION_OK)

                fprintf(stderr, "데이터베이스 연결 실패: %s",
                        PQerrorMessage(conn));
                exit_nicely(conn);

        /*
         * 여기서 테스트 사례에는 커서 사용이 포함됩니다.
         * 트랜잭션 블록 내부.  우리는 모든 것을 하나의 도구로 할 수 있었습니다
         * "select * from pg_database"의 단일 PQexec(), 하지만 그것도 너무
         * 좋은 예를 만들기에는 사소한 일입니다.
         */

        /* 트랜잭션 블록 시작 */
        res = PQexec(conn, "BEGIN");
        if (PQresultStatus(res) != PGRES_COMMAND_OK)

                fprintf(stderr, "BEGIN 명령 실패: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);

        /*
         * 더 이상 필요하지 않을 때마다 PQclear PGresult를 피해야 합니다.
         * 메모리 누수
         */
        PQclear(res);

        /*
         * 데이터베이스의 시스템 카탈로그인 pg_database에서 행을 가져옵니다.
         */
        res = PQexec(conn, "pg_database에서 *를 선택하기 위해 myportal 커서를 선언합니다.");
        if (PQresultStatus(res) != PGRES_COMMAND_OK)

                fprintf(stderr, "커서 선언 실패: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);

        PQclear(res);

        res = PQexec(conn, "myportal에서 모두 가져오기");
        if (PQresultStatus(res) != PGRES_TUPLES_OK)

                fprintf(stderr, "모두 가져오기 실패: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);

        /* 먼저 속성 이름을 인쇄합니다 */
        nFields = PQnfields(res);
        for (i = 0; i < nFields; i++)
                printf("%-15s", PQfname(res, i));
        printf("\n\n");

        /* 다음으로 행을 인쇄합니다 */
        for (i = 0; i < PQntuples(res); i++)

                for(j = 0; j < nFields; j++)
                        printf("%-15s", PQgetvalue(res, i, j));
                printf("\n");

        PQclear(res);

        /* 포털을 닫습니다... 오류를 확인하지 않습니다... */
        res = PQexec(conn, "CLOSE myportal");
        PQclear(res);

        /* 트랜잭션 종료 */
        res = PQexec(conn, "END");
        PQclear(res);

        /* 데이터베이스에 대한 연결을 닫고 정리합니다 */
        PQfinish(콘);

        0을 반환합니다.

예 27-2.libpq예제 프로그램 2

/*
 * 테스트libpq2.c
 * 비동기 알림 인터페이스 테스트
 *
 * 이 프로그램을 시작한 다음 다른 창의 psql에서 다음을 수행하십시오.
 * TBL2에 통지;
 * 이 프로그램을 종료하려면 4번 반복하세요.
 *
 * 또는 좀 더 화려하게 꾸미고 싶다면 다음을 시도해 보세요.
 * 다음 명령으로 데이터베이스를 채웁니다.
 * (src/test/examples/testlibpq2.sql에서 제공):
 *
 * 테이블 TBL1 생성(i int4);
 *
 * 테이블 TBL2 생성(i int4);
 *
 * TBL1 DO에 삽입할 때 규칙 r1을 생성합니다.
 * (TBL2 값에 삽입(new.i); TBL2에 알림);
 *
 * 이 작업을 네 번 수행합니다.
 *
 * TBL1 값에 삽입(10);
 */
#include <stdio.h
#include <stdlib.h
#include <문자열.h
#include <errno.h
#include <sys/time.h
#include "libpq-fe.h"

정적 공백
exit_nicely(PGconn *conn)

        PQfinish(콘);
        출구(1);

정수
메인(int argc, char **argv)

        const char *conninfo;
        PGconn *콘;
        PGresult *res;
        PGnotify *알림;
        int는 알림을 보내지 않습니다.

        /*
         * 사용자가 명령줄에 매개변수를 제공하는 경우 이를 다음과 같이 사용합니다.
         * conninfo 문자열; 그렇지 않으면 기본적으로 dbname=template1로 설정됩니다.
         * 그리고 다른 모든 연결에는 환경 변수 또는 기본값을 사용합니다.
         * 매개변수.
         */
        if (argc  1)
                conninfo = argv[1];
        그렇지 않으면
                conninfo = "dbname = template1";

        /* 데이터베이스에 연결 */
        conn = PQconnectdb(conninfo);

        /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
        if (PQstatus(conn) != CONNECTION_OK)

                fprintf(stderr, "데이터베이스 연결 실패: %s",
                        PQerrorMessage(conn));
                exit_nicely(conn);

        /*
         * 규칙의 NOTIFY에서 알림을 활성화하려면 LISTEN 명령을 실행하세요.
         */
        res = PQexec(conn, "LISTEN TBL2");
        if (PQresultStatus(res) != PGRES_COMMAND_OK)

                fprintf(stderr, "LISTEN 명령 실패: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);

        /*
         * 더 이상 필요하지 않을 때마다 PQclear PGresult를 피해야 합니다.
         * 메모리 누수
         */
        PQclear(res);

        /* 4개의 알림을 받은 후 종료합니다. */
        알림 = 0;
        while (< 4를 통지하지 않음)

                /*
                 * 연결에 문제가 생길 때까지 잠을 자세요.  우리는 select(2)를 사용합니다.
                 * 입력을 기다리려면 poll() 또는 이와 유사한 것을 사용할 수도 있습니다.
                 * 시설.
                 */
                int 양말;
                fd_set 입력_마스크;

                양말 = PQsocket(conn);

                만약 (양말 < 0)
                        휴식;                          /* 일어나서는 안되는 일 */

                FD_ZERO(&input_mask);
                FD_SET(양말, &input_mask);

                if (select(양말 + 1, &input_mask, NULL, NULL, NULL) < 0)

                        fprintf(stderr, "select() 실패: %s\n", strerror(errno));
                        exit_nicely(conn);

                /* 이제 입력을 확인합니다 */
                PQconsumeInput(conn);
                while ((notify = PQnotify(conn)) != NULL)

                        fprintf(표준 오류,
                                        "'%s'의 비동기 알림이 백엔드 pid %d에서 수신되었습니다\n",
                                        알림-relname, 알림-be_pid);
                        PQfreemem(알림);
                        통지하지 않음++;

        fprintf(stderr, "완료.\n");

        /* 데이터베이스에 대한 연결을 닫고 정리합니다 */
        PQfinish(콘);

        0을 반환합니다.

예 27-3.libpq예제 프로그램 3

/*
 * 테스트libpq3.c
 * 라인 외부 매개변수 및 바이너리 I/O를 테스트합니다.
 *
 * 이를 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오.
 * (src/test/examples/testlibpq3.sql에서 제공):
 *
 * CREATE TABLE test1 (i int4, t text, b bytea);
 *
 * INSERT INTO test1 값(1, 'joe'의 장소', '\\000\\001\\002\\003\\004');
 * INSERT INTO test1 값(2, 'ho 거기', '\\004\\003\\002\\001\\000');
 *
 * 예상되는 결과는 다음과 같습니다.
 *
 * 튜플 0: 획득
 * i = (4바이트) 1
 * t = (11바이트) '조의 장소'
 * b = (5바이트) \000\001\002\003\004
 *
 */
#include <stdio.h
#include <stdlib.h
#include <문자열.h
#include <sys/types.h
#include "libpq-fe.h"

/* ntohl/htonl의 경우 */
#include <netinet/in.h
#include <arpa/inet.h

정적 공백
exit_nicely(PGconn *conn)

        PQfinish(콘);
        출구(1);

정수
메인(int argc, char **argv)

        const char *conninfo;
        PGconn *콘;
        PGresult *res;
        const char *paramValues[1];
        나는,
                                j;
        정수 i_fnum,
                                t_fnum,
                                b_fnum;

        /*
         * 사용자가 명령줄에 매개변수를 제공하는 경우 이를 다음과 같이 사용합니다.
         * conninfo 문자열; 그렇지 않으면 기본적으로 dbname=template1로 설정됩니다.
         * 그리고 다른 모든 연결에는 환경 변수 또는 기본값을 사용합니다.
         * 매개변수.
         */
        if (argc  1)
                conninfo = argv[1];
        그렇지 않으면
                conninfo = "dbname = template1";

        /* 데이터베이스에 연결 */
        conn = PQconnectdb(conninfo);

        /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
        if (PQstatus(conn) != CONNECTION_OK)

                fprintf(stderr, "데이터베이스 연결 실패: %s",
                        PQerrorMessage(conn));
                exit_nicely(conn);

        /*
         * 이 프로그램의 요점은 PQexecParams()의 사용을 설명하는 것입니다.
         * 라인 외부 매개변수 및 바이너리 전송 포함
         * 결과.  라인 외부 매개변수를 사용하면 많은 문제를 피할 수 있습니다.
         * 인용과 탈출에 대해 지루하게 고민합니다.  우리가 어떻게
         * 따옴표를 사용하여 특별한 작업을 수행할 필요가 없습니다.
         * 매개변수 값.
         */

        /* 여기에 라인 외부 매개변수 값이 있습니다 */
        paramValues[0] = "조의 장소";

        res = PQexecParams(콘,
                                           "SELECT * FROM test1 WHERE t = $1",
                                           1, /* 하나의 매개변수 */
                                           NULL, /* 백엔드가 매개변수 유형을 추론하도록 합니다 */
                                           param값,
                                           NULL, /* 텍스트이므로 매개변수 길이가 필요하지 않습니다 */
                                           NULL, /* 모든 텍스트 매개변수의 기본값 */
                                           1);          /* 바이너리 결과 요청 */

        if (PQresultStatus(res) != PGRES_TUPLES_OK)

                fprintf(stderr, "SELECT 실패: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);

        /* 결과의 필드 순서에 대한 가정을 피하기 위해 PQfnumber를 사용하십시오 */
        i_fnum = PQfnumber(res, "i");
        t_fnum = PQfnumber(res, "t");
        b_fnum = PQfnumber(res, "b");

        for (i = 0; i < PQntuples(res); i++)

                문자 *iptr;
                char *tptr;
                char *bptr;
                블렌;
                내부적으로;

                /* 필드 값을 가져옵니다(값이 null일 가능성은 무시합니다!) */
                iptr = PQgetvalue(res, i, i_fnum);
                tptr = PQgetvalue(res, i, t_fnum);
                bptr = PQgetvalue(res, i, b_fnum);

                /*
                 * INT4의 이진 표현은 네트워크 바이트 순서이며,
                 * 로컬 바이트 순서로 강제하는 것이 좋습니다.
                 */
                ival = ntohl(*((uint32_t *) iptr));

                /*
                 * TEXT의 이진 표현은 텍스트입니다.
                 * libpq는 0바이트를 추가할 만큼 훌륭했습니다. 작동할 것입니다.
                 * C 문자열처럼 괜찮습니다.
                 *
                 * BYTEA의 이진 표현은 바이트 묶음입니다.
                 * 삽입된 null이 포함될 수 있으므로 주의해야 합니다.
                 * 필드 길이.
                 */
                blen = PQgetlength(res, i, b_fnum);

                printf("튜플 %d: 가져옴\n", i);
                printf(" i = (%d 바이트) %d\n",
                           PQgetlength(res, i, i_fnum), ival);
                printf(" t = (%d 바이트) '%s'\n",
                           PQgetlength(res, i, t_fnum), tptr);
                printf(" b = (%d 바이트) ", blen);
                for (j = 0; j < 블렌; j++)
                        printf("\\%03o", btr[j]);
                printf("\n\n");

        PQclear(res);

        /* 데이터베이스에 대한 연결을 닫고 정리합니다 */
        PQfinish(콘);

        0을 반환합니다.