이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.토토 사이트 추천 : 문서 : 17 : 36.3. 사용자 정의 함수버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

32장. 확장SQL: 토토 캔

나타났듯이, 새로운 유형을 정의하는 부분은 정의입니다 동작을 설명하는 토토 캔입니다. 결과적으로 그러는 동안 새로운 유형을 정의하지 않고도 새로운 토토 캔를 정의할 수 있습니다. 반대는 사실이 아닙니다. 따라서 새로운 기능을 추가하는 방법을 설명합니다. 에포스트그레방법을 설명하기 전에 새로운 유형을 추가합니다.포스트그레스 SQL은 두 가지 유형의 기능을 제공합니다. 쿼리 언어 함수(다음으로 작성된 함수SQL및 프로그래밍 언어 함수(함수 다음과 같은 컴파일된 프로그래밍 언어로 작성되었습니다.C.) 두 종류의 토토 캔 모두 기본 유형을 사용할 수 있습니다. 복합 유형 또는 인수(매개변수)로서의 일부 조합. 에서 또한 두 종류의 토토 캔 모두 기본 유형 또는 복합형. 정의하기가 더 쉽습니다.SQL함수부터 시작하겠습니다. 예 이 섹션의 내용은 다음에서도 찾을 수 있습니다.funcs.sql그리고funcs.c.

쿼리 언어 (SQL) 토토 캔

SQL기본 유형에 대한 기능

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

함수 만들기 one() 반환 int4
     AS '결과로 1 선택' LANGUAGE 'sql';

    SELECT one() AS 답변;

         +---------+
         |대답 |
         +---------+
         |1 |
         +-------+

토토 캔에 대한 대상 목록을 정의했음을 주목하십시오( 이름은 RESULT)이지만 호출한 쿼리의 대상 목록은 토토 캔가 토토 캔의 대상 목록을 재정의했습니다. 따라서 결과는 하나 대신 라벨이 붙은 답변입니다.

정의하는 것은 거의 쉽습니다SQL기본 유형을 인수로 취하는 토토 캔. 아래 예에서는 토토 캔 내에서 인수를 $1로 어떻게 참조하는지 확인하세요. $2.

함수 생성 add_em(int4, int4) 반환 int4
     AS '선택 $1 + $2;' 언어 'sql';

    SELECT add_em(1, 2) AS 답변;

         +---------+
         |대답 |
         +---------+
         |3 |
         +-------+

SQL복합 유형의 기능

복합 유형의 인수로 토토 캔를 지정할 때 (예: EMP) 원하는 인수를 지정해야 할 뿐만 아니라(예: 위에서는 $1 및 $2로 수행했지만 그 속성도 논쟁. 예를 들어, double_salary 토토 캔를 사용하면 당신의 급여가 두 배가 된다면 얼마나 될지 계산합니다.

함수 생성 double_salary(EMP) 반환 int4
     AS 'SELECT $1.급여 * 2 AS 급여;' 언어 'sql';

    SELECT 이름, double_salary(EMP) AS dream
     EMP에서
     WHERE EMP.cubicle ~= '(2,1)'::point;

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

$1.salary 구문 사용에 주목하세요. 런칭하기 전에 복합 유형을 반환하는 함수의 주제에 대해 먼저 설명해야 합니다. 속성 투영을 위한 함수 표기법을 소개합니다. 는 이를 설명하는 간단한 방법은 일반적으로 다음 표기법을 사용할 수 있다는 것입니다. attribute(class)와 class.attribute는 서로 바꿔서 사용할 수 있습니다.

--
    -- 이는 다음과 같습니다.
    -- EMP.name AS youngster FROM EMP WHERE EMP.age < 30을 선택하세요.
    --
    SELECT 이름(EMP) AS 어린아이
     EMP에서
     WHERE 연령(EMP) < 30;

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

그러나 우리가 보게 되겠지만 항상 그런 것은 아닙니다. 이 함수 표기법은 다음과 같은 함수를 사용하고자 할 때 중요합니다. 단일 인스턴스를 반환합니다. 우리는 전체를 조립하여 이를 수행합니다. 함수 내의 인스턴스, 속성별. 이것은 단일 EMP 인스턴스를 반환하는 함수의 예:

토토 캔 생성 new_emp() EMP를 반환합니다.
     AS 'SELECT \'None\'::text AS 이름,
      AS연봉 1000,
      25 AS나이,
       \'(2,2)\'::포인트 AS 칸막이'
      언어 'sql';

이 경우 우리는 각 속성을 상수 값이지만 모든 계산이나 표현식은 이 상수로 대체되었습니다. 이와 같은 함수를 정의하면 까다로워. 더 중요한 주의사항 중 일부는 다음과 같습니다.

  • 대상 목록 순서는 다음과 정확히 동일해야 합니다. CREATE TABLE 문에 나타나는 속성(또는 .* 쿼리를 실행할 때).

  • (:를 사용하여) 표현식을 매우 신중하게 유형 변환해야 합니다. 그렇지 않으면 다음 오류가 표시됩니다.

    WARN::EMP 반환 유형으로 선언된 토토 캔는 검색하지 않습니다(EMP.*)
  • 인스턴스를 반환하는 함수를 호출할 때 우리는 할 수 없습니다 전체 인스턴스를 검색합니다. 우리는 다음 중 하나를 계획해야 합니다. 인스턴스 밖으로 속성을 지정하거나 전체 인스턴스를 또 다른 기능.

    SELECT name(new_emp()) AS 없음;
    
                +---------+
                |아무도 |
                +---------+
                |없음 |
                +-------+
  • 일반적으로 토토 캔 구문을 사용해야 하는 이유 토토 캔 반환 값의 속성을 투영하는 방법은 파서는 다른 (점) 구문을 이해하지 못합니다. 토토 캔 호출과 결합될 때의 투영.

    SELECT new_emp().name AS none;
                경고:파서: "." 근처에 구문 오류가 있습니다.

다음 명령 모음SQL쿼리 언어를 함께 패키징할 수 있으며 토토 캔로 정의됩니다. 명령에는 업데이트가 포함될 수 있습니다(예:삽입, 업데이트그리고삭제) 글쎄요선택쿼리. 그러나 최종 명령은 다음과 같아야 합니다.선택그것 토토 캔의 반환 유형으로 지정된 모든 것을 반환합니다.

함수 생성 clean_EMP () 반환 int4
     AS 'EMP.salary <= 0인 EMP에서 삭제;
    1을 무시로 선택'
     언어 'sql';

    SELECT clean_EMP();

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