지원되는 버전 :현재(17) /16 / 15 / 14 / 13
개발 버전 :18 / Devel
지원되지 않은 버전 :12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2
이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다current버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

39.1. pl/사설 토토 함수 및 인수

pl/사설 토토 언어에서 함수를 만들려면 표준을 사용하십시오PostgreSQL : 문서 : 8.2 : 토토 결과 작성구문 :

함수 만들기funcName(Argument-Types) 반환return-type$$
    # pl/사설 토토 기능 본체
$$ 언어 pl사설 토토;

함수의 본문은 일반적인 사설 토토 코드입니다. 사실, PL/사설 토토 접착제 코드는 사설 토토 서브 루틴 안에 랩핑됩니다. pl/사설 토토 함수는 항상 스칼라 값을 반환해야합니다. 당신은 더 많은 것을 반환 할 수 있습니다 a 아래에 설명 된 바와 같이 참조. 목록을 반환하지 마십시오.

참고 :명명 된 중첩 서브 루틴의 사용은 다음과 같습니다 특히 어휘를 언급하는 경우 Perl에서 위험합니다 동봉 범위의 변수. PL/PERL 기능 때문입니다 당신이 만든 서브 루틴의 서브 루틴에 싸여 있습니다. 중첩됩니다. 일반적으로 창조하는 것이 훨씬 안전합니다 Coderef를 통해 부르는 익명의 서브 루틴. 참조사설 토토diag더 많은 사람 페이지 세부.

의 구문함수 만들기명령은 함수 본체를 문자열로 작성해야합니다. 끊임없는. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (보다섹션 4.1.2.211422_11495e '', 두 배가되어야합니다 단일 견적 마크 (') 및 백 슬래시 (\) 함수 본문에 사용됩니다 (보다섹션 4.1.2.1).

인수와 결과는 다른 사설 토토에서와 같이 처리됩니다. 서브 루틴 : 논쟁이 통과되었습니다@_, 결과 값은로 반환됩니다.return또는 마지막 표현식에서 기능.

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

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

SQL 널 값인 경우is 함수로 전달되면 인수 값이로 나타납니다."정의되지 않은"Perl. 위 함수 정의는 널 입력으로 잘 작동하지 않습니다. (실제로, 그것은 마치 0 인 것처럼 행동 할 것입니다). 우리는 추가 할 수 있습니다엄격한함수 정의로 만들다PostgreSQL무언가를하십시오 더 합리적 : 널 값이 전달되면 함수는 전혀 부름을 받지만 널 결과를 반환 할 것입니다. 자동으로. 또는 정의되지 않은 입력을 확인할 수 있습니다 기능 본문에서. 예를 들어, 우리가 원한다고 가정 해사설 토토_max하나의 null과 하나 비 연락이 아닌 논쟁을 반환하는 논증이 아닌 널 가치 :

함수 생성 사설 토토_max (정수, 정수)는 정수를 $$로 반환합니다
    내 ($ x, $ y) = @_;
    if (! 정의 $ x) 
        if (! 정의 $ y) return undef; 
        반품 $ y;

    if (! 정의 $ y) return $ x; 
    if ($ x $ y) return $ x; 
    반품 $ y;
$$ 언어 pl사설 토토;

위와 같이, pl/사설 토토에서 sql null 값을 반환하려면 함수, 정의되지 않은 값을 반환하십시오. 이것은 할 수 있습니다 기능은 엄격하거나 없어.

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

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

returns_array (); 선택

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

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

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

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

PL/사설 토토 함수는 복합 유형 결과를 사용하여 반환 할 수 있습니다 동일한 접근법 : 필요한 속성. 예를 들어,

타입 타입 testrowperl (f1 Integer, F2 Text, F3 Text);

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

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

신고 된 결과 데이터 유형의 모든 열이 아닌 해시에 존재하면 널 값으로 반환됩니다.

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

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

    Undef를 반환하십시오.
$$ 언어 pl사설 토토;

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를 반환하십시오.
$$ 언어 pl사설 토토;

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

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

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/사설 토토'
    ];
$$ 언어 pl사설 토토;

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

사용하려면엄격한Pragma 코드를 사용하면 가장 쉬운 방법은입니다.SET pl사설 토토.use_strictTO 진실. 이 매개 변수는의 후속 편집에 영향을 미칩니다.pl/사설 토토기능이지만 그렇지 않습니다 현재 현재 세션에서 컴파일 된 기능. 설정합니다 전 매개 변수pl/사설 토토로드되었으므로 추가해야합니다"pl사설 토토"to thecustom_variable_classeslist inpostgresql.conf.

사용하는 또 다른 방법엄격한Pragma

Strict 사용;

함수 본문에서.