이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 사이트 추천 : 문서 : 17 : 36.3. 사용자 정의 함수버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

38 장 확장SQL: 기능

결과적으로 새로운 유형을 정의하는 것의 일부는 정의입니다. 행동을 설명하는 기능. 결과적으로 새 유형을 정의하지 않고 새 기능을 정의 할 수 있습니다. 역전은 사실이 아닙니다. 따라서 새로운 기능을 추가하는 방법을 설명합니다 에게Postgres방법을 설명하기 전에 새로운 유형을 추가하려면

Postgres SQL세 가지 유형의 기능 제공 :

  • 쿼리 언어 배트맨 토토 (SQL)

  • 절차 적 언어 배트맨 토토 (for 예, pltcl 또는 plsql)

  • 언어 기능 프로그래밍 (a 와 같은 편집 된 프로그래밍 언어C)

모든 종류의 배트맨 토토는 복합 유형 인 기본 유형을 취할 수 있습니다. 또는 인수 (매개 변수)와 같은 일부 조합. 또한 모든 종류의 배트맨 토토는 기본 유형 또는 복합 유형을 반환 할 수 있습니다. 그것은 정의하기 가장 쉬운SQL배트맨 토토 우리는 그것들로 시작할 것입니다. 이 섹션의 예도 찾을 수 있습니다 안에funcs.sqlfuncs.c.

쿼리 언어 (SQL) 배트맨 토토

SQL 함수는 임의의 SQL 쿼리 목록을 실행합니다. 목록에서 마지막 쿼리 결과를 반환합니다. SQL 기능 일반적으로 반환 세트. ReturnType가 A로 지정되지 않은 경우setof, 그 다음의 임의의 요소 마지막 쿼리의 결과가 반환됩니다.

다음과 같은 SQL 기능의 본문 쿼리는 공백 문자로 분리되고 내부에 괄호가 있습니다 견적 마크. 쿼리에 사용 된 따옴표는해야합니다 두 개의 백 슬래시로 앞에 탈출하십시오.

SQL 함수에 대한 인수는 쿼리에서 참조 될 수 있습니다. A $ N 구문 사용 : $ 1은 첫 번째 인수, $ 2를 말합니다. 둘째, 그리고 그렇게. 인수가 복잡하다면 Adot표기법 (예 : "$ 1.emp")을 사용하여 액세스 할 수 있습니다 인수의 속성 또는 기능을 호출 할 것입니다.

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

배트맨 토토 생성 tp1 (int4, float8)은 int4를 반환합니다
    '은행 세트 밸런스 업데이트 = Bank.bance- $ 2
        여기서 bank.acctountno = $ 1
        선택 (x = 1) ''
    언어 'sql';
사용자는이 기능을 차변 계정으로 실행할 수 있습니다 17 다음과 같이 $ 100.00 :
select (x = tp1 (17,100.0));

다음의 더 흥미로운 예는 단일 인수를 취합니다 유형의 emp, 여러 결과를 검색합니다.

기능 선택 취미 (EMP)는 취미 세트를 반환합니다
    '취미에서'선택 (취미)
        여기서 $ 1.name = Hobbies.Person '
    언어 'sql';

SQL기본 유형의 기능

가능한 가장 간단한SQL배트맨 토토 인수가 없으며 단순히와 같은 기본 유형을 반환합니다.int4:

함수 생성 one () int4를 반환합니다
    '언어'SQL 결과로 'SELECT 1';

답으로 하나를 선택하십시오.

     +-------+
     | 답변 |
     +-------+
     | 1 |
     +-------+

우리가 배트맨 토토의 대상 목록을 정의했음을 알았습니다 ( 이름 결과), 그러나 쿼리의 대상 목록 배트맨 토토는 배트맨 토토의 대상 목록을 오버로드합니다. 따라서 결과는입니다 하나 대신 라벨링 된 답변.

