이 문서는 지원되지 않는 버전의 Postgre토토 베이을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다4_조(배트맨 토토,배트맨 토토)버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

35.4. 질문 언어 (토토 베이) 기능

토토 베이 기능 임의의 토토 베이 문을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 간단하게 (비 세트) 케이스, 마지막 쿼리 결과의 첫 번째 행은 다음과 같습니다. 반환. (그 점을 명심하십시오"첫 번째 열"멀티 로우 결과의 결과는 사용하지 않는 한 잘 정의되지 않습니다주문 by.) 마지막 쿼리가 발생하면 줄을 전혀 반환하지 않으면 널 값이 반환됩니다.

또는 토토 베이 함수는 세트를 반환하도록 선언 할 수 있습니다. (즉, 여러 행) 함수의 리턴 유형을 지정하여 처럼setof약간또는 선언하여 동등하게 그것은로반환 테이블 (). 이 경우 모든 행의 행 마지막 쿼리의 결과가 반환됩니다. 자세한 내용은 아래에 표시됩니다.

토토 베이 함수의 본문은 토토 베이 문의 목록이어야합니다. 세미콜론으로 분리. 마지막 진술 후 세미콜론은 다음과 같습니다 선택 과목. 함수가 반환으로 선언되지 않는 한void, 마지막 진술은 A이어야합니다.select또는 an삽입, 11849_11857또는삭제반환절.

