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

40.2. 롤 토토/Perl에서 데이터베이스 액세스

Perl 기능에서 데이터베이스 자체에 접근할 수 있습니다. 다음 기능을 통해 수행됩니다.

spi_exec_query(질의 [, 최대 행])

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

$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-처리됨;

다음은 완전한 예입니다:

테이블 생성 테스트(
    나는 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_cursor_close(커서)

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_fetchrow반환될 때까지 반복되어야 함undef, 더 이상 없음을 나타냅니다. 읽을 행. 에서 반환된 커서spi_query다음 경우에 자동으로 해제됩니다.spi_fetchrow반환undef. 읽고 싶지 않다면 모든 행을 대신 호출spi_cursor_close커서를 해제합니다. 그렇지 않으면 메모리 누수가 발생합니다.

spi_prepare(명령, 인수 유형)
spi_query_prepared(계획, 인수)
spi_exec_prepared(계획 [, 속성], 인수)
spi_free롤 토토an(계획)

spi_prepare, spi_query_prepared, spi_exec_preparedspi_free롤 토토an동일하게 구현 기능은 있지만 준비된 쿼리용입니다.spi_prepare다음과 같은 쿼리 문자열을 받아들입니다. 번호가 매겨진 인수 자리 표시자($1, $2 등) 및 문자열 인수 유형 목록:

$plan = spi_prepare('SELECT * FROM test WHERE id  $1 AND name = $2', 'INTEGER', 'TEXT');

다음 호출을 통해 쿼리 계획이 준비되면spi_prepare대신 계획을 사용할 수 있습니다. 문자열 쿼리(spi_exec_prepared, 여기서 결과는 에서 반환한 것과 동일함spi_exec_query또는spi_query_prepared커서를 반환합니다. 정확히는spi_query그렇습니다. 나중에 전달할 수 있습니다.spi_fetchrow. 선택적 두 번째 매개변수 에spi_exec_prepared해시입니다 속성 참조; 현재 유일한 속성 지원되는 것은한계, 이는 쿼리에서 반환된 최대 행 수입니다.

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

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

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

함수 만들기 또는 바꾸기 done()은 $$로 VOID를 반환합니다.
        spi_free롤 토토an( $_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 등을 통해 정의됩니다. 따라서 큰따옴표로 쿼리 문자열을 선언하지 마십시오. 잡기 어려운 버그가 쉽게 발생할 수 있습니다.

또 다른 예는 선택사항의 사용법을 보여줍니다. 매개변수 inspi_exec_prepared:

CREATE TABLE 호스트 AS SELECT id, ('192.168.1.'||id)::inet AS 주소 FROM generate_series(1,3) AS id;

함수 생성 또는 교체 init_hosts_query()는 VOID를 $$로 반환합니다.
        $_SHAREDplan = spi_prepare('SELECT * FROM 호스트 WHERE 주소 << $1', 'inet');
$$ 언어 plperl;

생성 또는 교체 기능 query_hosts(inet) SETOF 호스트를 $$로 반환합니다.
        spi_exec_prepared를 반환(
                $_SHARED계획,
                한도 = 2,
                $_[0]
        )-행;
$$ 언어 plperl;

함수 생성 또는 교체 release_hosts_query()는 VOID를 $$로 반환합니다.
        spi_free롤 토토an($_SHARED계획);
        undef $_SHARED계획;
$$ 언어 plperl;

SELECT init_hosts_query();
SELECT 쿼리_호스트('192.168.1.0/30');
SELECT release_hosts_query();

    쿼리_호스트    
-----------------
 (1,192.168.1.1)
 (2,192.168.1.2)
(2행)
elog(레벨, msg)

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