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

37.5. 쿼리 언어 (SQL) 스포츠 토토 사이트

SQL 함수는 임의의 SQL 문을 실행하여 목록의 마지막 쿼리 결과를 반환합니다. 간단한 (비 세트) 케이스에서 마지막 쿼리 결과의 첫 번째 행이 반환됩니다. (그 점을 명심하십시오첫 번째 행멀티 로우 결과의 결과는 사용하지 않는 한 잘 정의되지 않습니다주문 by.) 마지막 쿼리가 줄을 전혀 반환하지 않으면 널 값이 반환됩니다.

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

SQL 함수의 본문은 세미콜론으로 분리 된 SQL 문의 목록이어야합니다. 마지막 진술 후 세미콜론은 선택 사항입니다. 함수가 반환으로 선언되지 않는 한void, 마지막 진술은 A이어야합니다.select또는 an삽입, 업데이트또는삭제반환절.

SQL언어는 함께 포장하여 스포츠 토토 사이트로 정의 할 수 있습니다. 게다가select쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다 (삽입, 업데이트삭제) 및 기타 SQL 명령. (예 : 트랜잭션 제어 명령을 사용할 수 없습니다 (예 :커밋, SavePoint및 일부 유틸리티 명령 (예 :진공, inSQL스포츠 토토 사이트) 그러나 최종 명령은이어야합니다.select또는 a반환함수의 반환 유형으로 지정된 내용을 반환하는 절. 또는 동작을 수행하지만 반환 할 유용한 값이없는 SQL 함수를 정의하려면 반환으로 정의 할 수 있습니다void. 예를 들어이 스포츠 토토 사이트는의 음의 급여로 행을 제거합니다.emp테이블 :

함수 작성 clean_emp () voids as '
    emp에서 삭제하십시오
        여기서 급여 <0;
'언어 SQL;

clean_emp ()를 선택하십시오.

 clean_emp
----------

(1 행)

note

SQL 함수의 전체 본체는 실행되기 전에 구문 분석됩니다. SQL 함수에는 시스템 카탈로그를 변경하는 명령이 포함될 수 있습니다 (예 :테이블 생성), 스포츠 토토 사이트의 이후 명령을 구문 분석하는 동안 그러한 명령의 효과가 보이지 않을 것입니다. 예를 들어,테이블 생성 foo (...); foo 값에 삽입 (...);이후로 단일 SQL 함수로 패키지 된 경우 원하는대로 작동하지 않습니다foo은 아직 존재하지 않을 것입니다삽입명령이 구문 분석됩니다. 사용하는 것이 좋습니다pl/pgsql이러한 유형의 상황에서 SQL 함수 대신

의 구문기능 생성명령은 스포츠 토토 사이트 본문을 문자열 상수로 작성해야합니다. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (참조섹션 4.1.2.417190_17322') 및 백 슬래시 (\) (탈출 문자열 구문을 가정) 스포츠 토토 사이트 본문 (참조섹션 4.1.2.1).

37.5.1. 에 대한 논쟁SQL기능

SQL 함수의 인수는 이름이나 숫자를 사용하여 함수 본문에서 참조 할 수 있습니다. 두 방법의 예는 아래에 나타납니다.

이름을 사용하려면 함수 인수를 이름을 가진 것으로 선언 한 다음 해당 이름을 함수 본문에 작성하십시오. 인수 이름이 함수 내에서 현재 SQL 명령의 열 이름과 동일하면 열 이름이 우선합니다. 이것을 무시하려면 인수 이름을 함수 자체의 이름으로 평가합니다.function_name.argument_name. (이것이 자격을 갖춘 열 이름과 충돌하는 경우, 열 이름이 승리합니다. SQL 명령 내에서 테이블에 대한 다른 별칭을 선택하여 모호성을 피할 수 있습니다.).

구형 숫자 접근 방식에서는 구문을 사용하여 인수를 참조합니다.$n: $ 1첫 번째 입력 인수를 말합니다$ 2두 번째로. 이것은 특정 주장이 이름으로 선언되었는지 여부에 관계없이 작동합니다.

인수가 복합 유형 인 경우, 도트 표기법 (예 :argname.FieldName또는$ 1.FieldName, 인수의 속성에 액세스하는 데 사용될 수 있습니다. 다시 말하지만, 인수 이름이있는 인수 이름을 가진 인수 이름을 가진 인수 이름으로 인수 이름을 가진 인수 이름을 지배해야 할 수도 있습니다.

SQL 기능 인수는 식별자가 아닌 데이터 값으로 만 사용할 수 있습니다. 예를 들어 이것은 합리적입니다 :

myTable 값에 삽입 ($ 1);

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

$ 1 값 (42)에 삽입;

Note

SQL 기능 인수를 참조하기 위해 이름을 사용하는 능력PostgreSQL9.2. 이전 서버에서 사용할 함수는를 사용해야합니다.$n표기법.

37.5.2. SQL기본 유형의 기능

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

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

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

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

 하나
-----
   1

스포츠 토토 사이트의 결과에 대해 스포츠 토토 사이트 본문 내에서 열 별칭을 정의했음을 알 수 있습니다 (이름 포함결과), 그러나이 열 별칭은 함수 외부에 표시되지 않습니다. 따라서 결과는 레이블이 지정됩니다ONE대신결과.

거의 정의하기 쉽습니다SQL기본 유형을 인수로 취하는 기능 :

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

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

 답변
--------
      3

대안 적으로, 우리는 인수의 이름을 분배하고 숫자를 사용 할 수 있습니다 :

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

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

 답변
--------
      3

여기에 유용한 기능이 있습니다.

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

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

TF1 (17, 100.0); 선택

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

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

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

균형을 조정하고 새로운 밸런스를 반환합니다. 를 사용하여 하나의 명령에서 동일한 일을 수행 할 수 있습니다.반환:

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

aSQL함수는 선언 된 결과 유형을 정확하게 반환해야합니다. 명시적인 캐스트를 삽입해야 할 수도 있습니다. 예를 들어, 이전을 원했다고 가정합니다.add_em반환 유형 함수float8대신. 작동하지 않습니다 :

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

다른 상황에서도PostgreSQL변환하기 위해 암시 적 캐스트를 기꺼이 삽입 할 것입니다정수tofloat8. 우리는 그것을로 쓸 필요가 있습니다.

함수 생성 add_em (정수, 정수)은 float8을 $$로 반환합니다
    선택 ($ 1 + $ 2) :: float8;
$$ 언어 SQL;

37.5.3. SQL복합 유형의 기능

복합 유형의 인수와 함께 스포츠 토토 사이트를 작성할 때, 우리는 원하는 인수뿐만 아니라 해당 인수의 원하는 속성 (필드)을 지정해야합니다. 예를 들어,emp는 직원 데이터를 포함하는 테이블이므로 테이블의 각 행의 복합 유형의 이름입니다. 다음은 함수입니다double_salary두 배가 된 경우 누군가의 급여가 무엇인지 계산합니다 :

테이블 emp 생성 (
    이름 텍스트,
    급여 숫자,
    나이 정수,
    칸막이 지점
);

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

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

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

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

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

꿈으로 이름, 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)';
$$ 언어 SQL;

이 예에서는 일정한 값으로 각 속성을 지정했지만 이러한 상수에 대해 계산이 대체되었을 수 있습니다..

스포츠 토토 사이트 정의에 대한 두 가지 중요한 사항을 참고하십시오.

  • 쿼리의 선택 목록 순서는 복합 유형과 관련된 테이블에 열이 나타나는 것과 정확히 동일해야합니다. (위에서와 같이 열을 지정하는 것은 시스템과 관련이 없습니다.)

  • 각 표현식 유형이 복합 유형의 해당 열과 일치하고 필요한 경우 캐스트를 삽입해야합니다. 그렇지 않으면 우리는 다음과 같은 오류를 얻을 것입니다 :

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

    기본 유형 케이스와 마찬가지로 함수는 캐스트를 자동으로 삽입하지 않습니다.

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

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

여기서 우리는 A를 썼습니다.select올바른 복합 유형의 단일 열만 리턴합니다. 이 상황에서는 더 나은 것은 아니지만 경우에 따라 편리한 대안입니다. 예를 들어 원하는 복합 값을 반환하는 다른 함수를 호출하여 결과를 계산 해야하는 경우. 또 다른 예는 일반 복합 유형이 아닌 복합재를 통해 도메인을 반환하는 함수를 작성하려는 경우 도메인 유형의 정확히 값을 생성 할 수있는 다른 방법이 없기 때문에 항상 단일 열을 반환하는 것으로 작성해야한다는 것입니다..

값 표현식 에서이 함수를 사용 하여이 기능을 직접 호출 할 수 있습니다.

select new_emp ();

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

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

선택 *에서 new_emp ();

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

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

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

select (new_emp ()). 이름;

 이름
------
 없음

소포기가 혼란스러워지지 않도록 추가 괄호가 필요합니다. 당신이 그들없이 그것을 시도한다면, 당신은 다음과 같은 것을 얻습니다 :

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

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

select name (new_emp ());

 이름
------
 없음

설명 된대로섹션 8.16.5, 필드 표기법 및 기능 표기법은 동일합니다.

함수를 사용하는 다른 방법 복합 유형을 반환하는 다른 방법은 결과를 입력으로 올바른 행 유형을 수락하는 다른 함수로 결과를 전달하는 것입니다.

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

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

37.5.4. SQL출력 매개 변수와 스포츠 토토 사이트

함수의 결과를 설명하는 대안적인 방법은출력 매개 변수,이 예에서와 같이 :

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

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

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

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

 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
언어 SQL;

그러나 별도의 복합 유형 정의를 귀찮게 할 필요는 없습니다. 출력 매개 변수에 첨부 된 이름은 단순한 장식이 아니라 익명 복합 유형의 열 이름을 결정합니다. (출력 매개 변수의 이름을 생략하면 시스템이 자체적으로 이름을 선택합니다.)

SQL에서 그러한 함수를 호출 할 때 출력 매개 변수가 호출 인수 목록에 포함되어 있지 않음을 알 수 있습니다. 이건이기 때문입니다.PostgreSQL함수의 호출 서명을 정의하기 위해 입력 매개 변수 만 고려합니다. 즉, 입력 매개 변수 만 기능을 삭제하는 것과 같은 기능을 참조 할 때만 중요합니다. 위의 기능을 중 하나로 삭제할 수 있습니다

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

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

37.5.5. SQL가변 수의 인수와 기능

SQL스포츠 토토 사이트는 모든 인수 숫자를 수락하도록 선언 할 수 있습니다.선택 사항인수는 동일한 데이터 유형입니다. 선택적 인수는 배열로 함수로 전달됩니다. 마지막 매개 변수를로 표시하여 함수가 선언됩니다.variadic; 이 매개 변수는 배열 유형으로 선언되어야합니다. 예를 들어:

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

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

효과적으로, 모든 실제 인수는variadic위치가 마치 마치 마치 마치 1 차원 배열로 모여

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

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

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

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

이것은 함수의 variadic 매개 변수의 요소 유형으로의 확장을 방지하여 배열 인수 값이 정상적으로 일치하도록 허용합니다..variadic스포츠 토토 사이트 호출의 마지막 실제 인수에만 첨부 될 수 있습니다.

지정variadic호출에서 빈 배열을 Variadic 스포츠 토토 사이트로 전달하는 유일한 방법입니다.

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

간단히 쓰기mleast () 선택variadic 매개 변수는 적어도 하나의 실제 인수와 일치해야하므로 작동하지 않습니다. (두 번째 함수를 정의 할 수 있습니다.mleast, 매개 변수가없는 경우, 그러한 통화를 허용하려는 경우.)

변수 매개 변수에서 생성 된 배열 요소 매개 변수는 자신의 이름이없는 것으로 취급됩니다. 즉, 이름의 인수 (를 사용하여 variadic 함수를 호출 할 수 없습니다.사설 토토 사이트 : 문서 : 12 : 4.3. 스포츠 토토 사이트 호출), 지정할 때를 제외하고variadic. 예를 들어, 이것은 작동합니다 :

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

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

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

37.5.6. SQL인수의 기본값이있는 스포츠 토토 사이트

함수는 일부 또는 모든 입력 인수의 기본값으로 선언 할 수 있습니다. 기능이 불충분하게 실제 인수로 호출 될 때마다 기본값이 삽입됩니다. 인수는 실제 인수 목록의 끝에서만 생략 할 수 있으므로 기본값을 가진 매개 변수의 모든 매개 변수는 기본값도 있어야합니다. (명명 된 인수 표기법을 사용하면이 제한이 완화 될 수 있지만, 위치 인수 표기법이 현명하게 작동하도록 여전히 시행되어 있습니다.)이 기능을 사용하든이 기능은 일부 사용자가 다른 사용자를 불신하는 데이터베이스에서 기능을 호출 할 때 예방 조치가 필요합니다. 보다스포츠 토토 결과 42 |_1 |04.

예 :

기능 생성 foo (in int, b int default 2, c int default 3)
int를 반환합니다
언어 SQL
$$로
    $ 1 + $ 2 + $ 3을 선택하십시오.
$$;

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

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

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

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

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

37.5.7. SQL테이블 소스로 기능

모든 SQL 기능은에 사용할 수 있습니다.From쿼리 조항이지만 복합 유형을 반환하는 기능에 특히 유용합니다. 함수가 기본 유형을 반환하도록 정의되면 테이블 함수는 1 열 테이블을 생성합니다. 함수가 복합 유형을 반환하도록 정의되면 테이블 함수는 복합 유형의 각 속성에 대한 열을 생성합니다.

여기 예입니다.

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

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

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

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

예에서 알 수 있듯이, 우리는 함수 결과의 열을 일반 테이블의 열인 것과 마찬가지로 동일하게 작업 할 수 있습니다..

우리는 스포츠 토토 사이트에서 하나의 행만 얻었습니다. 우리가 사용하지 않았기 때문입니다setof. 다음 섹션에 설명되어 있습니다.

37.5.8. SQL스포츠 토토 사이트 반환 세트

SQL 함수가 반환으로 선언 될 때setofSomegetype, 함수의 최종 쿼리가 완료로 실행되고 출력이 결과 세트의 요소로 반환됩니다.

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

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

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에서 탭에서 선택하십시오.
$$ 언어 SQL;

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

여기서 핵심 요점은 당신이 써야한다는 것입니다setof record 반환함수가 단지 하나 대신 여러 행을 반환한다는 것을 나타냅니다. 출력 매개 변수가 하나만 있으면 대신 해당 매개 변수 유형을 작성하십시오.레코드.

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

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

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

선택 *에서 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해당 인수에 대한 빈 세트를 반환하므로 결과 행이 생성되지 않습니다. 이것은 우리가 내부 조인에서 |를 사용할 때 기능 결과에 얻은 것과 동일한 동작입니다.측면구문.

PostgreSQL'쿼리의 선택 목록에서 설정 함수에 대한 동작의 동작은 설정 퇴행 함수가 a와 거의 동일합니다측면에서-대신 항목. 예를 들어,

X, Generate_Series (1,5) as as g as G generate_series (1,5)를 선택하십시오.

거의 동일합니다

탭에서 x, g, general generate_series (1,5) as g;를 선택하십시오.

이 특정 예에서 플래너가 넣을 수 있다는 점을 제외하고는 정확히 동일합니다.g이후 중첩 루프 조인의 외부에서g실제 측면 의존성이 없습니다. 이로 인해 출력 행 순서가 다릅니다. 선택 목록의 설정 스포츠 토토 사이트는 항상 중첩 루프 조인의 내부에있는 것처럼 항상 평가됩니다.From조항, 함수가 다음 행 전에 완료되도록From절로 고려됩니다.

쿼리의 선택 목록에 세트 리턴 기능이 둘 이상인 경우 동작은 함수를 단일에 넣는 것과 유사합니다측면 행 (...) From-Clase 항목. 기본 쿼리의 각 행마다 각 함수의 첫 번째 결과를 사용하여 출력 행이 있으며, 두 번째 결과를 사용하는 출력 행 등이 있습니다. 설정 회복 함수 중 일부가 다른 것보다 출력이 적은 경우, 널 값이 누락 된 데이터로 대체되므로 하나의 기본 행에 방출되는 총 행 수는 가장 많은 출력을 생성하는 설정 함수와 동일합니다. 따라서 설정 퇴행 함수가 실행in Lockstep그들이 모두 소진 될 때까지 다음 기본 행으로 실행이 계속됩니다.

Set Returning 함수는 선택 목록에 중첩 될 수 있지만, 허용되지는 않지만From-클래스 항목. 그러한 경우, 각 둥지 수준은 별도의 마치 마치 마치 별도로 처리됩니다측면 행 (...)항목. 예를 들어,

srf1 (srf2 (x), srf3 (y)), srf4 (srf5 (z))를 선택하십시오.

정리 스포츠 토토 사이트SRF2, SRF3SRF5각 행의 각 행에 대해 잠금 장치에서 실행됩니다, 그리고SRF1SRF4낮은 스포츠 토토 사이트에 의해 생성 된 각 행에 잠금 상태에 적용됩니다.

returning 함수는 조건부 평가 구성 (예 : 내에서 사용할 수 없습니다.CASE또는Coalesce. 예를 들어, 고려

x 0을 x 0으로 만들 때 X를 선택한 다음 탭에서 0 종료 탭;

이것은 입력 행을 5 번 반복해야 할 것 같습니다x 0, 그렇지 않은 사람들의 단일 반복; 그러나 실제로 왜냐하면Generate_Series (1, 5)암시 적으로 실행됩니다측면에서case표현식이 평가되어 모든 입력 행의 5 회 반복을 생성합니다. 혼란을 줄이려면 그러한 경우 대신 구문 분석 시간 오류가 발생합니다.

Note

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

Note

PostgreSQL10, 동일한 선택 목록에 둘 이상의 세트 리턴 기능을 넣는 것은 항상 같은 수의 행을 생성하지 않는 한 매우 현명하게 행동하지 않았습니다. 그렇지 않으면, 당신이 얻은 것은 세트 회전 함수에 의해 생성 된 행의 수의 가장 일반적인 배수와 동일한 다수의 출력 행이었습니다. 또한, 중첩 된 세트 리턴 링 함수는 위에서 설명한대로 작동하지 않았다. 대신, 정식 회복 함수는 최대 하나의 정리 인수를 가질 수 있으며, 세트 회전 함수의 각 둥지는 독립적으로 실행되었습니다. 또한 조건부 실행 (내부 설정 함수CASEetc)는 이전에 허용되어 더 많은 것을 복잡하게 만들었습니다. 사용측면구식 작업에 필요한 쿼리를 작성할 때 구문이 권장됩니다PostgreSQL버전 - 다른 버전에서 일관된 결과를 제공하기 때문입니다. 설정 회전 함수의 조건부 실행에 의존하는 쿼리가있는 경우 조건부 테스트를 사용자 정의 설정 함수로 이동하여이를 수정할 수 있습니다. 예를 들어,

x, y 0 인 경우 x를 선택한 다음 a gene_series (1, z) else 5 끝 탭;

함수 생성 case_generate_series (cond bool, start int, fin int, els int)
  int를 $$로 반환합니다
시작하다
  Cond라면
    return query select generate_series (start, fin);
  또 다른
    쿼리 선택 ELS;
  끝 IF;
끝 $$ 언어 plpgsql;

탭에서 X, Case_Generate_Series (y 0, 1, z, 5)를 선택하십시오.

이 제형은 모든 버전의에서 동일하게 작동합니다.PostgreSQL.

37.5.9. SQL반환 기능테이블

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

예를 들어, 이전의 합계 및 제품 예제도 다음 방식으로 수행 할 수 있습니다 :

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

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

37.5.10. 다형성SQL기능

SQL기능은 다형성 유형을 수락하고 반환하도록 선언 할 수 있습니다Anylement, AnyArray, AnynonArray, AnyEnumAnyRange. 보다섹션 37.2.5다형성 기능에 대한 자세한 설명. 다형성 기능은 다음과 같습니다.make_array두 개의 임의의 데이터 유형 요소에서 배열을 구축하는 것 :

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

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

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

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

고정 된 반환 유형으로 다형성 인수를 가질 수는 있지만 그 반대는 그렇지 않습니다. 예를 들어:

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

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

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

다형성은 출력 인수가있는 스포츠 토토 사이트와 함께 사용할 수 있습니다. 예를 들어:

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

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

다형성은 변수 스포츠 토토 사이트와 함께 사용할 수 있습니다. 예를 들어:

기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다
    generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오.
$$ 언어 SQL;

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)을 선택하십시오.
$$ 언어 SQL;

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

37.5.11. SQLCollations와의 기능

SQL 함수에 하나 이상의 Collatable Data 유형의 매개 변수가있는 경우,에 설명 된대로 실제 인수에 할당 된 콜로레이션에 따라 각 함수 호출에 따라 Collation이 식별됩니다.PostgreSQL : 문서 : 12 : 23.2. 배트맨 토토 Support. Collation이 성공적으로 식별되면 (즉, 인수간에 암시 적 콜라주의 충돌이 없음) 모든 Collatable 매개 변수는 해당 충돌을 암시 적으로 갖는 것으로 취급됩니다. 이는 스포츠 토토 사이트 내에서 Collation-Ensentivent Operation의 동작에 영향을 미칩니다. 예를 들어 사용AnyLeast위에서 설명한 기능, 결과

anyleast ( 'ABC':: Text, 'ABC'); 선택

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

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

또는 대안 적으로, 호출 된 내용에 관계없이 특정 콜레이션에서 기능을 수행하려면Collate스포츠 토토 사이트 정의에 필요한 조항. 이 버전의AnyLeast항상 사용할 것입니다en_us현장을 비교하는 로케일 :

함수 생성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다
    generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i] "collate"en_us ");
$$ 언어 SQL;

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

실제 인수 사이에서 공통 수집을 식별 할 수없는 경우 SQL 함수는 매개 변수를 데이터 유형의 기본 충전으로 처리하는 것으로 취급합니다 (일반적으로 데이터베이스의 기본 충돌이지만 도메인 유형의 매개 변수에 대해 다를 수 있음).

Collatable 매개 변수의 동작은 제한된 형태의 다형성으로 생각할 수 있으며, 텍스트 데이터 유형에만 적용됩니다.