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

39.2. PL/젠 토토에서 데이터베이스 액세스

젠 토토 기능에서 데이터베이스 자체에 접근할 수 있습니다. 함수를 통해 수행됨spi_exec_query아래에 설명되어 있거나 실험 모듈DBD::PgSPI(다음에서도 사용 가능CPAN 미러 사이트). 이 모듈은 다음을 제공합니다.DBI호환 데이터베이스 핸들 이름이 지정됨$pg_dbh수행하는 데 사용할 수 있습니다. 일반 쿼리DBI구문.

PL/젠 토토은 추가 젠 토토 명령을 제공합니다:

spi_exec_query(질의 [, 최대 행])
spi_query(명령)
spi_fetchrow(커서)
spi_prepare(명령, 인수 유형)
spi_exec_prepared(계획)
spi_query_prepared(계획 [, 속성], 인수)
spi_cursor_close(커서)
spi_freeplan(계획)

spi_exec_querySQL을 실행합니다 명령을 실행하고 전체 행 세트를 참조로 반환합니다. 해시 참조 배열입니다.당신은 이 명령만 사용해야 합니다 결과 세트가 상대적으로 작다.다음은 쿼리의 예입니다(선택명령)(선택적 최대값 포함) 행 수:

$rv = spi_exec_query('SELECT * FROM my_table', 5);

이것은 테이블에서 최대 5개의 행을 반환합니다.내_테이블. 만일내_테이블열이 있습니다내_열, 행에서 해당 값을 얻을 수 있습니다.$i다음과 같은 결과:

$foo = $rv-행[$i]-my_column;

a에서 반환된 총 행 수선택쿼리는 다음과 같이 액세스할 수 있습니다:

$nrows = $rv-처리됨

다음은 다른 명령 유형을 사용하는 예입니다.

$query = "my_table 값에 삽입(1, 'test')";
$rv = spi_exec_query($query);

그런 다음 명령 상태에 액세스할 수 있습니다(예:SPI_OK_INSERT) 이렇게 합니다:

$res = $rv-상태;

영향을 받은 행 수를 얻으려면 다음을 수행하십시오:

$nrows = $rv-처리됨;

다음은 완전한 예입니다:

CREATE TABLE 테스트(
    나는 int,
    v varchar
);

INSERT INTO test (i, v) VALUES (1, '첫 번째 줄');
INSERT INTO test (i, v) VALUES (2, '두 번째 줄');
INSERT INTO test (i, v) VALUES (3, '세 번째 줄');
INSERT INTO 테스트(i, v) VALUES(4, '불멸');

함수 생성 또는 교체 test_munge()는 SETOF 테스트를 $$로 반환합니다.
    my $rv = spi_exec_query('테스트에서 i, v 선택;');
    내 $status = $rv-상태;
    내 $nrows = $rv-처리됨;
    foreach 내 $rn (0 .. $nrows - 1) 
        내 $row = $rv-행[$rn];
        $row-i += 정의된 경우 200($row-i);
        $row-v =~ tr/A-Za-z/a-zA-Z/ if (defined($row-v));
        return_next($행);

    undef를 반환;
$$ 언어 plperl;

SELECT * FROM test_munge();

spi_query그리고spi_fetchrow한 줄씩 짝을 지어 함께 일하세요 큰 세트 또는 원하는 경우 행이 도착하면 반환합니다.spi_fetchrow작동spi_query. 다음 예에서는 함께 사용하는 방법:

CREATE TYPE foo_type AS (the_num INTEGER, the_text TEXT);

