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

33.4. 질문 언어 (SQL) 기능

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

또는 SQL 함수는 함수의 리턴 유형 assetofSomegetype. 이 경우 모든 행의 행 마지막 쿼리의 결과가 반환됩니다. 자세한 내용이 나타납니다 아래에.

SQL 함수의 본문은 SQL 문의 목록이어야합니다. 세미콜론으로 분리. 마지막 진술 후 세미콜론은 다음과 같습니다 선택 과목. 함수가 반환으로 선언되지 않는 한void, 마지막 진술은 A이어야합니다.select.

SQL언어를 함께 포장 할 수 있습니다 배트맨 토토로 정의됩니다. 게다가select쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다 (삽입, 업데이트삭제), AS 다른 SQL 명령. (유일한 예외는 당신이 할 수 없다는 것입니다 놓다시작, 커밋, 롤백또는SavePointa 명령SQL배트맨 토토.) 그러나 최종 명령은 여야합니다.select함수의 리턴 유형으로 지정된 내용을 반환합니다. 또는 수행하는 SQL 기능을 정의하려면 동작이지만 반환 할 유용한 가치가 없으므로 다음과 같이 정의 할 수 있습니다. 반환void. 이 경우 기능 시체는 A로 끝나지 않아야합니다.select. 을 위한 예를 들어이 기능은 음의 급여로 행을 제거합니다 그만큼emp테이블 :

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

clean_emp ()를 선택하십시오.

 clean_emp
----------

(1 행)

의 구문기능 만들기명령은 배트맨 토토 본체가 문자열로 쓰여져야합니다. 끊임없는. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (보다섹션 4.1.2.213513_13649') 및 백 슬래시 (\) (탈출 문자열 구문을 가정) 기능의 본문 (섹션 4.1.2.1).

SQL 함수에 대한 인수는 함수에 참조됩니다. 구문을 사용하는 신체$n: $ 1참조 첫 번째 논쟁에$ 2두 번째로, 등. 인수가 복합 유형 인 경우 도트는 표기법 (예 :$ 1.name, 익숙해 질 수 있습니다 인수의 액세스 속성. 인수 만 사용할 수 있습니다 식별자가 아닌 데이터 값으로. 예를 들어 이것은입니다 합리적인:

myTable 값에 삽입 ($ 1);

하지만 작동하지 않습니다 :

$ 1 값 (42)에 삽입;

33.4.1. SQL기본 유형의 기능

가능한 가장 간단한SQL배트맨 토토는 인수가 없으며 단순히 기본 유형을 반환합니다. 처럼Integer:

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

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

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

 하나
-----
   1

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

거의 정의하기 쉽습니다SQL기본 유형을 사용하는 기능 논쟁. 아래의 예에서, 우리가 어떻게 참조하는지 주목하십시오. 기능 내의 인수$ 1and$ 2.

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

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

 답변
--------
      3

여기에 더 유용한 기능이 있습니다.이 기능은 차변에 사용될 수 있습니다. 은행 계좌 :

함수 생성 tf1 (정수, 숫자)은 정수를 $$로 반환합니다
    은행 업데이트 
        밸런스 설정 = 균형 - $ 2
        여기서 AccountNo = $ 1;
    선택 1;
$$ 언어 SQL;

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

선택 TF1 (17, 100.0); 선택

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

함수 생성 tf1 (정수, 숫자) 숫자를 $$로 반환합니다
    은행 업데이트 
        밸런스 설정 = 균형 - $ 2
        여기서 AccountNo = $ 1;
    AccountNo = $ 1 인 은행에서 잔액을 선택하십시오.
$$ 언어 SQL;

밸런스를 조정하고 새로운 밸런스를 반환합니다.

33.4.2. SQL복합재의 기능 유형

복합 유형의 인수로 기능을 작성할 때, 우리 위에서했던 것처럼 원하는 인수를 지정해야합니다. 와 함께$ 1and$ 2)와 원하는 속성 (필드)도 그 주장. 예를 들어,emp직원 데이터가 포함 된 테이블입니다 따라서 각 행의 복합 유형의 이름도 테이블. 다음은 함수입니다double_salary그것은 누군가의 것을 계산합니다 급여는 두 배가된다면 :

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

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

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

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

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

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

그러나이 사용법은 쉽게 얻을 수 있기 때문에 더 이상 사용되지 않습니다. 혼란스러운.

때로는 복합 인수를 구성하는 것이 편리합니다 금속에 가치. 이것은로 수행 할 수 있습니다.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)

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

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

