이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은의 동일한 페이지를 보려고 할 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

40.2. pl/젠 토토에서 데이터베이스 액세스

젠 토토 기능에서 데이터베이스 자체에 대한 액세스 함수를 통해 완료SPI_EXEC_QUERY아래 설명 또는 an 실험 모듈dbd :: pgspi(또한 가능CPAN 미러 사이트). 이 모듈은 a를 사용할 수있게합니다.DBI-Compliant Database Handle name$ pg_dbh수행하는 데 사용할 수 있습니다 정상적인 쿼리DBI구문.

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

SPI_EXEC_QUERY(쿼리[,Max-Rows])
SPI_QUERY(명령)
spi_fetchrow(커서)
SPI_PREPARE(명령, 인수 유형)
spi_exec_prepared(plan)
SPI_QUERY_PREPARED(plan[,속성],인수)
SPI_CURSOR_CLOSE(커서)
SPI_FreePlan(plan)

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_QUERYspi_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_PREPARE, SPI_QUERY_PREPARED, spi_exec_preparedSPI_FreePlan동일하게 구현하십시오 기능이지만 준비된 쿼리. 일단 쿼리 계획 전화로 준비됩니다SPI_PREPARE, 계획은 대신 사용될 수 있습니다 문자열 쿼리, inspi_exec_prepared, 여기서 결과는 반환 된 것과 동일SPI_EXEC_QUERY또는 inSPI_QUERY_PREPARED커서를 반환합니다 정확히SPI_QUERY나중에 전달 될 수 있습니다spi_fetchrow.

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

함수 생성 또는 교체 init () 정수를 $$로 반환합니다
        $ _shared my_plan = spi_prepare ( 'select (now (now () + $ 1)) :: 날짜와 같이 날짜', 'Interval');
$$ 언어 plperl;

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

function done ()를 $$로 반환합니다
        spi_freeplan ($ _shared my_plan);
        undef $ _shared my_plan;
$$ 언어 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_fetchrow반환 될 때까지 반복해야합니다undef, 더 이상 없음을 나타냅니다 읽을 행. 커서가 자동으로 해제 될 때spi_fetchrow반환undef. 읽고 싶지 않다면 모든 행, 대신 전화SPI_CURSOR_CLOSE커서를 제거합니다. 그렇게하지 않으면 메모리 누출이 발생합니다.

elog(레벨, msg)

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