함수 만들기 또는 바꾸기 lota_md5(INTEGER)는 SETOF foo_type을 $$로 반환합니다.
    Digest::MD5 qw(md5_hex)를 사용하십시오.
    내 $file = '/usr/share/dict/words';
    내 $t = 현지 시간;
    elog(NOTICE, "$t에서 $file 파일 열기" );
    open my $fh, '<', $file # 오, 파일 접근이군요!
        또는 elog(ERROR, "읽기 위해 $file을 열 수 없습니다: $!");
    내 @words = <$fh;
    $fh 닫기;
    $t = 현지시간;
    elog(NOTICE, "$t에서 $file 파일을 닫았습니다.");
    씹어먹다(@words);
    내 $행;
    my $sth = spi_query("SELECT * FROM generate_series(1,$_[0]) AS b(a)");
    while (정의됨 ($row = spi_fetchrow($sth))) 
        return_next(
            the_num = $행-a,
            the_text = md5_hex($words[rand @words])
        );

    반품;
$$ 언어 plperlu;

lotsa_md5(500)에서 * 선택;

spi_prepare, spi_query_prepared, spi_exec_preparedspi_freeplan동일하게 구현 기능은 있지만 준비된 쿼리용입니다. 일단 쿼리 계획 호출로 준비됩니다.spi_prepare대신 계획을 사용할 수 있습니다. 문자열 쿼리(spi_exec_prepared, 여기서 결과는 에서 반환한 것과 동일함spi_exec_query또는spi_query_prepared커서를 반환합니다. 정확히는spi_query그렇습니다. 나중에 전달할 수 있습니다.spi_fetchrow.

준비된 쿼리의 장점은 가능하다는 것입니다 둘 이상의 쿼리 실행에 대해 하나의 준비된 계획을 사용합니다. 계획이 더 이상 필요하지 않으면 다음을 사용하여 해제할 수 있습니다.spi_freeplan:

함수 생성 또는 교체 init()는 정수를 $$로 반환합니다.
        $_SHAREDmy_plan = spi_prepare( 'SELECT (now() + $1)::date AS now', 'INTERVAL');
$$ 언어 plperl;

함수 생성 또는 교체 add_time( INTERVAL )은 텍스트를 $$로 반환합니다.
        spi_exec_prepared를 반환( 
                $_SHARED내_계획,
                $_[0],
        )-행-[0]-지금;
$$ 언어 plperl;

함수 만들기 또는 바꾸기 done()은 정수를 $$로 반환합니다.
        spi_freeplan( $_SHAREDmy_plan);
        undef $_SHAREDmy_plan;
$$ 언어 plperl;

선택 초기화();
SELECT add_time('1일'), add_time('2일'), add_time('3일');
선택 완료();

  추가_시간 |  추가_시간 |  add_time  
------------+------------+------------
 2005-12-10 | 2005-12-11 | 2005-12-12

다음 매개변수 아래 첨자에 유의하세요.spi_prepare은 $1, $2, $3 등을 통해 정의됩니다. 따라서 큰따옴표로 쿼리 문자열을 선언하지 마십시오. 잡기 어려운 버그가 쉽게 발생할 수 있습니다.

보통은,spi_fetchrow반환될 때까지 반복되어야 함undef, 더 이상 없음을 나타냅니다. 읽을 행. 커서는 다음과 같은 경우 자동으로 해제됩니다.spi_fetchrow반환undef. 읽고 싶지 않다면 모든 행을 대신 호출spi_cursor_close커서를 해제합니다. 그렇지 않으면 메모리 누수가 발생합니다.

elog(레벨, msg)

로그 또는 오류 메시지를 내보냅니다. 가능한 수준은 다음과 같습니다.디버그, 로그, 정보, 공지, 경고오류. 오류오류 조건을 발생시킵니다. 이것이 주변 Perl 코드에 의해 트랩되지 않으면 오류가 호출 쿼리로 전파되어 현재 트랜잭션 또는 하위 트랜잭션이 중단됩니다. 이 사실상 Perl과 동일합니다.다이명령. 다른 레벨에서는 생성만 수행됩니다. 다양한 우선순위 수준의 메시지. 메시지 여부 특정 우선순위가 고객에게 보고되고 서면으로 작성됩니다. 서버 로그에 저장하거나 둘 다에 의해 제어됩니다.log_min_messages그리고client_min_messages구성 변수. 참조17장더 보기 정보.