결과적으로 새로운 유형을 정의하는 것의 일부는 정의입니다. 행동을 설명하는 기능. 결과적으로 새 유형을 정의하지 않고 새 기능을 정의 할 수 있습니다. 역전은 사실이 아닙니다. 따라서 새로운 기능을 추가하는 방법을 설명합니다 에게Postgres방법을 설명하기 전에 새로운 유형을 추가하려면Postgres SQL두 가지 유형의 기능을 제공합니다. 쿼리 언어 토토 캔 (retmentSQL및 프로그래밍 언어 토토 캔 (토토 캔 와 같은 편집 된 프로그래밍 언어로 작성C.) 토토 캔의 종류는 기본 유형을 취할 수 있습니다. 복합 유형 또는 일부 조합으로 인수 (매개 변수). ~ 안에 추가, 두 종류의 함수는 기본 유형 또는 복합 유형. 정의하기가 더 쉽습니다SQL토토 캔이므로 시작합니다. 예 이 섹션에서는에서도 찾을 수 있습니다.funcs.sqlandfuncs.c.
가장 간단한 가능한SQL토토 캔 인수가 없으며 단순히와 같은 기본 유형을 반환합니다.int4:
함수 생성 one () int4를 반환합니다 '언어'SQL 결과로 'SELECT 1'; 답으로 하나를 선택하십시오. +-------+ | 답변 | +-------+ | 1 | +-------+
우리가 토토 캔의 대상 목록을 정의했음을 알았습니다 ( 이름 결과), 그러나 쿼리의 대상 목록 토토 캔는 토토 캔의 대상 목록을 오버로드합니다. 따라서 결과는입니다 하나 대신 라벨링 된 답변.
거의 정의하기 쉽습니다SQL기본 유형을 인수로 취하는 기능. 아래 예에서 이 기능 내의 주장을 $ 1로 언급하는 방법에 주목하십시오. $ 2.
함수 생성 add_em (int4, int4)은 int4를 반환합니다 '$ 1 + $ 2를 선택하십시오'; 언어 'SQL'; 답변으로 add_em (1, 2)을 선택하십시오. +-------+ | 답변 | +-------+ | 3 | +-------+
복합 유형의 인수와 함께 토토 캔를 지정할 때 (예 : 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쿼리 언어를 함께 포장 할 수 있습니다 토토 캔로 정의됩니다. 명령에는 업데이트가 포함될 수 있습니다 (예 :삽입, 업데이트and삭제) AS 뿐만 아니라select쿼리. 그러나, 최종 명령은 여야합니다.select토토 캔의 returnType로 지정된 것을 반환합니다.
함수 작성 clean_emp () int4를 반환합니다 'emp.salary <= 0에서 emp에서 삭제; ridore_this '로 1을 선택하십시오. 언어 'SQL'; clean_emp ()를 선택하십시오. +-+ | x | +-+ | 1 | +-+