토토 베이언어를 함께 포장 할 수 있습니다 함수로 정의됩니다. 게다가select쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다 (삽입, 업데이트, 그리고삭제) 및 기타 토토 베이 명령. (예 : 트랜잭션 제어 명령을 사용할 수 없습니다 (예 :커밋, SavePoint및 일부 유틸리티 명령 (예 :진공, in토토 베이함수) 그러나 최종 명령은해야합니다 Aselect또는 a반환지정된 내용을 반환하는 조항 함수의 리턴 유형으로. 또는 정의하려는 경우 작업을 수행하지만 유용한 값이없는 토토 베이 기능 반환, 반환으로 정의 할 수 있습니다void. 예를 들어이 기능은 그만큼emp테이블 :

함수 만들기 clean_emp () voids as '
    emp에서 삭제하십시오
        여기서 급여 <0;
'언어 토토 베이;

clean_emp ()를 선택하십시오.

 clean_emp
----------

(1 행)

의 구문함수 만들기명령은 함수 본문을 문자열로 쓰여야합니다. 끊임없는. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (참조섹션 4.1.2.413498_13630') 및 백 슬래시 (\) (Escape Stri토토 베이 Syntax를 가정) 함수 (참조섹션 4.1.2.1).

35.4.1. 에 대한 논쟁토토 베이기능

토토 베이 함수의 인수는 함수에서 참조 할 수 있습니다. 이름이나 숫자를 사용하는 신체. 두 방법의 예가 나타납니다 아래에.

이름을 사용하려면 기능 인수를 이름을 가진 것으로 선언하십시오. 그런 다음 기능 본문에 해당 이름을 작성하십시오. 논쟁이라면 이름은 현재 토토 베이 명령의 열 이름과 동일합니다. 함수 내에서 열 이름이 우선합니다. 에게 이것을 무시하고, 인수 이름을 기능 자체, 즉function_name.argument_name. (이것이 충돌한다면 자격을 갖춘 열 이름으로 다시 열 이름이 승리합니다. 당신은 할 수 있습니다 테이블의 다른 별칭을 선택하여 모호성을 피하십시오. 토토 베이 명령 내에서.)

이전 숫자 접근법에서는 인수를 사용하여 참조합니다 구문$n: $ 1첫 번째 입력 인수,$ 2to 둘째, 그리고 그렇게. 이것은 특정이든 아니든 효과가 있습니다 인수는 이름으로 선언되었습니다.

인수가 복합 유형 인 경우 DOT 표기법이 있으면 예 :argname.fieldname또는$ 1.FieldName, 속성에 액세스하는 데 사용할 수 있습니다 논쟁. 다시 말하지만, 당신은 인수의 이름을 자격을 갖추어야 할 수도 있습니다 인수 이름으로 양식을 만들기 위해 함수 이름으로 모호하지 않은.

토토 베이 기능 인수는 다음과 같은 데이터 값으로 만 사용할 수 있습니다. 식별자. 예를 들어 이것은 합리적입니다 :

myTable 값에 삽입 ($ 1);

그러나 이것은 작동하지 않습니다 :

$ 1 값 (42)에 삽입;

참고 :이름을 사용하여 토토 베이 기능을 참조하는 기능 인수가 추가되었습니다Postgre토토 베이9.2. 이전 서버에서 사용할 함수는를 사용해야합니다.$n표기법.

35.4.2. 토토 베이기본 유형의 기능

가장 간단한 가능한토토 베이함수는 인수가 없으며 단순히와 같은 기본 유형을 반환합니다.Integer:

함수 1 ()를 작성하십시오 ()는 정수를 $$로 반환합니다
    결과적으로 1을 선택하십시오.
$$ 언어 토토 베이;

- 문자열 리터럴에 대한 대체 구문 :
기능 one ()를 작성하여 정수를 반환합니다.
    결과적으로 1을 선택하십시오.
'언어 토토 베이;

하나를 선택하십시오 ();

 하나
-----
   1

기능 본문 내에서 열 별칭을 정의했음을 알 수 있습니다. 함수의 결과 (이름 포함결과), 그러나이 열 별칭은 보이지 않습니다 기능 밖. 따라서 결과는 레이블이 지정됩니다ONE대신결과.

거의 정의하기 쉽습니다토토 베이기본 유형을 사용하는 기능 인수 :

함수 생성 add_em (x 정수, y 정수)은 정수를 $$로 반환합니다.
    x + y를 선택하십시오.
$$ 언어 토토 베이;

답변으로 add_em (1, 2)을 선택하십시오.

 답변
--------
      3

또는 우리는 인수의 이름을 분배 할 수 있습니다 숫자 사용 :

함수 생성 add_em (정수, 정수)은 정수를 $$로 반환합니다
    $ 1 + $ 2를 선택하십시오.
$$ 언어 토토 베이;

답변으로 add_em (1, 2)을 선택하십시오.

 답변
--------
      3

여기에 더 유용한 기능이 있습니다. 은행 계좌 :

기능 생성 TF1 (AccountNo Integer, Debit Numeric) 정수를 $$로 반환합니다.
    은행 업데이트
        균형을 설정하십시오 = 균형 - 차변
        여기서 AccountNo = Tf1.Accountno;
    선택 1;
$$ 언어 토토 베이;

사용자는이 기능을 차변 계정으로 실행할 수 있습니다 17 다음과 같이 $ 100.00 :

선택 TF1 (17, 100.0); 선택

이 예에서는 이름을 선택했습니다AccountNo첫 번째 논쟁의 경우 의 열 이름과 동일합니다은행테이블. 내에서업데이트명령,AccountNo열을 참조하십시오bank.accountno, sotf1.accountno인수를 참조하는 데 사용해야합니다. 우리는 물론 다른 이름을 사용하여 이것을 피할 수 있습니다. 논쟁.

실제로는 더 유용한 결과를 원할 것입니다. 상수 1보다 함수는 다음과 같습니다.

기능 생성 TF1 (AccountNo Integer, Debit Numeric) 정수를 $$로 반환합니다.
    은행 업데이트
        균형을 설정하십시오 = 균형 - 차변
        여기서 AccountNo = Tf1.Accountno;
    AccountNo = tf1.accountno;
$$ 언어 토토 베이;

균형을 조정하고 새로운 잔액을 반환합니다. 동일합니다 를 사용하여 한 명령으로 수행 할 수 있습니다.반환:

기능 생성 TF1 (AccountNo Integer, Debit Numeric) 정수를 $$로 반환합니다.
    은행 업데이트
        균형을 설정하십시오 = 균형 - 차변
        여기서 AccountNo = Tf1.Accountno
    반환 균형;
$$ 언어 토토 베이;

35.4.3. 토토 베이복합 유형의 기능

복합 유형의 인수로 기능을 작성할 때, 우리 원하는 인수뿐만 아니라 원하는 인수도 명시해야합니다. 그 주장의 속성 (필드). 예를 들어,emp직원 데이터가 포함 된 테이블입니다 따라서 각 행의 복합 유형의 이름도 테이블. 다음은 함수입니다double_salary그것은 누군가의 급여를 계산합니다 두 배가된다면 :

Table Emp 만들기 (
    이름 텍스트,
    급여 숫자,
    나이 정수,
    칸막이 지점
);

EMP 값에 삽입 ( 'Bill', 4200, 45, '(2,1)');

기능을 작성하여 Double_salary (EMP)를 $$로 반환합니다
    $ 1. Salary * 2를 급여로 선택하십시오.
$$ 언어 토토 베이;

꿈으로 이름, double_salary (emp.*)를 선택하십시오
    emp에서
    여기서 emp.cubicle ~ = point '(2,1)';

 이름 | 꿈
------+-------
 빌 |  8400

구문 사용에 주목하십시오$ 1. Salary인수 행 값의 한 필드를 선택하려면. 또한 어떻게 부름select명령 사용table_name.*TO 테이블의 전체 현재 행을 복합 값으로 선택하십시오. 그만큼 테이블 행 만 사용하여 테이블 만 참조 할 수 있습니다. 이름, 이렇게 :

꿈으로 이름, Double_salary (EMP) 이름을 선택하십시오
    emp에서
    여기서 emp.cubicle ~ = point '(2,1)';

그러나이 사용법은 혼란스러워지기 쉽기 때문에 더 이상 사용되지 않습니다. (보다섹션 8.16.5복합 값에 대한이 두 가지 표기법에 대한 세부 사항 테이블 행.)

때로는 복합 인수 값을 구성하는 것이 편리합니다. 날개. 이것은로 수행 할 수 있습니다.Row구성. 예를 들어 전달되는 데이터를 조정할 수 있습니다. 기능 :

꿈으로서 이름, double_salary (행 (이름, 급여*1.1, 나이, 칸막이))을 선택하십시오
    emp에서;

복합재를 반환하는 함수를 빌드 할 수도 있습니다. 유형. 이것은 단일을 반환하는 함수의 예입니다emp행 :

기능 작성 new_emp ()는 emp를 $$로 반환합니다
    이름으로 '없음'을 선택하고
        급여로 1000.0,
        25 나이로
        칸막이로서 '(2,2)';
$$ 언어 토토 베이;

이 예에서는 각 속성을 일정한 가치이지만 모든 계산이 대체 될 수 있습니다. 이 상수.

함수 정의에 대한 두 가지 중요한 사항에 주목하십시오.

  • 쿼리의 선택 목록 순서는 정확히 동일해야합니다. 열이 복합 유형. (위에서했던 것처럼 열의 이름 지정은 관련이 없습니다 시스템에.)

  • 22439_22555

    오류 : EMP를 반환하라고 선언 한 함수 1 열에서 텍스트 대신 varchar를 반환합니다

동일한 함수를 정의하는 다른 방법은 다음과 같습니다.

기능 작성 new_emp ()는 emp를 $$로 반환합니다
    행 ( 'None', 1000.0, 25, '(2,2)') :: emp;
$$ 언어 토토 베이;

여기서 우리는 A를 썼습니다.select반환됩니다 올바른 복합 유형의 단일 열만. 이것은 아닙니다 이 상황에서는 정말 더 좋지만 그것은 편리한 대안입니다. 일부 경우 - 예를 들어 결과를 계산 해야하는 경우 원하는 복합재를 반환하는 다른 함수를 호출합니다 값.

우리는이 기능을 가치 표현 :

select new_emp ();

         new_emp
-----------------------------
 (없음, 1000.0,25, "(2,2)")

또는이를 테이블 함수라고 부르면 :

선택 *에서 new_emp ();

 이름 | 급여 | 나이 | 작은 침실
------+--------+-----+-------
 없음 | 1000.0 |  25 | (2,2)

두 번째 방법은 더 자세히 설명합니다섹션 35.4.7.

복합 유형을 반환하는 함수를 사용하면 결과에서 하나의 필드 (속성) 만 원합니다. 당신은 그렇게 할 수 있습니다 다음과 같은 구문으로 :

select (new_emp ()). 이름;

 이름
------
 없음

파서가 얻지 못하도록 추가 괄호가 필요합니다. 혼란스러운. 당신이 그들없이 그것을하려고한다면, 당신은 이것:

new_emp (). 이름을 선택하십시오.
오류 : "또는 그 근처의 구문 오류."
1 행 : SELECT NEW_EMP (). 이름;
                        ^

또 다른 옵션은 추출을위한 기능 표기법을 사용하는 것입니다. 기인하다:

select name (new_emp ());

 이름
------
 없음

설명 된대로섹션 8.16.5, 필드 표기법 및 기능 표기법입니다 동등한.

복합 유형을 반환하는 기능을 사용하는 또 다른 방법은 다음과 같습니다. 결과를 올바른 행을 수락하는 다른 함수로 전달하십시오. 입력으로 입력 :

function getName (EMP) 작성 텍스트를 $$로 반환합니다
    1. 이름을 선택하십시오.
$$ 언어 토토 베이;

getName (new_emp ())을 선택하십시오.
 getName
-------
 없음
(1 행)

35.4.4. 토토 베이출력 매개 변수와 기능

함수의 결과를 설명하는 대체 방법은 다음과 같습니다. 로 정의하십시오.출력 매개 변수이 예 :

함수 생성 add_em (x int, y int, out sum int)
'x + y 선택'으로
언어 토토 베이;

add_em (3,7)을 선택하십시오.
 add_em
--------
     10
(1 행)

이것은 본질적으로와 본질적으로 다르지 않습니다.add_em표시섹션 35.4.2. 그만큼 출력 매개 변수의 실제 값은 편리한 것을 제공한다는 것입니다. 여러 열을 반환하는 함수를 정의하는 방법. 을 위한 예,

함수 생성 sum_n_product (x int, y int, out sum int, out product int)
'선택 x + y, x * y'로
언어 토토 베이;

 sum_n_product (11,42)에서 *를 선택하십시오.
 합계 | 제품
-----+-------
  53 |     462
(1 행)

본질적으로 일어난 일은 우리가 기능 결과에 대한 익명 복합 유형. 위 예제는와 동일한 최종 결과가 있습니다.

sum_prod 유형 생성 (sum int, product int);

함수 sum_n_product (int, int) sum_prod를 반환합니다
'$ 1 + $ 2, $ 1 * $ 2'로 AS
언어 토토 베이;

그러나 별도의 복합 유형으로 귀찮게 할 필요는 없습니다. 정의는 종종 편리합니다. 이름이 첨부되어 있습니다 출력 매개 변수는 장식 일뿐 아니라 열을 결정합니다. 익명 복합 유형의 이름. (이름을 생략 한 경우 출력 매개 변수, 시스템은 자체적으로 이름을 선택합니다.)

출력 매개 변수가 통화에 포함되어 있지 않음을 알 수 있습니다. 토토 베이에서 그러한 함수를 호출 할 때 인수 목록. 이것은 왜냐하면Postgre토토 베이만 고려합니다 함수의 호출 서명을 정의하기위한 입력 매개 변수. 그것은 또한 입력 매개 변수 만 삭제하는 것과 같은 목적으로 함수를 참조합니다. 우리는 할 수 있습니다 위의 기능을 중 하나로 삭제하십시오

드롭 함수 sum_n_product (x int, y int, out sum int, out product int);
드롭 함수 sum_n_product (int, int);

매개 변수는로 표시 될 수 있습니다.in( 기본),out, inout또는variadic.inout매개 변수는 두 입력으로 사용됩니다 매개 변수 (호출 인수 목록의 일부) 및 출력 매개 변수 (결과 레코드 유형의 일부).variadic매개 변수는 입력 매개 변수이지만 그렇습니다 다음에 설명 된대로 특별히 처리.

35.4.5. 토토 베이변수의 기능 인수

토토 베이함수를 선언 할 수 있습니다 모든 인수의 수를 받아들이려면"선택 사항"인수는 동일합니다 데이터 유형. 선택적 인수는 다음과 같은 기능으로 전달됩니다. 배열. 마지막 매개 변수를로 표시하여 함수가 선언됩니다.variadic; 이 매개 변수는 선언되어야합니다 배열 유형으로. 예를 들어:

함수 생성 mleast (variadic arr numeric [])는 숫자를 $$로 반환합니다
    generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오.
$$ 언어 토토 베이;

mleast (10, -1, 5, 4.4)를 선택하십시오.
 mleast 
--------
     -1
(1 행)

효과적으로, 모든 실제 인수는variadic위치가 a로 모입니다 당신이 작성한 것처럼 1 차원 배열

mleast (배열 [10, -1, 5, 4.4]);    - 작동하지 않습니다

당신은 실제로 그것을 쓸 수는 없습니다. 이 기능 정의와 일치합니다. 표시된 매개 변수variadic하나 이상의 발생과 일치합니다 자체 유형이 아닌 요소 유형.

때로는 이미 구성된 것을 통과 할 수있는 것이 유용합니다. 변수 함수로의 배열; 이것은 특히 하나 일 때 편리합니다 variadic 함수는 배열 매개 변수를 다른 매개 변수로 전달하려고합니다. 하나. 또한 이것은 변수 함수를 호출하는 유일한 안전한 방법입니다. 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견됩니다. 보다섹션 10.3. 당신은 이것을 할 수 있습니다 지정하여variadic전화에서 :

mleast (variadic array [10, -1, 5, 4.4]); 선택

이것은 함수의 변수 매개 변수의 확장을 방지합니다 그 요소 유형으로, 배열 인수 값을 정상적으로 일치합니다.variadic만 가능합니다 함수 호출의 마지막 실제 인수에 첨부.

지정variadic통화도 있습니다 빈 배열을 Variadic 함수로 전달하는 유일한 방법은 예:

mleast 선택 (variadic array [] :: numeric []);

간단히 쓰기mleast () 선택그렇지 않습니다 Variadic 매개 변수는 하나 이상의 실제 일치해야하므로 작동합니다. 논쟁. (두 번째 함수를 정의 할 수 있습니다.mleast30271_30330

variadic 매개 변수에서 생성 된 배열 요소 매개 변수 자신의 이름이없는 것으로 취급됩니다. 이것은 그것이 의미합니다 명명 된 인수를 사용하여 변수 함수를 호출 할 수 없습니다. (PostgreSQL : 문서 : 9.3 : 롤 토토 호출) 지정할 때variadic. 예를 들어, 이것은 작동합니다 :

mleast 선택 (variadic arr : = 배열 ​​[10, -1, 5, 4.4];

그러나 이것들은 아닙니다 :

mleast (ARR : = 10);
mleast를 선택하십시오 (arr : = 배열 ​​[10, -1, 5, 4.4];

35.4.6. 토토 베이기본값이있는 함수 인수

함수는 일부 또는 전부의 기본값으로 선언 할 수 있습니다. 입력 인수. 기본값은 언제든지 삽입됩니다 기능은 실제 인수가 충분하지 않아 호출됩니다. 부터 인수는 실제 인수의 끝에서만 생략 할 수 있습니다. List, 기본값이있는 매개 변수의 모든 매개 변수는 기본값도 있습니다. (명명 된 인수의 사용 표기법은이 제한이 완화 될 수 있습니다. 위치 인수 표기법이 현명하게 작동하도록 시행되었습니다.) 사용하든 아니든이 기능은 일부 사용자가있는 데이터베이스에서 기능을 호출 할 때의 예방 조치 다른 사용자를 불신; 보다토토 커뮤니티 42 |_99.

예 :

함수 생성 foo (a int, b int default 2, c int default 3)
int를 반환합니다
언어 토토 베이
$$로
    $ 1 + $ 2 + $ 3을 선택하십시오.
$$;

foo (10, 20, 30)를 선택하십시오.
 foo 
-----
  60
(1 줄)

foo (10, 20)를 선택하십시오.
 foo 
-----
  33
(1 줄)

foo (10)를 선택하십시오.
 foo 
-----
  15
(1 줄)

foo ()를 선택하십시오.  - 첫 번째 인수에 대한 기본값이 없으므로 실패합니다.
오류 : 함수 foo ()가 존재하지 않습니다

the=부호도 대신 사용할 수 있습니다 키워드기본값.

35.4.7. 토토 베이테이블 소스로 기능

모든 토토 베이 함수는에 사용할 수 있습니다.From쿼리 조항이지만 특히 복합 유형을 반환하는 기능에 유용합니다. 함수가있는 경우 기본 유형을 반환하도록 정의 된 테이블 함수는 1 열 테이블. 함수가 복합재를 반환하도록 정의 된 경우 타입, 테이블 함수는 각 속성에 대한 열을 생성합니다. 복합 유형.

여기 예입니다.

테이블 foo 생성 (FOODER int, foosubid int, fooname 텍스트);
foo 값에 삽입 (1, 1, 'Joe');
foo 값에 삽입 (1, 2, 'ed');
foo 값에 삽입 (2, 1, 'Mary');

function getfoo (int)를 만들기 foo를 $$로 반환합니다
    FOO에서 * FOO FOOOD = $ 1;
$$ 언어 토토 베이;

getfoo (1)에서 *, 상단 (Fooname)을 선택하여 t1;

 거품 | foosubid | Fooname | 높은
-------+----------+---------+-------
     1 |        1 | 조 | 조
(1 행)

예에서 알 수 있듯이, 우리는 기능의 결과는 마치 일반 테이블.

우리는 함수에서 하나의 행만 얻었습니다. 이것은 우리가 사용하지 않았기 때문에setof. 그게 다음 섹션에서 설명합니다.

35.4.8. 토토 베이함수 반환 세트

토토 베이 함수가 반환으로 선언 된 경우setofSomegetype, 기능의 최종 쿼리는 완료로 실행되며 각 행 출력은 결과 세트의 요소로 반환됩니다.

이 기능은 일반적으로에서 함수를 호출 할 때 사용됩니다.From절. 이 경우 각 행 함수에 의해 반환 된 것은 질문. 예를 들어, 해당 테이블을 가정합니다foo위와 동일한 내용이 있으며 다음과 같은 내용이 있습니다.

함수 생성 getfoo (int)는 foo를 $$로 반환합니다
    FOO에서 * FOO FOOOD = $ 1;
$$ 언어 토토 베이;

getfoo (1)에서 *를 선택하여 t1;

그러면 우리는 다음을 얻을 것입니다 :

폼 | foosubid | Fooname
-------+----------+-------
     1 |        1 | 조
     1 |        2 | 에드
(2 줄)

열과 함께 여러 행을 반환 할 수도 있습니다. 다음과 같이 출력 매개 변수로 정의됩니다.

생성 테이블 탭 (y int, z int);
탭 값 (1, 2), (3, 4), (5, 6), (7, 8)에 삽입;

함수 작성 sum_n_product_with_tab (x int, Out Sum int, Out Out Product int)
Setof 레코드를 반환합니다
$$로
    $ 1 + Tab.y, $ 1 * Tab.y에서 탭에서 선택하십시오.
$$ 언어 토토 베이;

SOM_N_PRODUCT_WITH_TAB (10)에서 *를 선택하십시오.
 합계 | 제품
-----+-------
  11 |      10
  13 |      30
  15 |      50
  17 |      70
(4 줄)

여기서 핵심 요점은 당신이 작성해야한다는 것입니다레코드를 반환함수를 나타 내기 위해 단지 하나 대신 여러 행을 반환합니다. 하나만있는 경우 출력 매개 변수, 대신 해당 매개 변수 유형을 작성하십시오.레코드.

쿼리 결과를 구성하는 것이 종종 유용합니다. 세트 리턴 기능을 여러 번 호출합니다 연속적인 행에서 오는 각 호출에 대한 매개 변수 테이블 또는 하위 쿼리. 이를 선호하는 방법은 사용하는 것입니다.측면key Word,섹션 7.2.1.5. 다음은 설정 함수를 사용하는 예입니다 나무 구조의 요소 열거 :

노드에서 선택 *;
   이름 | 조상
----------+--------
 상단 |
 child1 | 맨 위
 child2 | 맨 위
 child3 | 맨 위
 하위 하일드 1 | child1
 subchild2 | child1
(6 줄)

함수 listchildren (텍스트)을 $$로 설정합니다
    부모 = $ 1 인 노드에서 이름을 선택하십시오
$$ 언어 토토 베이 안정;

선택 *에서 ListChildren ( 'top');
 목록
--------------
 child1
 child2
 child3
(3 줄)

이름을 선택하고, 노드에서 자녀, 자녀로서의 측면 목록 (이름);
  이름 |   어린이
--------+------------
 상단 | child1
 상단 | child2
 상단 | child3
 child1 | 하위 하드 1
 child1 | subchild2
(5 줄)

이 예제는 우리가 할 수 없었던 일을하지 않습니다. 간단한 결합으로 더 복잡한 계산에서 일부 작업을 함수에 넣는 것은 매우 편리 할 수 ​​있습니다.

현재, 반환 세트도 호출 할 수 있습니다. 쿼리 목록을 선택하십시오. 쿼리가 생성하는 각 행에 대해 그 자체로는 반환 세트가 호출되고 출력 행이 함수 결과 세트의 각 요소에 대해 생성됩니다. 메모, 그러나이 기능은 감가 상각되고 제거 될 수 있습니다. 향후 릴리스. 이전 예제도 수행 할 수 있습니다 이와 같은 쿼리 :

ListChildren ( 'top')을 선택합니다.
 목록
--------------
 child1
 child2
 child3
(3 줄)

노드에서 이름, ListChildren (이름)을 선택하십시오.
  이름 | 목록
--------+-------------
 상단 | child1
 상단 | child2
 상단 | child3
 child1 | 하위 하드 1
 child1 | subchild2
(5 줄)

마지막select, 아니요 출력 행이 나타납니다Child2, Child3등. 이런 일이 발생합니다ListChildren그것들을 위해 빈 세트를 반환합니다 인수이므로 결과 행이 생성되지 않습니다. 이것은 동일합니다 우리가 내부 결합에서 기능 결과에 이르렀을 때의 행동은 사용 사용측면구문.

참고 :함수의 마지막 명령이삽입, 업데이트또는삭제with반환, 그 명령은 항상 실행됩니다 함수가 선언되지 않더라도 완료setof또는 호출 쿼리가 모든 것을 가져 오는 것은 아닙니다 결과 행. 에 의해 생성 된 추가 행반환조항은 조용히 삭제되었지만 명령 된 테이블 수정은 여전히 ​​발생합니다 (모두 완료됩니다 함수에서 돌아 오기 전에).

참고 :세트 회전 함수 사용의 핵심 문제 선택 목록에서From절은 둘 이상의 세트 리턴 기능을 동일한 선택 목록은 매우 현명하게 행동하지 않습니다. (당신이 실제로 무엇을 그렇게하면 최소한의 출력 행입니다. 각각에 의해 생성 된 행의 수의 일반적인 배수 설정 함수 설정.)측면구문은 여러 호출 할 때 덜 놀라운 결과를 낳습니다 설정 함수를 설정하고 대신 사용해야합니다.

35.4.9. 토토 베이반환 기능테이블

세트를 반환하는 것으로 함수를 선언하는 또 다른 방법이 있습니다. 구문을 사용하는 것입니다반환 테이블(). 이것은 하나 이상 사용하는 것과 동일합니다out매개 변수 플러스 기능을 반환으로 표시기록 설정(또는setofa 적절한 단일 출력 매개 변수 유형). 이 표기법입니다 최근 버전의 토토 베이 표준에 지정되었으므로 사용하는 것보다 더 휴대하기setof.

예를 들어, 이전의 합계 및 제품 예제도 가능합니다 이 방법 :

함수 생성 Sum_n_Product_with_tab (x int)
테이블 (합산, 제품 int)을 $$로 반환합니다
    $ 1 + Tab.y, $ 1 * Tab.y에서 탭에서 선택하십시오.
$$ 언어 토토 베이;

명시 적 사용이 허용되지 않습니다out또는inout테이블 리턴표기법 - 모든 출력을 넣어야합니다 의 열테이블목록.

35.4.10. 다형성토토 베이기능

토토 베이함수를 선언 할 수 있습니다 다형성 유형을 받아들이고 반환하려면Anylement, AnyArray, AnynonArray, AnyEnumAnyRa토토 베이e. 보다섹션 35.2.5다형성에 대한 자세한 설명 기능. 다형성 기능은 다음과 같습니다.make_array두 개에서 배열을 구축합니다 임의의 데이터 유형 요소 :

함수 생성 make_array (Anylement, Anylement)는 anyArray를 $$로 반환합니다
    배열을 선택하십시오 [$ 1, $ 2];
$$ 언어 토토 베이;

intarray, make_array ( 'a':: text, 'b')로 make_array (1, 2)를 선택하여 textarray;
 intarray | TextArray
----------+-----------
 1,2 | a, b

typecast의 사용에 주목하십시오'a':: text인수가 유형임을 지정합니다텍스트. 논쟁이 필요한 경우 필요합니다 문자열 문자 그대로, 그렇지 않으면 유형으로 취급되기 때문에알 수없는및 배열알 수없는유효한 유형이 아닙니다. 타입 캐스트가 없으면, 당신 다음과 같은 오류가 발생합니다.

오류 : 입력 유형이 "알 수없는"이기 때문에 다형성 유형을 결정할 수 없습니다.

고정 된 고정 된 다형성 논증이 허용됩니다. 반환 유형이지만 대화는 아닙니다. 예를 들어:

함수 생성 IS_GREATER (Anylement, Anylement)는 부울을 $$로 반환합니다
    $ 1 $ 2를 선택하십시오.
$$ 언어 토토 베이;

IS_GREATER (1, 2)를 선택하십시오.
 is_greater
------------
 에프
(1 줄)

function invalid_func ()를 $$로 반환합니다
    선택 1;
$$ 언어 토토 베이;
오류 : 결과 데이터 유형을 결정할 수 없습니다
세부 사항 : 다형성 유형을 반환하는 함수는 하나 이상의 다형성 인수를 가져야합니다.

다형성은 출력이있는 함수와 함께 사용할 수 있습니다 논쟁. 예를 들어:

기능 DUP 작성 (F1 Anylement, Out F2 Anylement, Out F3 AnyArray)
'선택 $ 1, 배열 [$ 1, $ 1]'언어 토토 베이;

* DUP에서 *를 선택하십시오 (22);
 f2 |   F3
----+-------
 22 | 22,22

다형성은 다양한 기능과 함께 사용할 수 있습니다. 을 위한 예:

함수 생성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다
    generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오.
$$ 언어 토토 베이;

anyleast (10, -1, 5, 4)를 선택하십시오.
 anyleast 
---------
       -1
(1 줄)

anyleast ( 'abc':: text, 'def')를 선택하십시오.
 anyleast 
---------
 알파벳
(1 줄)

conection concat_values ​​(text, variadic anyArray)는 텍스트를 $$로 반환합니다
    array_to_string ($ 2, $ 1)을 선택하십시오.
$$ 언어 토토 베이;

concat_values ​​( '|', 1, 4, 2)를 선택하십시오.
 concat_values 
-----------------
 1 | 4 | 2
(1 행)

35.4.11. 토토 베이기능 Collations

토토 베이 함수에 하나 이상의 Collatable 매개 변수가있는 경우 데이터 유형, 각 기능 호출에 대해 Collation이 식별됩니다. 다음과 같이 실제 인수에 할당 된 콜라주에 따라 설명토토 꽁 머니 : 문서 : 9.3 : Collation Support. 경우 a Collation이 성공적으로 식별됩니다 (즉, 충돌은 없습니다 인수들 사이의 암시 적 콜라주). 매개 변수는 해당 충돌이 암시 적으로 처리되는 것으로 취급됩니다. 이것 내부의 Collation에 민감한 작업의 동작에 영향을 미칩니다 기능. 예를 들어 사용AnyLeast위에서 설명한 기능, 결과 의

44605_44644

데이터베이스의 기본 Collation에 따라 다릅니다. 안에C로케일 결과가 될 것입니다ABC그러나 다른 많은 지역에서는ABC. A를 추가하여 사용할 수있는 콜라이트를 강요 할 수 있습니다.Collate주장에 대한 조항, 예를 들어

anyleast를 선택하십시오 ( 'ABC':: text, 'ABC'Collate "C");

또는 기능이 호출 된 내용에 관계없이 특정 Collation, 삽입Collate함수에 필요한 조항 정의. 이 버전의AnyLeast항상 사용할 것입니다en_us비교할 로케일 문자열 :

기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다
    generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i] "collate"en_us ");
$$ 언어 토토 베이;

그러나 이것은에 적용되면 오류가 발생합니다. 청소 불가능한 데이터 유형.

실제 COLLATION을 식별 할 수없는 경우 인수, 그런 다음 토토 베이 함수는 매개 변수를 그들의 데이터 유형의 기본 콜 레이션 (일반적으로 데이터베이스의 기본 충돌이지만 매개 변수와 다를 수 있습니다 도메인 유형).

Collatable 매개 변수의 동작은 텍스트 데이터에만 적용되는 제한된 형태의 다형성 형태 유형.