44.1. pl/롤 토토 함수 및 인수

PL/롤 토토 언어에서 함수를 만들려면 표준을 사용하십시오기능 만들기구문 :

기능 만들기funcName(Argument-Types)
보고return-type- 기능 속성이 여기로 이동할 수 있습니다
$$로
    # pl/롤 토토 기능 본문이 여기에갑니다
$$ 언어 pl롤 토토;

함수의 본문은 일반적인 롤 토토 코드입니다. 실제로, PL/롤 토토 접착제 코드는 롤 토토 서브 루틴 안에 랩핑됩니다. PL/롤 토토 기능은 스칼라 컨텍스트에서 호출되므로 목록을 반환 할 수 없습니다. 아래에 설명 된대로 참조를 반환하여 비 스칼라 값 (어레이, 레코드 및 세트)을 반환 할 수 있습니다.

PL/롤 토토 절차에서 롤 토토 코드의 리턴 값은 무시됩니다.

pl/롤 토토도 호출 된 익명 코드 블록도 지원합니다.do진술 :

do $$
    # pl/롤 토토 코드
$$ 언어 plperl;

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

note

명명 된 중첩 서브 루틴의 사용은 롤 토토에서 위험합니다. PL/롤 토토 기능은 서브 루틴에 래핑되므로 하나 안에 놓은 서브 루틴이라는 이름이 둥지를지게됩니다. 일반적으로 Coderef를 통해 부르는 익명의 서브 루틴을 만드는 것이 훨씬 안전합니다. 자세한 내용은 항목을 참조하십시오.가변 "%s"는 공유를 유지하지 않습니다and가변 "%s"를 사용할 수 없습니다in롤 토토diagMan Page 또는 인터넷 검색Perl Nested Nedair Subroutine.

