새로운 유형을 정의하는 부분은 정의입니다 동작을 설명하는 함수입니다. 결과적으로 그 동안 새로운 유형을 정의하지 않고도 새로운 함수를 정의할 수 있습니다. 그 반대는 사실이 아닙니다. 따라서 새로 추가하는 방법을 설명합니다. 배트맨 토토을 수행함포스트그레스이전에 새로운 유형을 추가하는 방법을 설명합니다.
포스트그레 SQL세 가지 유형의 배트맨 토토을 제공합니다:
쿼리 언어 함수(다음으로 작성된 함수SQL)
절차적 언어 함수(다음으로 작성된 함수, 예: PLTCL 또는 PLSQL)
프로그래밍 언어 함수(언어로 작성된 함수 다음과 같은 컴파일된 프로그래밍 언어C)
SQL 함수는 임의의 SQL 쿼리 목록을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. SQL 일반 반환 세트의 함수. 반환 유형이 아닌 경우 로 지정됨setof, 그리고 마지막 쿼리 결과의 임의 요소는 다음과 같습니다. 돌아왔습니다.
AS 다음의 SQL 함수 본문은 다음 목록이어야 합니다. 세미콜론으로 구분되고 괄호로 묶인 쿼리 작은따옴표. 쿼리에 사용된 따옴표에 유의하세요. 앞에 백슬래시를 붙여 이스케이프해야 합니다.
SQL 함수에 대한 인수는 다음에서 참조될 수 있습니다. $n 구문을 사용하는 쿼리: $1은 첫 번째 인수 $2를 나타냅니다. 두 번째 등등. 인수가 복잡한 경우 a점표기(예: "$1.emp")는 다음과 같습니다. 인수의 속성에 액세스하거나 호출하는 데 사용됩니다. 기능.
간단한 SQL 함수를 설명하려면 다음을 고려하십시오. 다음은 은행 계좌에서 인출하는 데 사용될 수 있습니다.
함수 생성 tp1(int4, float8)
반환 int4
AS 'UPDATE 뱅크
SET 잔액 = Bank.balance - $2
어디서bank.acctountno = $1;
1을 선택하세요;'
언어 'sql';사용자는 이 기능을 실행하여 계좌 17에서 인출할 수 있습니다.
다음과 같이 $100.00:tp1 선택( 17,100.0);
다음의 더 흥미로운 예는 단일 EMP 유형의 인수이며 여러 결과를 검색합니다.
CREATE FUNCTION 취미(EMP)는 SETOF 취미를 반환합니다.
AS '취미 선택.* FROM 취미
$1.name = 취미.사람'
언어 'sql';
가능한 가장 간단한SQL함수에는 인수가 없으며 단순히 기본 유형을 반환합니다. 와 같은int4:
함수 하나 만들기()
반환 int4
AS '결과로 1 선택;'
언어 '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 |
+-------+
복합 인수로 함수를 지정할 때 유형(예: EMP)을 사용하려면 어떤 인수를 지정할 뿐만 아니라 우리는 (위에서 $1과 $2로 했던 것처럼) 원할 뿐만 아니라 해당 인수의 속성입니다. 예를 들어 다음 함수를 사용하세요. 당신의 급여가 얼마인지 계산하는 double_salary 두 배로 늘었습니다:
CREATE FUNCTION double_salary(EMP)
반환 int4
AS 'SELECT $1.급여 * 2 AS 급여;'
언어 'sql';
SELECT 이름, double_salary(EMP) AS dream
EMP에서
WHERE EMP.cubicle ~= 포인트 '(2,1)';
+------+---------+
|이름 | 꿈 |
+------+---------+
|샘 | 2400 |
+------+---------+
$1.salary 구문 사용에 주목하세요. 출시 전 복합 유형을 반환하는 함수의 주제를 살펴보겠습니다. 먼저 투영을 위한 함수 표기법을 도입해야 합니다. 속성. 이것을 설명하는 간단한 방법은 다음과 같습니다. 일반적으로 표기법 속성(테이블)을 사용하고 table.attribute는 서로 바꿔서 사용할 수 있습니다.
--
-- 이는 다음과 같습니다.
-- EMP.name AS youngster FROM EMP WHERE EMP.age < 30을 선택하세요.
--
SELECT 이름(EMP) AS 어린아이
EMP에서
WHERE 연령(EMP) < 30;
+----------+
|젊은이 |
+----------+
|샘 |
+----------+
그러나 우리가 보게 되겠지만 항상 그런 것은 아닙니다. 이 함수 표기법은 우리가 단일 행을 반환하는 함수입니다. 우리는 이것을 조립해서 한다 함수 내의 전체 행, 속성별. 이것은 단일 EMP를 반환하는 함수의 예입니다. 열:
함수 생성 new_emp()
EMP를 반환합니다.
AS 'SELECT 텍스트 ''없음'' AS 이름,
AS연봉 1000,
25 AS나이,
포인트 ''(2,2)'' AS 큐비클'
언어 'sql';
이 경우 우리는 각 속성을 다음과 같이 지정했습니다. 상수 값이지만 계산이나 표현식은 이 상수로 대체되었습니다. 정의 이와 같은 기능은 까다로울 수 있습니다. 더 중요한 것 중 일부 주의사항은 다음과 같습니다:
대상 목록 순서는 그것과 정확히 동일해야 합니다 CREATE TABLE에 속성이 나타나는 경우 복합 유형을 정의한 명령문입니다.
다음과 일치하도록 표현식을 유형 변환해야 합니다. 복합 유형의 정의를 따르지 않으면 다음과 같은 오류가 발생합니다. 이것:
오류: emp를 반환하도록 선언된 함수가 열 1의 텍스트 대신 varchar를 반환합니다.
행을 반환하는 함수를 호출할 때 우리는 전체 행을 검색합니다. 우리는 다음 중 하나를 계획해야 합니다. 행에서 속성을 지정하거나 전체 행을 행에 전달합니다. 또 다른 기능.
SELECT name(new_emp()) AS 없음; +---------+ |아무도 | +---------+ |없음 | +-------+
일반적으로 우리가 이 배트맨 토토을 사용해야 하는 이유 함수 반환의 속성을 투영하기 위한 구문 값은 파서가 단지 이해하지 못한다는 것입니다 와 결합될 때 투영을 위한 기타(점) 구문 함수 호출.
SELECT new_emp().name AS none; 주의사항:파서: "." 근처에 구문 오류가 있습니다.
다음 명령 모음SQL쿼리 언어를 함께 패키징할 수 있습니다. 그리고 함수로 정의됩니다. 명령에는 업데이트가 포함될 수 있습니다. (즉.,삽입, 업데이트및삭제) 글쎄요선택쿼리. 그러나 최종 명령은 다음과 같아야 합니다.선택그것 함수로 지정된 모든 것을 반환합니다. 반환 유형.
함수 생성 clean_EMP ()
반환 int4
'EMP에서 삭제'로
EMP.salary <= 0;
1 ASignore_this를 선택하십시오;'
언어 'sql';
SELECT clean_EMP();
+--+
|x |
+--+
|1 |
+--+