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

39장. 확장SQL: 젠 토토

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

CREATE FUNCTION double_salary(EMP) 반환 int4
     AS 'SELECT $1.급여 * 2 AS 급여;' 언어 'sql';

    SELECT 이름, double_salary(EMP) AS dream
     EMP에서
     EMP.dept = '장난감';

         +------+---------+
         |이름 | 꿈 |
         +------+---------+
         |샘 | 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나이,
      \'없음\'::텍스트 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 |
         +--+