PL/롤 토토 언어에서 함수를 만들려면 표준을 사용하십시오기능 만들기구문 :
기능 만들기funcName
(Argument-Types
) 보고return-type
- 기능 속성이 여기로 이동할 수 있습니다 $$로 # pl/롤 토토 기능 본문이 여기에갑니다 $$ 언어 pl롤 토토;
함수의 본문은 일반적인 롤 토토 코드입니다. 실제로, PL/롤 토토 접착제 코드는 롤 토토 서브 루틴 안에 랩핑됩니다. PL/롤 토토 기능은 스칼라 컨텍스트에서 호출되므로 목록을 반환 할 수 없습니다. 아래에 설명 된대로 참조를 반환하여 비 스칼라 값 (어레이, 레코드 및 세트)을 반환 할 수 있습니다.
PL/롤 토토 절차에서 롤 토토 코드의 리턴 값은 무시됩니다.
pl/롤 토토도 호출 된 익명 코드 블록도 지원합니다.do진술 :
do $$ # pl/롤 토토 코드 $$ 언어 plperl;
익명 코드 블록은 인수를받지 않으며, 반환 할 수있는 값은 폐기됩니다. 그렇지 않으면 기능처럼 동작합니다.
명명 된 중첩 서브 루틴의 사용은 롤 토토에서 위험합니다. 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;
인수는 데이터베이스의 인코딩에서 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'];
다차원 배열은 모든 롤 토토 프로그래머에게 공통적 인 방식으로 저 차원 참조에 대한 참조로 표시됩니다.
복합 유형 인수는 해시에 대한 참조로 함수로 전달됩니다. 해시의 키는 복합 유형의 속성 이름입니다. 예는 다음과 같습니다.
테이블 직원 생성 ( 이름 텍스트, 기본 정수, 보너스 정수 ); 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_strict
true. 이것은의 후속 편집에 영향을 미칩니다.pl/롤 토토함수이지만 현재 세션에서 이미 컴파일되지 않은 함수는 없습니다. 영구적 인 글로벌 사용을 위해 설정할 수 있습니다pl롤 토토.use_strict
true in thepostgresql.conf
파일.
특정 기능에서 영구적으로 사용하려면 간단히 말할 수 있습니다.
Strict 사용;
기능 본문의 상단에 있습니다.
the기능
Pragma도 제공합니다use
롤 토토이 버전 5.10.0 이상인 경우.
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면