거의 정의하기 쉽습니다SQL기본 유형을 인수로 취하는 기능. 아래 예에서 이 기능 내의 주장을 $ 1로 언급하는 방법에 주목하십시오. $ 2 :

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

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

     +-------+
     | 답변 |
     +-------+
     | 3 |
     +-------+

SQL복합 유형의 기능

복합 유형의 인수와 함께 배트맨 토토를 지정할 때 (예 : EMP), 우리는 우리가 원하는 주장을 명시해야 할뿐만 아니라 우리는 $ 1과 $ 2로 위를했지만 그 속성도 논쟁. 예를 들어, double_salary 배트맨 토토를 가져 가십시오 두 배가 된 경우 급여가 무엇인지 계산합니다 :

함수 생성 Double_salary (EMP)는 int4를 반환합니다
    'SELECT $ 1. SALARY * 2는 급여로;' 언어 'SQL';

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

     +-----+-------+
     | 이름 | 꿈 |
     +-----+-------+
     | 샘 | 2400 |
     +-----+-------+

구문 $ 1. Salary의 사용을 주목하십시오. 시작하기 전에 복합 유형을 반환하는 기능의 주제를 먼저 속성을 투영하기위한 배트맨 토토 표기법을 소개합니다. 그만큼 이것을 설명하는 간단한 방법은 일반적으로 표기법을 사용할 수 있다는 것입니다. 속성 (클래스) 및 클래스.

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

     +----------+
     | 젊은이 |
     +----------+
     | 샘 |
     +----------+

우리가 볼 수 있듯이, 이것이 항상 그런 것은 아닙니다. 이것 배트맨 토토 표기법은 단일 인스턴스를 반환합니다. 우리는 전체를 조립함으로써이를 수행합니다 배트맨 토토 내 인스턴스, 속성 별 속성. 이것은입니다 단일 EMP 인스턴스를 반환하는 배트맨 토토의 예 :

배트맨 토토 만들기 new_emp ()는 emp를 반환합니다
    'select \'none \ ':: 텍스트 이름으로 이름으로 텍스트
        급여로 1000,
        25 나이로
        \ '(2,2) \':: 칸막이로 포인트 '
    언어 'sql';

이 경우 각 속성을 일정한 가치이지만 계산이나 표현이 이 상수를 대체합니다. 이와 같이 함수를 정의 할 수 있습니다 까다 롭습니다. 더 중요한 경고 중 일부는 다음과 같습니다.

  • 대상 목록 순서는 정확히 동일해야합니다. 속성이 생성 테이블 문 (또는 a.* query)를 실행할 때.

  • 표현식 (사용 : :) 매우 신중하게 표현을 정립해야합니다 또는 다음 오류가 표시됩니다.

            WARN :: 유형을 반환하도록 선언 한 배트맨 토토 EMP는 검색되지 않습니다 (Emp.*)
    
    
  • 인스턴스를 반환하는 함수를 호출 할 때 전체 인스턴스를 검색합니다. 우리는 an을 투사해야합니다 인스턴스에서 속성 또는 전체 인스턴스를 다음으로 전달합니다. 다른 기능.

    이름 (new_emp ())을 아무도 선택하지 않습니다.
    
            +-------+
            | 아무도 |
            +-------+
            | 없음 |
            +-------+
  • 일반적으로 기능 구문을 사용해야하는 이유 기능의 속성을 돌려주는 것은 Parser는 다른 (DOT) 구문을 이해하지 못합니다 기능 호출과 결합 될 때 투영.

    new_emp ()를 선택하십시오.
    경고 : 파서 : "또는 그 근처의 구문 오류."

SQL쿼리 언어를 함께 포장 할 수 있습니다 배트맨 토토로 정의됩니다. 명령에는 업데이트가 포함될 수 있습니다 (예 :삽입, 업데이트삭제) 및select쿼리. 그러나 최종 명령은 A 여야합니다.select지정된 내용을 반환합니다 the function's returntype.

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

clean_emp ()를 선택하십시오.

     +-+
     | x |
     +-+
     | 1 |
     +-+