45.1. PL/토토 사이트 함수 및 인수#

PL/토토 사이트 언어로 함수를 생성하려면 표준을 사용하십시오.함수 생성구문:

함수 생성기능 이름 (인수 유형)
보고반환 유형-- 함수 속성이 여기에 들어갈 수 있습니다.
AS $$
    # PL/토토 사이트 함수 본문이 여기에 위치합니다.
$$ 언어 pl토토 사이트;

함수 본문은 일반 토토 사이트 코드입니다. 실제로 PL/토토 사이트 글루 코드는 이를 토토 사이트 서브루틴 내부에 래핑합니다. PL/토토 사이트 함수는 스칼라 컨텍스트에서 호출되므로 목록을 반환할 수 없습니다. 아래 설명된 대로 참조를 반환하여 스칼라가 아닌 값(배열, 레코드 및 집합)을 반환할 수 있습니다.

PL/토토 사이트 프로시저에서는 토토 사이트 코드의 모든 반환 값이 무시됩니다.

PL/Perl은 또한 다음으로 호출되는 익명 코드 블록을 지원합니다.DO성명:

DO $$
    # PL/펄 코드
$$ 언어 plperl;

익명의 코드 블록은 인수를 받지 않으며, 반환될 수 있는 값은 모두 폐기됩니다. 그렇지 않으면 함수처럼 동작합니다.

참고

이름이 붙은 중첩 서브루틴을 사용하는 것은 Perl에서 위험합니다. 특히 해당 서브루틴이 포함 범위의 어휘 변수를 참조하는 경우 더욱 그렇습니다. PL/Perl 함수는 서브루틴에 포함되어 있기 때문에 그 안에 배치한 명명된 서브루틴은 모두 중첩됩니다. 일반적으로 coderef를 통해 호출하는 익명 서브루틴을 만드는 것이 훨씬 안전합니다. 자세한 내용은 다음 항목을 참조하세요.변수 "%s"는 공유된 상태로 유지되지 않습니다그리고변수 "%s"을(를) 사용할 수 없습니다.에서토토 사이트diagman 페이지 또는 인터넷에서 검색토토 사이트 중첩 명명된 서브루틴.

의 구문은함수 생성명령을 사용하려면 함수 본문을 문자열 상수로 작성해야 합니다. 일반적으로 달러 인용을 사용하는 것이 가장 편리합니다(참조섹션 4.1.2.4)을 문자열 상수로 사용합니다. 이스케이프 문자열 구문을 사용하기로 선택한 경우E'', 작은따옴표()를 두 배로 늘려야 합니다.') 및 백슬래시(\) 함수 본문에 사용됨(참조섹션 4.1.2.1).

인수와 결과는 다른 Perl 서브루틴에서처럼 처리됩니다: 인수가 전달됩니다.@_, 결과 값은반환또는 함수에서 평가된 마지막 표현식으로.

예를 들어, 두 정수 값 중 더 큰 값을 반환하는 함수는 다음과 같이 정의될 수 있습니다:

CREATE FUNCTION 토토 사이트_max (정수, 정수) $$로 정수를 반환합니다.
    if ($_[0]  $_[1])  return $_[0]; 
    $_[1] 반환;
$$ 언어 plperl;

참고

인수는 PL/Perl 내에서 사용하기 위해 데이터베이스 인코딩에서 utf-8로 변환되며, 반환 시 utf-8에서 다시 데이터베이스 인코딩으로 변환됩니다.

SQL null 값인 경우함수에 전달되면 인수 값은 다음과 같이 표시됩니다.정의되지 않음펄에서. 위의 함수 정의는 null 입력에서는 매우 잘 작동하지 않습니다(실제로는 0인 것처럼 작동합니다). 추가할 수도 있습니다STRICT만들 함수 정의에PostgreSQL좀 더 합리적인 조치를 취하세요. null 값이 전달되면 함수는 전혀 호출되지 않고 자동으로 null 결과를 반환합니다. 또는 함수 본문에서 정의되지 않은 입력을 확인할 수 있습니다. 예를 들어 우리가 원한다고 가정해 보겠습니다.토토 사이트_maxnull 값이 아닌 null이 아닌 인수를 반환하려면 하나의 null과 하나의 null이 아닌 인수를 사용하세요.

