이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

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

Perl 기능에서 데이터베이스 자체에 대한 액세스 다음 기능을 통해 수행 :

SPI_EXEC_QUERY(쿼리[,Max-Rows])

SPI_EXEC_QUERYSQL을 실행합니다 명령 및 전체 행을에 대한 참조로 반환합니다. 해시 참조 배열.이 명령 만 사용해야합니다 결과 세트가 비교적 작은.다음은 쿼리의 예입니다 (select명령) 옵션 최대 값 행 수 :

$ rv = spi_exec_query ( 'select * from my_table', 5);

이것은 테이블에서 최대 5 행을 반환합니다my_table. 만약에my_table열이 있습니다my_column, 당신은 행에서 그 값을 얻을 수 있습니다$ i다음과 같은 결과의 :

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

A에서 반환 된 총 행 수select쿼리에 액세스 할 수 있습니다.

$ nrows = $ rv- processed

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

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

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

$ res = $ rv- status;

영향을받는 행의 수를 얻으려면 :

$ nrows = $ rv- processed;

여기에 완전한 예가 있습니다 :

테이블 테스트 생성 (
    나는 int,
    v varchar
);

테스트에 삽입 (i, v) 값 (1, 'First Line');
테스트에 삽입 (i, v) 값 (2, '두 번째 줄');
테스트에 삽입 (i, v) 값 (3, '세 번째 줄');
테스트에 삽입 (i, v) 값 (4, '불멸');

함수 생성 또는 교체 test_munge () setof test를 $$로 반환합니다.
    my $ rv = spi_exec_query ( 'select i, v test;');
    내 $ 상태 = $ rv- status;
    my $ nrows = $ rv- proceded;
    foreach my $ rn (0 .. $ nrows -1) 
        내 $ row = $ rv- rows [$ rn];
        정의 된 경우 $ row- i += 200 ($ row- i);
        $ row- v = ~ tr/a-za-z/a-za-z/if (정의 ($ row- v));
        return_next ($ 행);

    Undef를 반환하십시오.
$$ 언어 plperl;

선택 *에서 test_munge ();에서 선택하십시오.
SPI_QUERY(명령)
spi_fetchrow(커서)
SPI_CURSOR_CLOSE(커서)

SPI_QUERYandspi_fetchrow행의 쌍으로 함께 작업하십시오 클 수있는 세트 또는 원하는 경우 그들이 도착하면 줄을 반환합니다.spi_fetchrowWorks전용withSPI_QUERY. 다음 예는 보여줍니다 함께 사용하는 방법 :

foo_type 유형 생성 (the_num integer, the_text 텍스트);

함수 생성 또는 교체 lota_md5 (정수) foo_type를 $$로 설정합니다.
    다이제스트 사용 :: MD5 QW (MD5_HEX);
    내 $ file = '/usr/share/dict/words';
    내 $ t = localtime;
    elog (통지, "$ t에서 $ 파일 열기");
    내 $ fh, '<', $ 파일 # ooh, 파일 액세스 권한입니다!
        또는 elog (오류, "읽기를 위해 $ 파일을 열 수 없습니다 : $!");
    내 @words = <$ fh;
    닫기 $ FH;
    $ t = LocalTime;
    elog (통지, "닫힌 파일 $ 파일 at $ t");
    chomp (@words);
    내 $ 행;
    my $ sh = spi_query ( "select * from generate_series (1, $ _ [0])로 b (a)");
    while (정의 ($ row = spi_fetchrow ($ sth))) 
        return_next (
            the_num = $ row- a,
            the_text = md5_Hex ($ word [rand @words])
        );

    반품;
$$ 언어 plperlu;

lota_md5 (500)에서 *를 선택하십시오.

정상,spi_fetchrow반환 될 때까지 반복해야합니다undef, 더 이상 없음을 나타냅니다 읽을 행. 커서는SPI_QUERYspi_fetchrow반환undef. 읽고 싶지 않다면 모든 행, 대신 전화SPI_CURSOR_CLOSE커서를 제거합니다. 그렇게하지 않으면 메모리 누출이 발생합니다.

SPI_PREPARE(명령, 인수 유형)
SPI_QUERY_PREPARED(롤 토토an, 인수)
spi_exec_prepared(롤 토토an[,속성],인수)
SPI_Free롤 토토an(롤 토토an)

