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

38 장 확장SQL: 기능

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

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

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

  • 절차 적 언어 배트맨 토토 (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지정된 내용을 반환합니다 배트맨 토토의 returnType.

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

clean_emp ()를 선택하십시오.

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