select (new_emp ()). 이름;

 이름
------
 없음

파서를 유지하려면 여분의 괄호가 필요합니다. 혼란스러워. 당신이 그들없이 그것을하려고한다면, 당신은 다음과 같은 것 :

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

또 다른 옵션은 추출을 위해 기능 표기법을 사용하는 것입니다 속성. 이것을 설명하는 간단한 방법은 우리가 사용할 수 있다는 것입니다. 표기법속성 (표)andtable.attribute상호 교환 적으로.

select name (new_emp ());

 이름
------
 없음
- 이것은 다음과 같습니다.
- Emp.age <30;

EMP Where Age (EMP) <30에서 젊은이로 이름 (EMP)을 선택하십시오.

 어린이
----------
 샘
 앤디

팁 :기능적 표기법 사이의 동등성 속성 표기법을 사용하면 배트맨 토토를 사용할 수 있습니다 복합 유형에서 에뮬레이션"컴퓨터 전지". 예를 들어 사용 에 대한 이전 정의Double_salary (EMP), 우리는 쓸 수 있습니다

Emp.Name, Emp.Double_Salary From Emp; 선택

이것을 사용하는 응용 프로그램은 직접적으로있을 필요가 없습니다 알고있는double_salary테이블의 실제 열. (계산을 에뮬레이션 할 수도 있습니다 보기가있는 필드.)

복합 유형을 반환하는 기능을 사용하는 또 다른 방법은 다음과 같습니다. 결과를 올바른 것을 받아들이는 다른 함수로 전달하려면 입력으로 행 유형 :

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

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

복합재를 반환하는 배트맨 토토를 사용하는 또 다른 방법 유형은에 설명 된대로 테이블 배트맨 토토라고 부릅니다.섹션 33.4.4.

33.4.3. 출력과 기능 매개 변수

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

함수 생성 add_em (x int, y int, out sum int)
'$ 1 + $ 2'를 선택하십시오.
언어 SQL;

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

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

함수 생성 Sum_n_Product (x int, y int, out sum int, out product int)
'$ 1 + $ 2, $ 1 * $ 2'로 AS
언어 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.inout매개 변수는 입력 매개 변수 (의 일부) 역할을합니다. 호출 인수 목록) 및 출력 매개 변수 (의 일부 결과 기록 유형).

33.4.4. 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. 그게 다음 섹션에서 설명합니다.

33.4.5. SQL반환 기능 세트

SQL 함수가 반환으로 선언 될 때setofSomegeype, 배트맨 토토의 최종select쿼리입니다 완료로 실행되고 각 행 출력이 다음과 같이 반환됩니다. 결과 세트의 요소.

이 기능은 일반적으로 배트맨 토토를 호출 할 때 사용됩니다. 그만큼절. 이 경우 각 행 배트맨 토토에 의해 반환 된 것은 질문. 예를 들어, 해당 테이블을 가정합니다foo위와 동일한 내용이 있으며, 우리는 우리와 동일합니다 말하다:

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

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

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

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

현재, 반환 세트도 호출 할 수 있습니다 쿼리의 선택 목록. 쿼리의 각 행에 대해 그 자체로 생성되고, 반환 세트가 호출되고 함수의 각 요소마다 출력 행이 생성됩니다. 결과 세트. 그러나이 기능은 더 이상 사용되지 않습니다 향후 릴리스에서 제거 될 수 있습니다. 다음은 an입니다 예제 기능 선택 목록에서 세트를 반환합니다.

함수 생성 ListChildren (텍스트)은 텍스트를 $$로 반환합니다
    부모 = $ 1 인 노드에서 이름을 선택하십시오
$$ 언어 SQL;

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

ListChildren ( 'top')을 선택하십시오.
 목록
--------------
 child1
 child2
 child3
(3 줄)

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

마지막select, no 출력 행이 나타납니다Child2, Child3등. 이런 일이 발생합니다ListChildren빈 세트를 반환합니다 이러한 인수의 경우 결과 행이 생성되지 않습니다.

33.4.6. 다형성SQL기능

SQL배트맨 토토 일 수 있습니다 다형성 유형을 받아들이고 반환하도록 선언AnylementandAnyArray. 보다섹션 33.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, 당신은 다음과 같은 오류를 얻을 것입니다 :

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

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

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

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

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

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

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

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