2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 꽁 머니 PostgreSQL : 문서 : 17 : 43.3. 내장 기능버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

41.3. 내장 토토 캔

41.3.1. PL/Perl에서 데이터베이스 액세스

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

spi_exec_query(질의 [, 최대 행])

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

$rv = spi_exec_query('SELECT * FROM my_table', 5);

이것은 테이블에서 최대 5개의 행을 토토 캔합니다.내_테이블. 만일내_테이블열이 있습니다my_column, 행에서 해당 값을 가져올 수 있습니다.$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_freeplan(계획)

spi_prepare, spi_query_prepared, spi_exec_preparedspi_freeplan같은 것을 구현하세요 토토 캔은 있지만 준비된 쿼리용입니다.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_freeplan:

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

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

함수 만들기 또는 바꾸기 done()은 $$로 VOID를 토토 캔합니다.
        spi_freeplan( $_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를 $$로 토토 캔합니다.
        $_SHARED계획 = spi_prepare('SELECT * FROM 호스트
                                      WHERE 주소 << $1', 'inet');
$$ 언어 plperl;

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

함수 생성 또는 교체 release_hosts_query()는 VOID를 $$로 토토 캔합니다.
        spi_freeplan($_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행)

41.3.2. 유틸리티 토토 캔 PL/펄

elog(레벨, msg)

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

quote_literal(문자열)

다음과 같이 사용하기 위해 적절하게 인용된 주어진 문자열을 토토 캔합니다. SQL 문 문자열의 문자열 리터럴입니다. 임베디드 작은따옴표와 백슬래시는 올바르게 두 배가 됩니다. 참고 그quote_literal토토 캔 undef 입력에 대한 undef; 인수가 정의되지 않은 경우,quote_nullable자주 더 적합합니다.

quote_nullable(문자열)

다음과 같이 사용하기 위해 적절하게 인용된 주어진 문자열을 토토 캔합니다. SQL 문 문자열의 문자열 리터럴입니다. 또는 만약 인수가 undef인 경우, 인용되지 않은 문자열 "NULL"을 토토 캔합니다. 포함된 작은따옴표와 백슬래시는 올바르게 사용됩니다. 두 배로 늘었습니다.

quote_ident(문자열)

다음과 같이 사용하기 위해 적절하게 인용된 주어진 문자열을 토토 캔합니다. SQL 문 문자열의 식별자입니다. 견적은 필요한 경우에만 추가됩니다(즉, 문자열에 다음이 포함된 경우). 식별자가 아닌 문자이거나 대소문자가 구분됩니다). 삽입된 따옴표는 적절하게 두 배로 표시됩니다.

decode_bytea(문자열)

다음으로 표시되는 이스케이프되지 않은 바이너리 데이터를 토토 캔합니다. 주어진 문자열의 내용은 다음과 같아야 합니다.바이테아인코딩되었습니다.

encode_bytea(문자열)

토토 캔바이테아인코딩된 형식 주어진 문자열의 바이너리 데이터 내용입니다.

encode_array_literal(배열)
encode_array_literal(배열, 구분자)

참조된 배열의 내용을 다음과 같이 토토 캔합니다. 배열 리터럴 형식의 문자열(참조섹션 8.15.2). 반품 참조가 아닌 경우 인수 값은 변경되지 않습니다. 배열. 요소 사이에 사용되는 구분 기호입니다. 배열 리터럴의 기본값은 "입니다.," 구분 기호가 지정되지 않았거나 정의되지 않은 경우.

encode_typed_literal(, 유형 이름)

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

encode_array_constructor(배열)

참조된 배열의 내용을 다음과 같이 토토 캔합니다. 배열 생성자 형식의 문자열(참조섹션 4.2.12). 개별 값은 다음을 사용하여 인용됩니다.quote_nullable. 다음을 토토 캔합니다. 인수 값, 다음을 사용하여 인용됨quote_nullable, 참조가 아닌 경우 배열로.

looks_like_number(문자열)

주어진 내용이 다음과 같은 경우 참값을 토토 캔합니다. Perl에 따르면 문자열은 숫자처럼 보이며 다음을 토토 캔합니다. 그렇지 않으면 거짓입니다. 인수가 undef이면 undef를 토토 캔합니다. 선행 및 후행 공백은 무시됩니다.정보그리고무한대숫자로 간주됩니다.

is_array_ref(인수)

주어진 인수가 다음과 같은 경우 참값을 토토 캔합니다. 배열 참조로 처리됩니다. 즉, 인수는어레이또는토토 캔::InServer::ARRAY. 거짓을 토토 캔합니다. 그렇지 않으면.