의 구문함수 만들기명령은 함수 본문을 문자열 상수로 작성해야합니다. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (참조섹션 4.1.2.412248_12319e '', 단일 견적 마크를 두 배로 늘려야합니다 (') 및 Backslashes (\) 함수 본문에 사용됩니다 (참조섹션 4.1.2.1).

인수와 결과는 다른 Perl Subroutine에서와 같이 처리됩니다 : 인수는 전달됩니다.@_, 결과 값은로 반환됩니다.return또는 기능에서 마지막 표현식이 평가 된대로.

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

함수 생성 롤 토토_max (정수, 정수) 정수를 $$로 반환합니다
    if ($ _ [0] $ _ [1]) return $ _ [0]; 
    반환 $ _ [1];
$$ 언어 plperl;

Note

인수는 데이터베이스의 인코딩에서 PL/롤 토토 내부 사용을 위해 UTF-8로 변환 한 다음 UTF-8에서 반품시 데이터베이스 인코딩으로 변환됩니다..

SQL 널 값인 경우함수로 전달되면 인수 값이로 나타납니다.정의되지 않은Perl. 위의 함수 정의는 Null 입력과는 잘 어울리지 않습니다 (실제로는 제로 인 것처럼 작용할 것입니다). 우리는 추가 할 수 있습니다엄격한PostgreSQL더 합리적인 일을하십시오 : 널 값이 전달되면 함수는 전혀 호출되지 않지만 자동으로 널 결과를 반환합니다. 또는 기능 본문에서 정의되지 않은 입력을 확인할 수 있습니다. 예를 들어, 우리가 원한다고 가정 해롤 토토_max널 값이 아니라 unnull 인수를 반환하기 위해 하나의 null과 하나의 unnull 인수가 포함되어 있습니다 :

함수 생성 롤 토토_max (정수, 정수) 정수를 $$로 반환합니다
    내 ($ x, $ y) = @_;
    if ($ x 정의되지 않음) 
        정의되지 않은 경우 undef를 반환하십시오. $ y;
        반품 $ y;

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

위와 같이, pl/롤 토토 함수에서 SQL null 값을 반환하려면 정의되지 않은 값을 반환하십시오. 기능이 엄격한 지 여부에 관계없이 수행 할 수 있습니다.

참조가 아닌 함수 인수의 모든 것은 문자열이며 표준에있는 문자열입니다PostgreSQL관련 데이터 유형의 외부 텍스트 표현. 일반 숫자 또는 텍스트 유형의 경우 롤 토토은 옳은 일을하고 프로그래머는 일반적으로 걱정할 필요가 없습니다. 그러나 다른 경우에는 인수가 롤 토토에서 더 유용한 형태로 변환되어야합니다. 예를 들어,decode_bytea함수를 사용하여 유형의 인수를 변환 할 수 있습니다BYTEA에스카로운 이진으로

마찬가지로 값이 다시 전달되었습니다PostgreSQL외부 텍스트 표현 형식이어야합니다. 예를 들어,encode_bytea함수는 유형의 반환 값에 대한 이진 데이터를 탈출하는 데 사용될 수 있습니다BYTEA.

특히 중요한 경우 부울 값입니다. 방금 언급했듯이의 기본 동작bool값은 텍스트로 롤 토토로 전달되므로't'또는'f'. 롤 토토이 치료하지 않기 때문에 이것은 문제가됩니다'F'거짓! A를 사용하여 문제를 개선 할 수 있습니다.변환(참조변환 생성). 적절한 변환은에 의해 제공됩니다.bool_plperl확장. 사용하려면 확장자를 설치하십시오.

확장 생성 bool_plperl;  - 또는 pl/롤 토토u의 bool_plperlu

그런 다음 사용변환PL/롤 토토 함수에 대한 함수 속성bool, 예 :

함수 생성 perl_and (bool, bool) bool을 반환합니다
유형 부울을 위해 변환
$$로
  내 ($ a, $ b) = @_;
  $ a && $ b를 반환합니다.
$$ 언어 plperl;

이 변환이 적용될 때bool인수는 롤 토토에 의해 존재하는 것으로 보일 것입니다1또는 비어 있으므로 적절하게 참 또는 거짓. 함수 결과가 유형 인 경우bool, Perl이 반환 된 값을 true로 평가할지 여부에 따라 true 또는 false입니다. 부울 쿼리 인수와 함수 내에서 수행 된 SPI 쿼리 결과에 대해서도 유사한 변환이 수행됩니다 (섹션 44.3.1).

롤 토토이 반환 할 수 있습니다PostgreSQL롤 토토 어레이에 대한 참조로 배열. 예는 다음과 같습니다.

함수 생성 또는 교체 returns_array ()
텍스트 [] []를 $$로 반환합니다
    반환 [[ 'A "B', 'C, D'], [ 'e \\ f', 'g']];
$$ 언어 plperl;

returns_array (); 선택

롤 토토 Passespostgresql축복받은 배열postgresql :: inserver :: array개체. 이 객체는 배열 참조 또는 문자열로 취급 될 수 있으며,로 작성된 Perl 코드와 뒤로 호환 할 수 있습니다.PostgreSQL실행하려면 9.1 미만의 버전. 예를 들어:

함수 생성 또는 교체 concat_array_elements (text []) 텍스트를 $$로 반환합니다
    내 $ arg = shift;
    내 $ result = "";
    Undef if (! 정의 $ arg);

    # 배열 참조로
    for (@$ arg) 
        $ result. = $ _;

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

    반환 $ 결과;
$$ 언어 plperl;

concat_array_elements를 선택하십시오 (배열 [ 'pl', '/', 'perl'];

Note

다차원 배열은 모든 롤 토토 프로그래머에게 공통적 인 방식으로 저 차원 참조에 대한 참조로 표시됩니다.

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

테이블 직원 생성 (
    이름 텍스트,
    기본 정수,
    보너스 정수
);

Function Empcomp (Employee)는 정수를 $$로 반환합니다
    내 ($ emp) = @_;
    return $ emp- basesalary + $ emp- 보너스;
$$ 언어 plperl;

직원의 이름, Empcomp (Employee.*)를 선택하십시오.

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

TestRowperl 유형 생성 (F1 Integer, F2 Text, F3 Text);

function perl_row ()를 작성하거나 바꾸십시오
    return f2 = 'hello', f1 = 1, f3 = 'world';
$$ 언어 plperl;

perl_row ();에서 *를 선택하십시오.

해시에 존재하지 않는 선언 된 결과 데이터 유형의 모든 열은 널 값으로 반환됩니다.

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

절차 생성 perl_triple (Integer, inout b Integer) $$
    내 ($ a, $ b) = @_;
    반환 a = $ a * 3, b = $ b * 3;
$$ 언어 plperl;

Call Perl_triple (5, 10);

pl/롤 토토 함수는 스칼라 또는 복합 유형 세트를 반환 할 수도 있습니다. 일반적으로 시작 시간을 높이고 메모리에서 전체 결과 세트를 대기하는 것을 막기 위해 한 번에 하나씩 행을 반환하고 싶을 것입니다. 당신은로 이것을 할 수 있습니다.return_next아래 그림과 같이. 마지막으로return_next, 당신은 둘 중 하나를 넣어야합니다return또는 (더 나은)return undef.

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

    Undef를 반환하십시오.
$$ 언어 plperl;

perl_set_int (5)에서 *를 선택하십시오.

함수 생성 또는 교체 perl_set ()
setof testrowperl을 $$로 반환합니다
    return_next (f1 = 1, f2 = 'hello', f3 = 'world');
    return_next (f1 = 2, f2 = 'hello', f3 = 'postgresql');
    return_next (f1 = 3, f2 = 'hello', f3 = 'pl/롤 토토');
    Undef를 반환하십시오.
$$ 언어 plperl;

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

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

perl_set_int (5)에서 *를 선택하십시오.

function perl_set ()을 setsof testrowperl로 $$로 반환합니다.
    반품 [
        f1 = 1, f2 = 'hello', f3 = 'world',
        f1 = 2, f2 = 'hello', f3 = 'postgresql',
        f1 = 3, f2 = 'hello', f3 = 'pl/롤 토토'
    ];
$$ 언어 plperl;

perl_set ();에서 *를 선택하십시오.

사용하려면엄격한코드가 포함 된 Pragma에는 몇 가지 옵션이 있습니다. 임시 글로벌 사용을 위해SET pl롤 토토.use_stricttrue. 이것은의 후속 편집에 영향을 미칩니다.pl/롤 토토함수이지만 현재 세션에서 이미 컴파일되지 않은 함수는 없습니다. 영구적 인 글로벌 사용을 위해 설정할 수 있습니다pl롤 토토.use_stricttrue in thepostgresql.conf파일.

특정 기능에서 영구적으로 사용하려면 간단히 말할 수 있습니다.

Strict 사용;

기능 본문의 상단에 있습니다.

the기능Pragma도 제공합니다use롤 토토이 버전 5.10.0 이상인 경우.

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면