CREATE FUNCTION 토토 사이트_max (정수, 정수) $$로 정수를 반환합니다.
    내 ($x, $y) = @_;
    if (정의되지 않음 $x) 
        $y가 정의되지 않은 경우 undef를 반환합니다.
        $y를 반환합니다;

    $y가 정의되지 않은 경우 $x를 반환합니다.
    $x  $y이면 $x를 반환합니다.
    $y를 반환합니다;
$$ 언어 plperl;

위에 표시된 대로 PL/Perl 함수에서 SQL null 값을 반환하려면 정의되지 않은 값을 반환합니다. 이는 함수의 엄격한 여부와 관계없이 수행될 수 있습니다.

참조가 아닌 함수 인수의 모든 내용은 표준에 있는 문자열입니다.PostgreSQL관련 데이터 유형에 대한 외부 텍스트 표현입니다. 일반적인 숫자 또는 텍스트 유형의 경우 Perl은 올바른 작업을 수행하므로 프로그래머는 일반적으로 이에 대해 걱정할 필요가 없습니다. 그러나 다른 경우에는 인수를 Perl에서 더 사용하기 쉬운 형식으로 변환해야 합니다. 예를 들어,decode_bytea함수를 사용하여 유형의 인수를 변환할 수 있습니다.바이테아이스케이프되지 않은 바이너리로.

마찬가지로 다음으로 전달된 값은PostgreSQL외부 텍스트 표현 형식이어야 합니다. 예를 들어,encode_bytea함수는 유형의 반환 값에 대한 바이너리 데이터를 이스케이프하는 데 사용할 수 있습니다.바이테아.

특히 중요한 경우 중 하나는 부울 값입니다. 방금 언급한 바와 같이,의 기본 동작은부울값은 Perl에 텍스트로 전달된다는 점입니다. 따라서 다음 중 하나입니다.''또는'f'. 토토 사이트은 처리하지 않기 때문에 문제가 됩니다.'f'거짓이라고! a를 사용하여 문제를 개선할 수 있습니다.변형(참조변환 생성). 적합한 변환은 다음에서 제공됩니다.bool_pl토토 사이트확장. 이를 사용하려면 확장 프로그램을 설치하세요.

확장 프로그램 만들기 bool_pl토토 사이트;  -- 또는 PL/PerlU의 경우 bool_pl토토 사이트u

그런 다음 다음을 사용하세요변환취하거나 반환하는 PL/Perl 함수에 대한 함수 속성부울, 예:

함수 생성 perl_and(bool, bool) RETURNS bool
유형에 대한 변환 bool
AS $$
  내 ($a, $b) = @_;
  $a && $b를 반환합니다.
$$ 언어 plperl;

이 변환이 적용되면,부울인수는 Perl에서 다음과 같이 표시됩니다.1또는 비어 있으므로 적절하게 참 또는 거짓입니다. 함수 결과가 유형인 경우부울, Perl이 반환된 값을 true로 평가할지 여부에 따라 true 또는 false가 됩니다. 부울 쿼리 인수와 함수 내에서 수행된 SPI 쿼리 결과에 대해서도 유사한 변환이 수행됩니다(섹션 45.3.1).

Perl이 반환될 수 있음PostgreSQL배열은 Perl 배열에 대한 참조로 사용됩니다. 예는 다음과 같습니다.

CREATE OR REPLACE 함수 return_array()
$$로 text[][]를 반환합니다.
    return [['a"b','c,d'],['e\\f','g']];
$$ 언어 plperl;

return_array() 선택;

펄 통과PostgreSQL축복받은 배열PostgreSQL::InServer::ARRAY객체. 이 객체는 배열 참조 또는 문자열로 처리될 수 있으므로 작성된 Perl 코드와의 역호환성을 허용합니다.PostgreSQL9.1 이하 버전을 실행해야 합니다. 예를 들어:

함수 생성 또는 교체 concat_array_elements(text[])는 텍스트를 $$로 반환합니다.
    내 $arg = 교대;
    내 $결과 = "";
    undef를 반환합니다(!defined $arg);

    # 배열 참조로
    (@$arg) 
        $결과 .= $_;

    # 문자열로도 작동합니다
    $결과 .= $arg;

    $결과를 반환합니다.
$$ 언어 plperl;

SELECT concat_array_elements(ARRAY['PL','/','Perl']);

참고

다차원 배열은 모든 토토 사이트 프로그래머에게 공통적인 방식으로 낮은 차원의 참조 배열에 대한 참조로 표현됩니다.

복합 유형 인수는 해시에 대한 참조로 함수에 전달됩니다. 해시의 키는 복합 유형의 속성 이름입니다. 예는 다음과 같습니다.

