SQL 함수는 임의의 SQL 문 목록을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 간단한에서는 (설정되지 않은) 경우 마지막 쿼리 결과의 첫 번째 행은 돌아왔다. (이 점을 명심하세요.)"첫번째 행"여러 행 결과는 다음을 제외하면 잘 정의되지 않습니다. 사용주문 기준.) 마지막 쿼리가 발생하는 경우 행을 전혀 반환하지 않으려면 null 값이 반환됩니다.
또는 SQL 함수는 다음을 지정하여 집합을 반환하도록 선언할 수 있습니다. 함수의 반환 유형은 다음과 같습니다.SETOF어떤 종류.이 경우 마지막 쿼리 결과의 모든 행 반환됩니다. 자세한 내용은 아래에 나와 있습니다.
SQL 함수의 본문은 하나 이상의 목록이어야 합니다. 세미콜론으로 구분된 SQL 문입니다. 왜냐하면 의 구문토토 결과 생성명령 토토 결과 본문을 단일로 묶어야 합니다. 따옴표, 작은따옴표(')에 사용됨 토토 결과의 본문은 두 개의 싱글을 작성하여 이스케이프되어야 합니다. 따옴표('') 또는 백슬래시(\') 여기서 각 인용문이 필요합니다.
SQL 함수에 대한 인수는 다음에서 참조될 수 있습니다. 구문을 사용하는 함수 본문$n: $1참조 첫 번째 인수로,$2두번째, 등등. 인수가 복합 유형인 경우 점은 표기법, 예:$1.이름, 다음 용도로 사용될 수 있습니다. 인수의 속성에 액세스합니다.
가능한 가장 간단한SQL토토 결과에는 인수가 없으며 단순히 기본 유형을 반환합니다. 와 같이정수:
CREATE FUNCTION one()은 정수 AS '를 반환합니다.
결과로 1개 선택;
' 언어 SQL;
하나를 선택();
하나
-----
1
토토 결과 내에서 열 별칭을 정의했음을 확인하세요. 토토 결과 결과의 본문(이름 포함)결과), 하지만 이 열 별칭은 표시되지 않습니다. 함수 외부. 따라서 결과에는 라벨이 지정됩니다.하나대신에결과.
정의하는 것이 거의 쉽습니다SQL기본 유형을 다음과 같이 취하는 함수 인수. 아래 예에서 우리가 어떻게 참조하는지 주목하세요. 함수 내의 인수는 다음과 같습니다.$1그리고$2.
CREATE FUNCTION add_em(정수, 정수) 정수 AS '를 반환합니다.
$1 + $2를 선택하세요.
' 언어 SQL;
SELECT add_em(1, 2) AS 답변;
대답하다
--------
3
여기에 인출에 사용할 수 있는 더 유용한 기능이 있습니다. 은행 계좌:
CREATE FUNCTION tf1 (정수, 숫자) RETURNS 정수 AS '
업데이트 뱅크
SET 잔액 = 잔액 - $2
어디에 accountno = $1;
1을 선택하세요.
' 언어 SQL;
사용자는 이 기능을 실행하여 계좌 17에서 인출할 수 있습니다. 다음과 같이 $100.00:
tf1 선택(17, 100.0);
실제로는 더 유용한 결과를 원할 것입니다. 상수 1보다 함수에서 더 가능성이 높습니다. 정의는
CREATE FUNCTION tf1 (정수, 숫자) RETURNS 숫자 AS '
업데이트 뱅크
SET 잔액 = 잔액 - $2
어디에 accountno = $1;
계좌 번호 = $1인 은행에서 잔액을 선택하세요.
' 언어 SQL;
잔액을 조정하고 새 잔액을 반환합니다.
다음 명령 모음SQL언어는 함께 패키지될 수 있으며 토토 결과로 정의됩니다. 게다가선택쿼리, 명령에는 데이터 수정이 포함될 수 있습니다(예:삽입, 업데이트및삭제). 그러나 최종 명령은 다음과 같아야 합니다.선택다음으로 지정된 모든 것을 반환합니다. 함수의 반환 유형. 또는 작업을 수행하지만 유용한 값이 없는 SQL 함수 return, return으로 정의할 수 있습니다.무효. 이 경우 토토 결과 본문이 끝나서는 안 됩니다. 와 함께선택. 예를 들면:
토토 결과 생성 clean_emp()는 void AS '를 반환합니다.
emp에서 삭제
급여 <= 0;
' 언어 SQL;
SELECT clean_emp();
clean_emp
-----------
(1행)
복합 유형의 인수로 토토 결과를 지정할 때,
우리는 우리가 원하는 인수를 지정해야 할 뿐만 아니라 (우리가 그랬던 것처럼)
위와 같이$1그리고$2) 뿐만 아니라 해당 인수의 속성도 포함됩니다.
예를 들어 다음과 같이 가정해 보겠습니다.emp테이블입니다
직원 데이터를 포함하므로 직원의 이름도 포함됩니다.
테이블의 각 행의 복합 유형입니다. 다음은 함수입니다.double_salary무엇을 계산하는지
누군가의 급여가 두 배가 된다면:
테이블 emp 생성(
이름 텍스트,
급여 정수,
나이 정수,
큐비클 포인트
);
CREATE FUNCTION double_salary(emp) 정수 AS '를 반환합니다.
SELECT $1.급여 * 2 AS 급여;
' 언어 SQL;
SELECT 이름, double_salary(emp) AS dream
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
이름 | 꿈
------+---------
샘 | 2400
구문 사용에 유의하세요$1.급여인수의 필드 하나를 선택하려면 행 값. 또한 호출 방법에 주목하세요.선택명령은 테이블 이름을 사용하여 해당 테이블의 전체 현재 행을 복합 값으로 사용합니다. 는 테이블 행은 다음과 같이 참조될 수도 있습니다.
SELECT 이름, double_salary(emp.*) AS 꿈
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
행 특성을 강조합니다.
다음을 반환하는 함수를 만드는 것도 가능합니다 복합형. 다음은 다음을 반환하는 함수의 예입니다. 싱글emp행:
토토 결과 생성 new_emp()는 emp를 '로 반환합니다.
SELECT 텍스트 ''없음'' AS 이름,
AS연봉 1000,
25 AS나이,
포인트 ''(2,2)'' AS 칸막이;
' 언어 SQL;
이 예에서는 각 속성을 지정했습니다. 상수 값을 사용하지만 어떤 계산이라도 가능했습니다. 이 상수로 대체되었습니다.
토토 결과 정의에 관한 두 가지 중요한 사항에 유의하세요.
쿼리의 선택 목록 순서는 정확히 다음과 같아야 합니다. 테이블에 열이 나타나는 것과 동일 복합 유형과 연관되어 있습니다. (열 이름을 다음과 같이 지정합니다. 위에서 한 내용은 시스템과 관련이 없습니다.)
다음과 일치하도록 표현식을 유형 변환해야 합니다. 복합 유형을 정의하지 않으면 오류가 발생합니다 이렇게:
오류: emp를 반환하도록 선언된 함수가 열 1의 텍스트 대신 varchar를 반환합니다.
행(복합형)을 반환하는 함수를 사용할 수 있습니다. 아래에 설명된 대로 테이블 함수로 사용됩니다. 라고 불리기도 합니다 SQL 표현식의 컨텍스트에서(단, 추출할 때만) 행에서 단일 속성을 삭제하거나 전체 행을 동일한 복합 유형을 허용하는 또 다른 함수입니다.
행에서 속성을 추출하는 예입니다. 유형:
SELECT (new_emp()).name; 이름 ------ 없음
파서를 방지하려면 추가 괄호가 필요합니다. 혼란스러워지고 있어요:
SELECT new_emp().name; 오류: '.' 근처에 구문 오류가 있습니다. 문자 17에서
또 다른 옵션은 추출을 위해 함수 표기법을 사용하는 것입니다 속성. 이것을 설명하는 간단한 방법은 다음과 같습니다. 표기법속성(테이블)및테이블.속성교환 가능합니다.
SELECT 이름(new_emp()); 이름 ------ 없음
-- 이는 다음과 같습니다:
-- emp.name AS youngster FROM emp WHERE emp.age < 30을 선택하세요.
SELECT 이름(emp) AS 어린아이
엠프에서
WHERE age(emp) < 30;
젊은이
-----------
샘
행 결과를 반환하는 함수를 사용하는 다른 방법은 다음과 같습니다. 행 유형 인수를 허용하는 두 번째 함수를 선언하고 첫 번째 함수의 결과를 전달합니다.
CREATE FUNCTION getname(emp) 텍스트를 '로 반환합니다.
$1.이름을 선택하세요.
' 언어 SQL;
SELECT getname(new_emp());
getname
---------
없음
(1행)
모든 SQL 함수는 다음에서 사용될 수 있습니다.발신쿼리의 절이지만 특히 복합 유형을 반환하는 함수에 유용합니다. 기능의 경우 기본 유형을 반환하도록 정의된 경우 테이블 함수는 1열 테이블. 함수가 다음을 반환하도록 정의된 경우 복합 유형의 경우 테이블 함수는 각 유형에 대한 열을 생성합니다. 복합 유형의 속성입니다.
다음은 예입니다:
CREATE TABLE foo(foid int, foosubid int, fooname 텍스트);
foo 값에 삽입(1, 1, 'Joe');
foo 값에 삽입(1, 2, 'Ed');
INSERT INTO foo VALUES(2, 1, 'Mary');
토토 결과 생성 getfoo(int)는 foo를 '로 반환합니다.
SELECT * FROM foo WHERE fooid = $1;
' 언어 SQL;
SELECT *, upper(fooname) FROM getfoo(1) AS t1;
푸이드 | 후수비드 | 이름 | 상부
--------+----------+---------+-------
1 | 1 | 조 | 조
(2행)
예에서 볼 수 있듯이, 우리는 함수의 결과는 마치 함수의 열인 것처럼 동일합니다. 일반 테이블.
함수에서 단 하나의 행만 얻었음을 참고하세요. 이것은 우리는 사용하지 않았기 때문에SETOF. 이것은 다음 섹션에서 설명합니다.
SQL 함수가 반환으로 선언된 경우SETOF어떤 종류, 토토 결과의 마지막선택쿼리는 다음과 같습니다 실행이 완료되고 출력되는 각 행은 다음과 같이 반환됩니다. 결과 집합의 요소입니다.
이 기능은 일반적으로 다음에서 함수를 호출할 때 사용됩니다.발신절. 이 경우 각 행 함수에 의해 반환된 것은 테이블의 행이 됩니다. 쿼리. 예를 들어 다음 테이블을 가정해 보겠습니다.foo위와 내용이 동일하며 우리는 말하다:
토토 결과 생성 getfoo(int)는 setof foo AS '를 반환합니다.
SELECT * FROM foo WHERE fooid = $1;
' 언어 SQL;
SELECT * FROM getfoo(1) AS t1;
그러면 우리는 다음을 얻게 될 것입니다:
푸이드 | 후수비드 | fooname
--------+------------+---------
1 | 1 | 조
1 | 2 | 에드
(2행)
현재 집합을 반환하는 함수는 다음에서도 호출될 수 있습니다. 쿼리의 선택 목록입니다. 쿼리가 수행되는 각 행에 대해 자체적으로 생성되고, 집합을 반환하는 함수가 호출됩니다. 함수의 각 요소에 대해 출력 행이 생성됩니다. 결과 집합. 하지만 이 기능은 더 이상 사용되지 않습니다. 향후 릴리스에서는 제거될 수 있습니다. 다음은 선택 목록에서 세트를 반환하는 예제 함수:
CREATE FUNCTION listchildren(text) SETOF 텍스트를 AS로 반환합니다.
'WHERE 상위 = $1인 노드에서 이름 선택'
언어 SQL;
SELECT * FROM 노드;
이름 | 부모
---------+---------
탑 |
어린이1 | 탑
차일드2 | 탑
어린이3 | 탑
하위 하위1 | 어린이1
하위 하위2 | 어린이1
(6열)
SELECT listchildren('상위');
목록어린이
--------------
어린이1
어린이2
어린이3
(3열)
SELECT 이름, listchildren(이름) FROM 노드;
이름 | 목록어린이
------+---------------
탑 | 어린이1
탑 | 어린이2
탑 | 어린이3
어린이1 | 하위 하위1
어린이1 | 하위 하위2
(5행)
마지막에선택, 아니요
다음에 대한 출력 행이 나타납니다.아이2,
아이3등. 이런 일이 발생하는 이유는목록어린이빈 세트를 반환합니다.
해당 인수에 대해서는 결과 행이 생성되지 않습니다.
SQL함수는 다음과 같습니다.
다형성 유형을 허용하고 반환하도록 선언되었습니다.모든 요소그리고모든 배열. 참조섹션
33.2.5다형성에 대한 더 자세한 설명은
기능. 다음은 다형성 함수입니다.make_array두 개의 배열로 구성된 배열
임의의 데이터 유형 요소:
CREATE FUNCTION make_array(anyelement, anyelement) 모든 배열을 '로 반환합니다.
배열 선택[$1, $2];
' 언어 SQL;
SELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;
인타레이 | 텍스트 배열
---------+------------
1,2 | a,b
타입캐스트 사용에 유의하세요'a'::텍스트인수가 다음과 같음을 지정합니다. 유형텍스트. 이는 다음과 같은 경우에 필요합니다. 인수는 단지 문자열 리터럴입니다. 그렇지 않으면 유형으로 취급됨알 수 없음및 배열알 수 없음은 유효한 유형이 아닙니다. 없이 typecast를 사용하면 다음과 같은 오류가 발생합니다.
오류: 입력 유형이 "알 수 없음"이므로 "anyarray"/"anyelement" 유형을 결정할 수 없습니다.
다형성 인수를 갖는 것이 허용됩니다. 결정적 반환 유형이지만 그 반대는 그렇지 않습니다. 에 대한 예:
CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS 부울 AS '
$1 $2를 선택하세요.
' 언어 SQL;
SELECT is_greater(1, 2);
is_greater
------------
에프
(1줄)
CREATE FUNCTION valid_func()는 모든 요소를 '로 반환합니다.
1을 선택하세요.
' 언어 SQL;
오류: 결과 데이터 유형을 확인할 수 없습니다.
세부사항: "anyarray" 또는 "anyelement"를 반환하는 함수에는 두 유형 중 하나 이상의 인수가 있어야 합니다.