이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

샘플 프로그램

샘플 프로그램 1

/*
 * testlibpq.c Postgres 프론트엔드인 Libpq의 C 버전을 테스트합니다.
 * 도서관.
 *
 *
 */
#include <stdio.h
#include "libpq-fe.h"

무효
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

메인()

    char *pghost,
               *pg포트,
               *pgo옵션,
               *pgtty;
    char *db이름;
    int nFields;
    나는,
                j;

    /* 파일 *디버그; */

    PGconn *콘;
    PGresult *res;

    /*
     * 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
     * 매개변수가 null이면 시스템은 합리적인 사용을 시도합니다.
     * 환경 변수를 검색하여 기본값을 설정하거나, 실패하면
     * 하드와이어 상수 사용
     */
    pghost = NULL;              /* 백엔드 서버의 호스트 이름 */
    pgport = NULL;              /* 백엔드 서버의 포트 */
    pgoptions = NULL;           /* 백엔드를 시작하기 위한 특수 옵션
                                 * 서버 */
    pgtty = NULL;               /* 백엔드 서버에 대한 tty 디버깅 */
    DB이름 = "템플릿1";

    /* 데이터베이스에 연결 */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

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

        fprintf(stderr, "'%s' 데이터베이스에 연결하지 못했습니다.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
        exit_nicely(conn);

    /* debug = fopen("/tmp/trace.out","w"); */
    /* PQtrace(conn, 디버그);  */

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

        fprintf(stderr, "BEGIN 명령이 실패했습니다\n");
        PQclear(res);
        exit_nicely(conn);

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

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

        fprintf(stderr, "DECLARE CURSOR 명령이 실패했습니다\n");
        PQclear(res);
        exit_nicely(conn);

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

        fprintf(stderr, "FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다\n");
        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 mycursor");
    PQclear(res);

    /* 트랜잭션 커밋 */
    res = PQexec(conn, "COMMIT");
    PQclear(res);

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

    /* fclose(디버그); */
    0을 반환합니다.

샘플 프로그램 2

/*
 * 테스트libpq2.c
 * 비동기 알림 인터페이스 테스트
 *
 * 이 프로그램을 시작한 다음 다른 창의 psql에서 다음을 수행하십시오.
 * TBL2에 통지;
 *
 * 또는 좀 더 화려하게 꾸미고 싶다면 다음을 시도해 보세요.
 * 데이터베이스를 다음으로 채웁니다.
 *
 * 테이블 TBL1 생성(i int4);
 *
 * 테이블 TBL2 생성(i int4);
 *
 * TBL1 DO에 삽입할 때 규칙 r1을 생성합니다.
 * (INSERT INTO TBL2 값(new.i); NOTIFY TBL2);
 *
 * 그리고 할
 *
 * TBL1 값에 삽입(10);
 *
 */
#include <stdio.h
#include "libpq-fe.h"

무효
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

메인()

    char *pghost,
               *pg포트,
               *pgo옵션,
               *pgtty;
    char *db이름;
    int nFields;
    나는,
                j;

    PGconn *콘;
    PGresult *res;
    PGnotify *알림;

    /*
     * 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
     * 매개변수가 null이면 시스템은 합리적인 사용을 시도합니다.
     * 환경 변수를 검색하여 기본값을 설정하거나, 실패하면
     * 하드와이어 상수 사용
     */
    pghost = NULL;              /* 백엔드 서버의 호스트 이름 */
    pgport = NULL;              /* 백엔드 서버의 포트 */
    pgoptions = NULL;           /* 백엔드를 시작하기 위한 특수 옵션
                                 * 서버 */
    pgtty = NULL;               /* 백엔드 서버에 대한 tty 디버깅 */
    dbName = getenv("사용자");    /* 이것을 테스트 이름으로 변경합니다.
                                 * 데이터베이스 */

    /* 데이터베이스에 연결 */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

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

        fprintf(stderr, "'%s' 데이터베이스에 연결하지 못했습니다.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
        exit_nicely(conn);

    res = PQexec(conn, "LISTEN TBL2");
    if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

        fprintf(stderr, "LISTEN 명령이 실패했습니다\n");
        PQclear(res);
        exit_nicely(conn);

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

    동안 (1)

        /*
         * 확인 사이에 잠시 기다리십시오. select()로 대기 중
         * 더 효율적일 것입니다.
         */
        수면(1);
        /* 비동기 백엔드 메시지 수집 */
        PQconsumeInput(conn);
        /* 비동기 알림 메시지 확인 */
        while ((notify = PQnotify(conn)) != NULL)

            fprintf(표준 오류,
                 "백엔드 PID '%d'에서 '%s'의 비동기 알림을 받았습니다\n",
                    알림-relname, 알림-be_pid);
            무료(알림);

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

    0을 반환합니다.

샘플 프로그램 3

/*
 * testlibpq3.c Postgres 프론트엔드인 Libpq의 C 버전을 테스트합니다.
 * 도서관. 바이너리 커서 인터페이스 테스트
 *
 *
 *
 * 다음을 수행하여 데이터베이스를 채웁니다.
 *
 * CREATE TABLE test1 (i int4, d float4, p 다각형);
 *
 * test1 값(1, 3.567, '(3.0, 4.0, 1.0,
 * 2.0)'::다각형);
 *
 * test1 값(2, 89.05, '(4.0, 3.0, 2.0,
 * 1.0)'::다각형);
 *
 * 예상되는 결과는 다음과 같습니다:
 *
 * 튜플 0: i = (4바이트) 1, d = (4바이트) 3.567000, p = (4
 *바이트) 2포인트 바운드박스 = (hi=3.000000/4.000000, lo =
 * 1.000000,2.000000) 튜플 1: i = (4바이트) 2, d = (4바이트)를 얻었습니다.
 * 89.050003, p = (4바이트) 2포인트 경계 상자 =
 * (hi=4.000000/3.000000, lo = 2.000000,1.000000)
 *
 *
 */
#include <stdio.h
#include "libpq-fe.h"
#include "utils/geo-decls.h" /* POLYGON 유형의 경우 */

무효
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

메인()

    char *pghost,
               *pg포트,
               *pgo옵션,
               *pgtty;
    char *db이름;
    int nFields;
    나는,
                j;
    정수 i_fnum,
                d_fnum,
                p_fnum;
    PGconn *콘;
    PGresult *res;

    /*
     * 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
     * 매개변수가 null이면 시스템은 합리적인 사용을 시도합니다.
     * 환경 변수를 검색하여 기본값을 설정하거나, 실패하면
     * 하드와이어 상수 사용
     */
    pghost = NULL;              /* 백엔드 서버의 호스트 이름 */
    pgport = NULL;              /* 백엔드 서버의 포트 */
    pgoptions = NULL;           /* 백엔드를 시작하기 위한 특수 옵션
                                 * 서버 */
    pgtty = NULL;               /* 백엔드 서버에 대한 tty 디버깅 */

    dbName = getenv("사용자");    /* 이것을 테스트 이름으로 변경합니다.
                                 * 데이터베이스 */

    /* 데이터베이스에 연결 */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

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

        fprintf(stderr, "'%s' 데이터베이스에 연결하지 못했습니다.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
        exit_nicely(conn);

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

        fprintf(stderr, "BEGIN 명령이 실패했습니다\n");
        PQclear(res);
        exit_nicely(conn);

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

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

        fprintf(stderr, "DECLARE CURSOR 명령이 실패했습니다\n");
        PQclear(res);
        exit_nicely(conn);

    PQclear(res);

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

        fprintf(stderr, "FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다\n");
        PQclear(res);
        exit_nicely(conn);

    i_fnum = PQfnumber(res, "i");
    d_fnum = PQfnumber(res, "d");
    p_fnum = PQfnumber(res, "p");

    for (i = 0; i < 3; i++)

        printf("유형[%d] = %d, 크기[%d] = %d\n",
               i, PQftype(res, i),
               i, PQfsize(res, i));

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

        int *ival;
        float *dval;
        int plen;
        다각형 *pval;

        /* 이것을 우리가 알고 있는 3개 필드에 연결합니다 */
        ival = (int *) PQgetvalue(res, i, i_fnum);
        dval = (float *) PQgetvalue(res, i, d_fnum);
        plen = PQgetlength(res, i, p_fnum);

        /*
         * plen에는 길이 필드가 포함되어 있지 않으므로
         * VARHDSZ만큼 증가
         */
        pval = (POLYGON *) malloc(plen + VARHDRSZ);
        pval-크기 = plen;
        memmove((char *) &pval-npts, PQgetvalue(res, i, p_fnum), plen);
        printf("튜플 %d: 가져옴\n", i);
        printf(" i = (%d 바이트) %d,\n",
               PQgetlength(res, i, i_fnum), *ival);
        printf(" d = (%d 바이트) %f,\n",
               PQgetlength(res, i, d_fnum), *dval);
        printf(" p = (%d 바이트) %d 포인트 \tboundbox = (hi=%f/%f, lo = %f,%f)\n",
               PQgetlength(res, i, d_fnum),
               pval-npts,
               pval-boundbox.xh,
               pval-boundbox.yh,
               pval-boundbox.xl,
               pval-boundbox.yl);

    PQclear(res);

    /* 커서 닫기 */
    res = PQexec(conn, "CLOSE mycursor");
    PQclear(res);

    /* 트랜잭션 커밋 */
    res = PQexec(conn, "COMMIT");
    PQclear(res);

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

    0을 반환합니다.