CREATE TABLE 직원(
    이름 텍스트,
    기본급 정수,
    보너스 정수
);

CREATE FUNCTION empcomp(employee) 정수를 $$로 반환합니다.
    내 ($emp) = @_;
    $emp-basesalary + $emp-bonus를 반환합니다.
$$ 언어 plperl;

SELECT 이름, empcomp(employee.*) FROM 직원;

PL/Perl 함수는 동일한 접근 방식을 사용하여 복합 유형 결과를 반환할 수 있습니다. 즉, 필수 속성이 있는 해시에 대한 참조를 반환합니다. 예를 들어:

CREATE TYPE testrowperl AS(f1 정수, f2 텍스트, f3 텍스트);

함수 생성 또는 교체 perl_row()는 testrowperl을 $$로 반환합니다.
    return f2 = '안녕하세요', f1 = 1, f3 = '세계';
$$ 언어 plperl;

SELECT * FROM perl_row();

선언된 결과 데이터 유형 중 해시에 없는 모든 열은 null 값으로 반환됩니다.

마찬가지로 프로시저의 출력 인수는 해시 참조로 반환될 수 있습니다:

CREATE PROCEDURE perl_triple(INOUT a 정수, INOUT b 정수) AS $$
    내 ($a, $b) = @_;
    return a = $a * 3, b = $b * 3;
$$ 언어 plperl;

전화 perl_triple(5, 10);

PL/Perl 함수는 스칼라 또는 복합 유형 세트를 반환할 수도 있습니다. 일반적으로 시작 시간을 단축하고 전체 결과 집합이 메모리에 대기하는 것을 방지하기 위해 한 번에 하나씩 행을 반환하려고 합니다. 당신은 이것을 할 수 있습니다return_next아래 그림과 같습니다. 마지막 이후에 참고하세요.return_next, 다음 중 하나를 입력해야 합니다.반환또는 (더 좋음)undef를 반환.

함수 생성 또는 교체 perl_set_int(int)
SETOF 정수를 $$로 반환합니다.
    foreach (0..$_[0]) 
        return_next($_);

    undef를 반환;
$$ 언어 plperl;

SELECT * FROM perl_set_int(5);

함수 생성 또는 교체 perl_set()
SETOF testrowperl을 $$로 반환합니다.
    return_next( f1 = 1, f2 = '안녕하세요', f3 = '세계' );
    return_next( f1 = 2, f2 = '안녕하세요', f3 = 'PostgreSQL' );
    return_next( f1 = 3, f2 = '안녕하세요', f3 = 'PL/Perl' );
    undef를 반환;
$$ 언어 plperl;

작은 결과 세트의 경우 단순 유형, 배열 유형 및 복합 유형에 대해 각각 스칼라, 배열 참조 또는 해시 참조를 포함하는 배열에 대한 참조를 반환할 수 있습니다. 다음은 전체 결과 집합을 배열 참조로 반환하는 몇 가지 간단한 예입니다.

함수 생성 또는 교체 perl_set_int(int)는 SETOF 정수를 $$로 반환합니다.
    반환 [0..$_[0]];
$$ 언어 plperl;

SELECT * FROM perl_set_int(5);

함수 생성 또는 교체 perl_set()는 SETOF testrowperl을 $$로 반환합니다.
    반품 [
         f1 = 1, f2 = '안녕하세요', f3 = '세계' ,
         f1 = 2, f2 = '안녕하세요', f3 = 'PostgreSQL' ,
         f1 = 3, f2 = '안녕하세요', f3 = 'PL/Perl' 
    ];
$$ 언어 plperl;

SELECT * FROM perl_set();

만약 당신이 다음을 사용하고 싶다면엄격pragma에는 몇 가지 옵션이 있습니다. 임시 전역 사용을 위해 다음을 수행할 수 있습니다.SET pl토토 사이트.use_strict참으로. 이는 후속 컴파일에 영향을 미칩니다.PL/펄함수. 단, 현재 세션에서 이미 컴파일된 함수는 아닙니다. 영구적으로 전역적으로 사용하려면 다음을 설정할 수 있습니다.pl토토 사이트.use_strict참으로postgresql.conf파일.

특정 기능에 영구적으로 사용하려면 간단히 다음을 입력하면 됩니다.

엄격한 사용;

함수 본문 상단에.

특징pragma도 사용할 수 있습니다.사용토토 사이트 버전이 5.10.0 이상인 경우.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.