이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다토토 꽁 머니 PostgreSQL : 문서 : 17 : 43.3. 내장 기능버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

45.3. 내장 기능

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

Perl 기능에서 데이터베이스 자체에 대한 액세스는 다음 함수를 통해 수행 할 수 있습니다.

SPI_EXEC_QUERY(쿼리[,Limit])

SPI_EXEC_QUERYSQL 명령을 실행하고 해시 참조 배열에 대한 참조로 전체 행 설정을 사설 토토 사이트. 만약에Limit지정되어 있고 0보다 크면SPI_EXEC_QUERY최대 검색Limit행, 쿼리에 a가 포함 된 것처럼Limit절. 생략Limit또는 0으로 지정하면 행 제한이 없습니다.

결과 세트가 비교적 작다는 것을 알고있을 때만이 명령을 사용해야합니다.다음은 쿼리의 예입니다 (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_QUERY자동으로 해제됩니다.spi_fetchrow반환undef. 모든 행을 읽고 싶지 않다면 대신 전화SPI_CURSOR_CLOSE커서를 제거합니다. 그렇게하지 않으면 메모리 누출이 발생합니다.

SPI_PREPARE (명령, 인수 유형)
SPI_QUERY_PREPARED (plan, 인수)
spi_exec_prepared (plan[,속성],인수)
spi_freeplan (plan)

SPI_PREPARE, SPI_QUERY_PREPARED, spi_exec_preparedSPI_FreePlan동일한 기능을 구현하지만 준비된 쿼리의 경우SPI_PREPARE번호가 매겨진 인수 자리 표시 자 ($ 1, $ 2 등)와 인수 유형의 문자열 목록이있는 쿼리 문자열을 수락합니다.

$ plan = spi_prepare ( '선택 *에서 id $ 1 및 name = $ 2',
                                                     '정수', '텍스트');

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

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

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

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

function doid ()를 작성하거나 바꾸십시오
        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_exec_prepared:

select id, ( '192.168.1.'|| id) :: inet으로 테이블 호스트를 작성하십시오
                      Generate_Series (1,3)에서 ID로;

function init_hosts_query () 함수를 만들거나 바꾸십시오
        $ _shared plan = spi_prepare ( 'select * from hosts
                                      여기서 주소 << $ 1 ','inet ');
$$ 언어 plperl;

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

함수 release_hosts_query ()를 만들거나 바꾸십시오
        spi_freeplan ($ _ shared plan);
        undef $ _shared plan;
$$ 언어 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 줄)
spi_commit ()
spi_rollback ()

현재 트랜잭션을 커밋하거나 롤백합니다. 절차 또는 익명 코드 블록 (에서만 호출 할 수 있습니다.do명령) 최상위에서 호출되었습니다. (SQL 명령을 실행할 수는 없습니다커밋또는롤백viaSPI_EXEC_QUERY또는 이와 유사합니다. 이 기능을 사용하여 수행해야합니다.) 트랜잭션이 종료 된 후 새 트랜잭션이 자동으로 시작되므로 별도의 기능이 없습니다..

예는 다음과 같습니다.

프로 시저 생성 트랜잭션 _test1 ()
언어 plperl
$$로
foreach my $ i (0..9) 
    SPI_EXEC_QUERY ( "Test1 (a) 값 ($ i)"에 삽입);
    if ($ i % 2 == 0) 
        spi_commit ();
     또 다른 
        spi_rollback ();

45.3.2. pl/perl의 유틸리티 기능

elog (레벨, msg)

로그 또는 오류 메시지를 방출합니다. 가능한 레벨은디버그, log, info, 통지, 경고오류. 오류오류 조건을 제기합니다. 주변 Perl 코드에 의해 갇히지 않으면 오류가 호출 쿼리로 전파되어 현재 트랜잭션 또는 서브 트랜잭션이 중단됩니다. 이것은 사실상 perl과 동일합니다다이명령. 다른 수준은 우선 순위가 다른 메시지 만 생성합니다. 특정 우선 순위의 메시지가 클라이언트에게보고되었는지, 서버 로그에 기록되었는지 또는 둘 다에 의해 제어되는지log_min_messagesandclient_min_messages구성 변수. 보다배트맨 토토 : 문서 : 11 : 19 장. 서버 구성자세한 내용은

quote_literal (String)

주어진 문자열을 SQL 문 문자열에서 문자열 문자로 사용하도록 적절하게 인용하십시오. 내장 단일 크기와 백 슬래시가 제대로 두 배가됩니다. 참고quote_literalundef 입력에서 undef를 반환합니다. 논쟁이 undef 일 수 있다면QUOTE_NULLABLE종종 더 적합합니다.

QUOTE_NULLABLE (String)

주어진 문자열을 SQL 문 문자열에서 문자열 문자로 사용하도록 적절하게 인용 한 주어진 문자열을 반환합니다. 또는 인수가 undef 인 경우 인용되지 않은 문자열 "NULL"을 반환하십시오. 내장 된 단일 크기 및 백 슬래시가 제대로 두 배가됩니다.

quote_ident (String)

주어진 문자열을 SQL 문 문자열에서 식별자로 사용하도록 적절하게 인용 한 주어진 문자열을 반환합니다. 따옴표는 필요한 경우에만 추가됩니다 (즉, 문자열에 비 식별자 문자가 포함되어 있거나 케이스 폴드가있는 경우). 임베디드 따옴표가 제대로 두 배가되었습니다.

decode_bytea (String)

주어진 문자열의 내용으로 표시되는 에스카로운 이진 데이터를 반환합니다.BYTEA인코딩.

encode_bytea (String)

반환BYTEA주어진 문자열의 이진 데이터 내용의 인코딩 된 형태.

encode_array_literal (배열)
encode_array_literal (배열, Delimiter)

참조 배열의 내용을 배열 문자 그대로 문자열로 리턴합니다 (참조섹션 8.15.2). 배열에 대한 참조가 아닌 경우 인수 값을 변경하지 않으면 반환합니다. 배열 리터럴 기본값의 요소 사이에 사용 된 구분 기자 ","구분 기자가 지정되지 않았거나 undef 인 경우

encode_typed_literal (value, typename)

Perl 변수를 두 번째 인수로 전달 된 데이터 유형의 값으로 변환 하고이 값의 문자열 표현을 반환합니다. 중첩 어레이 및 복합 유형의 값을 올바르게 처리합니다.

encode_array_constructor (배열)

참조 배열의 내용을 배열 생성자 형식의 문자열로 반환합니다 (참조섹션 4.2.12). 개별 값은를 사용하여 인용합니다.QUOTE_NULLABLE. 인용 된 인용 인용 인용 인수 값을 반환합니다.QUOTE_NULLABLE, 배열에 대한 참조가 아닌 경우.

Look_Ike_Number (String)

주어진 문자열의 내용이 숫자처럼 보이는 경우 True 값을 반환합니다. Perl에 따르면 그렇지 않으면 False를 반환합니다. 인수가 undef 인 경우 undef를 반환합니다. 선도 및 후행 공간은 무시됩니다.infInfinity숫자로 간주됩니다.

is_array_ref (인수)

주어진 인수가 배열 참조로 취급 될 수있는 경우, 즉 인수의 Ref가 인 경우 진정한 값을 반환합니다.배열또는사설 토토 사이트 :: inserver :: array. 그렇지 않으면 거짓을 반환합니다.