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

12.2. 질문 토토 (SQL) 토토

SQL 함수 SQL 문의 임의 목록을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 에이select. 간단한 (비 세트) 사례에서 마지막 쿼리 결과의 첫 번째 행이 반환됩니다. (곰 그것을 염두에두고"첫 번째 줄"of a 사용하지 않는 한 멀티 로우 결과는 잘 정의되지 않습니다주문.) 마지막 쿼리가 반환되는 경우 줄이 전혀 줄어 듭니다. Null이 반환됩니다.

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

SQL 기능의 본문은 하나 이상의 목록이어야합니다. 세미콜론으로 분리 된 SQL 문. 이에 유의하십시오 의 구문함수 만들기명령 함수의 본문은 단일로 둘러싸여 있어야합니다. 따옴표, 단일 견적 마크 (') 사용 토토의 본문은 두 개의 싱글을 작성하여 탈출해야합니다. 인용문 ('') 또는 백 슬래시 (\ ') 각 견적이 원하는 곳.

SQL 함수에 대한 인수는 구문을 사용하는 기능 본문$n: $ 1은 첫 번째 인수 $ 2를 나타냅니다 두 번째로. 인수가 복합 유형 인 경우 그런 다음"DOT 표기법", 예 :$ 1.EMP, 속성에 액세스하는 데 사용될 수 있습니다 논쟁의.

12.2.1. 예

간단한 SQL 기능을 설명하려면 다음을 고려하십시오. 은행 계좌를 차출하는 데 사용될 수 있습니다.

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

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

TP1 (17, 100.0); 선택

실제로는 더 유용한 결과를 원할 것입니다. 일정한 토토보다 함수에서"1", 더 가능성이 높은 정의는입니다.

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

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

SQL토토를 함께 포장 할 수 있습니다 함수로 정의됩니다. 명령에는 데이터가 포함될 수 있습니다 수정 (예 :삽입, 업데이트삭제) AS 뿐만 아니라select쿼리. 그러나, 최종 명령은 여야합니다.select함수의 반환으로 지정된 모든 것을 반환합니다 유형.

함수 작성 clean_emp () 정수를 반환합니다.
    emp에서 삭제하십시오 
        여기서 emp.salary <= 0;
    incor_this로 1을 선택하십시오.
'언어 SQL;

clean_emp (); 선택
x
---
 1

12.2.2. SQL기본 토토 유형

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

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

하나 (); 선택
하나
-----
   1

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

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

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

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

12.2.3. SQL복합재의 토토 유형

복합 유형의 인수와 함께 함수를 지정할 때, 우리는 우리가 원하는 주장을 지정해야 할뿐만 아니라 위의$ 1and$ 2)뿐만 아니라 그 주장의 속성. 예를 들어,emp는 테이블입니다 직원 데이터를 포함하므로 테이블의 각 행의 복합 유형. 다음은 함수입니다double_salary그것은 무엇을 계산합니다 당신의 급여는 두 배가된다면 :

함수 만들기 Double_salary (EMP)는 정수를 반환합니다.
    $ 1. Salary * 2를 급여로 선택하십시오.
'언어 SQL;

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

구문의 사용에 주목하십시오$ 1. Salary인수의 한 필드를 선택하려면 행 값. 또한 부름이 어떻게select명령은 테이블 이름을 사용하여 복합 값으로 해당 테이블의 전체 현재 행.

반환하는 함수를 빌드 할 수도 있습니다. 복합 유형. (그러나 아래에서 볼 수 있듯이 일부가 있습니다 토토 사용 방법에 대한 불행한 제한.) 이것은 단일을 반환하는 함수의 예입니다emp행 :

함수 만들기 new_emp ()은 emp를 반환합니다.
    이름으로 텍스트 ''없음 '을 선택하고
        급여로 1000,
        25 나이로
        칸막이로서 포인트 ''(2,2) '';
'언어 SQL;

이 경우 각 속성을 일정한 가치이지만 계산이나 표현은 가질 수 있습니다 이 상수로 대체되었습니다. 두 가지 중요한 사항에 주목하십시오 토토 정의에 대해 :

  • 대상 목록 순서는 정확히 동일해야합니다. 열이 다음과 관련된 테이블에 나타납니다. 복합 유형.

  • 당신은 표현을 일치시키기위한 표현을 형성해야합니다 복합 유형의 정의 또는 오류가 발생합니다. 이와 같이:

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

현재의 릴리스에서PostgreSQL불쾌한 것이 있습니다 복합 유형을 반환하는 토토에 대한 제한 사용된. 간단히, 행을 반환하는 함수를 호출 할 때 우리는 전체 행을 검색 할 수 없습니다. 우리는 단일로 투사해야합니다 행 밖으로 속성 또는 전체 행을 다른 행으로 전달합니다. 토토. (전체 행 값을 표시하려고 시도하면 무의미한 숫자.) 예를 들어,

선택 이름 (new_emp ());
이름
------
 없음

이 예제는 토토 표기법을 사용합니다 투영 속성. 이것을 설명하는 간단한 방법은 그 것입니다 우리는 일반적으로 표기법을 사용할 수 있습니다속성 (표)andtable.attribute상호 교환 적으로 :

-
- 이것은 다음과 같습니다.
- Emp.age <30에서 Emp.name의 이름으로 Emp.Name을 선택하십시오.
-
젊은이로 이름 (EMP)을 선택하십시오
    emp에서
    Age (Emp) <30;
젊은이
----------
 샘

일반적으로 토토 구문을 사용해야하는 이유 토토의 속성을 돌려주는 것은 Parser는 프로젝션에 대한 DOT 구문을 이해하지 못합니다 토토 호출과 결합 될 때.

new_emp ()를 선택하십시오.
오류 : Parser : "또는 근처의 구문 분석 오류". "

행을 사용하는 다른 방법은 행 결과를 반환합니다. 행 유형 매개 변수를 수락하는 두 번째 함수 선언 및 기능 결과를 전달합니다.

함수 생성 getName (EMP)은 텍스트를 반환합니다
'선택 $ 1. 이름;'
언어 SQL;
getName (new_emp ())을 선택합니다.
 getName
-------
 없음
(1 행)

12.2.4. SQL반환 토토 세트

앞에서 언급했듯이 SQL 함수는 다음과 같이 선언 될 수 있습니다. 반환setofSomegetype. 이 경우 토토의 최종select쿼리입니다 완료로 실행되고 각 행 출력이 다음과 같이 반환됩니다. 세트의 요소.

토토 반환 세트는 대상에서만 호출 될 수 있습니다. A 목록select쿼리. 각 행에 대해 그게select자체적으로 생성됩니다 기능 리턴 세트가 호출되고 출력 행이 함수 결과 세트의 각 요소에 대해 생성됩니다. 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출력 행이 나타납니다Child2, Child3등. 이것은이기 때문에 발생합니다.ListChildren빈 세트를 반환합니다 이러한 입력의 경우 출력 행이 생성되지 않습니다.