SPI_PREPARE, SPI_QUERY_PREPARED, spi_exec_preparedSPI_Free롤 토토an동일하게 구현하십시오 기능이지만 준비된 쿼리의 경우SPI_PREPARE쿼리 문자열을 수락합니다 번호가 매겨진 인수 장소 보유자 ($ 1, $ 2 등) 및 문자열 인수 유형 목록 :

$ 롤 토토an = spi_prepare ( 'select *에서 id $ 1 및 name = $ 2', 'integer', 'text');

일단 쿼리 계획이 전화로 준비되면SPI_PREPARE, 계획은 대신 사용할 수 있습니다 문자열 쿼리, inspi_exec_prepared, 여기서 결과는 반환 된 것과 동일SPI_EXEC_QUERY또는 inSPI_QUERY_PREPARED커서를 반환합니다 정확히SPI_QUERY나중에 전달 될 수 있습니다spi_fetchrow. 선택적 두 번째 매개 변수 에게spi_exec_prepared는 해시입니다 속성의 참조; 현재 유일한 속성 지원되는 것은Limit쿼리에 의해 반환 된 최대 행 수.

준비된 쿼리의 장점은 가능하다는 것입니다. 하나 이상의 쿼리 실행을 위해 하나의 준비된 계획을 사용합니다. 계획이 더 이상 필요하지 않은 후에는로 해방 될 수 있습니다.SPI_Free롤 토토an:

function init ()를 $$로 반환합니다
        $ _shared my_롤 토토an = spi_prepare ( 'select (now (now () + $ 1)) :: 날짜와 같이 날짜', 'Interval');
$$ 언어 plperl;

함수 생성 또는 교체 add_time (간격) 텍스트를 $$로 반환합니다.
        반환 spi_exec_prepared (
                $ _shared my_롤 토토an,
                $ _ [0]
        )- rows- [0]- now;
$$ 언어 plperl;

function doid ()를 작성하거나 바꾸십시오
        spi_free롤 토토an ($ _shared my_롤 토토an);
        undef $ _shared my_롤 토토an;
$$ 언어 plperl;

init ();
add_time ( '1 일'), add_time ( '2 일'), add_time ( '3 일')을 선택하십시오.
select done ();

  add_time |  add_time |  add_time
------------+------------+------------
 2005-12-10 | 2005-12-11 | 2005-12-12

매개 변수 첨자SPI_PREPARE$ 1, $ 2, $ 3 등을 통해 정의됩니다. 따라서 쿼리 문자열을 이중 인용문으로 선언하지 마십시오 쉽게 사냥하기 어려운 버그로 이어질 수 있습니다.

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

선택 ID, ( '192.168.1.'|| id)로 테이블 호스트를 작성합니다.

function init_hosts_query () 함수를 만들거나 바꾸십시오
        $ _shared 롤 토토an = spi_prepare ( '주소 << $ 1', 'inet')에서 호스트에서 선택 *);
$$ 언어 plperl;

함수 생성 또는 교체
        반환 spi_exec_prepared (
                $ _shared 롤 토토an,
                limit = 2,
                $ _ [0]
        )- rows;
$$ 언어 plperl;

함수 release_hosts_query ()를 만들거나 바꾸십시오
        spi_free롤 토토an ($ _ shared 롤 토토an);
        undef $ _shared 롤 토토an;
$$ 언어 plperl;

init_hosts_query ()를 선택하십시오.
select query_hosts ( '192.168.1.0/30');
릴리스 릴리 _hosts_query ();

    query_hosts    
------------------
 (1,192.168.1.1)
 (2,192.168.1.2)
(2 줄)
elog(레벨, msg)

로그 또는 오류 메시지를 방출합니다. 가능한 레벨은디버그, log, info, 통지, 경고오류. 오류오류 조건을 높입니다. 이것이 주변 Perl 코드에 의해 갇히지 않으면 오류는 호출 쿼리로 전파되어 현재 트랜잭션 또는 삭제 될 수 있습니다. 이것 사실상 perl과 동일합니다다이명령. 다른 수준은 생성됩니다 우선 순위가 다른 메시지. 메시지 여부 특정 우선 순위는 고객에게보고됩니다 서버 로그에 또는 둘 다에 의해 제어됩니다.log_min_messagesandclient_min_messages구성 변수. 보다18 장더 많은 것 정보.