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

38.2. pl/perl에서 데이터베이스 액세스

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

pl/토토 사이트 추천은 세 가지 추가 토토 사이트 추천 명령을 제공합니다.

SPI_EXEC_QUERY(쿼리[,Max-Rows])
SPI_EXEC_QUERY(명령)
SPI_QUERY(명령)
spi_fetchrow(명령)

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_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)에서 *를 선택하십시오.
elog(레벨, msg)

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