SQL 함수는 임의의 SQL 문 목록을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 간단한에서는 (설정되지 않은) 경우 마지막 쿼리 결과의 첫 번째 행은 돌아왔다. (이 점을 명심하세요.)"첫번째 행"여러 행 결과는 다음을 제외하면 잘 정의되지 않습니다. 사용주문 기준.) 마지막 쿼리가 발생하는 경우 행을 전혀 반환하지 않으려면 null 값이 반환됩니다.
또는 SQL 함수는 다음을 지정하여 집합을 반환하도록 선언할 수 있습니다. 함수의 반환 유형은 다음과 같습니다.SETOF어떤 종류. 이 경우에는 모든 행의 마지막 쿼리의 결과가 반환됩니다. 자세한 내용이 나타납니다 아래.
SQL 함수의 본문은 SQL 문의 목록이어야 합니다 세미콜론으로 구분됩니다. 마지막 명령문 뒤의 세미콜론은 다음과 같습니다. 선택 사항. 함수가 반환되도록 선언되지 않는 한공허, 마지막 문은 다음과 같아야 합니다.선택.
다음 명령 모음SQL언어는 함께 패키지될 수 있으며 범퍼카 토토로 정의됩니다. 게다가선택쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다. (삽입, 업데이트및삭제), 다른 SQL 명령도 마찬가지입니다. (유일한 예외는 당신이 할 수 없다는 것입니다 넣어시작, 커밋, 롤백또는세이브포인트명령을 aSQL함수.) 그러나 최종 명령은 다음과 같아야 합니다.선택그것 함수의 반환 유형으로 지정된 모든 것을 반환합니다. 또는 다음을 수행하는 SQL 함수를 정의하려는 경우 작업을 수행했지만 반환할 유용한 값이 없으면 다음과 같이 정의할 수 있습니다. 돌아오는 중무효. 이 경우 해당 기능은 본문은 a로 끝나서는 안 됩니다.선택. 에 대한 예를 들어, 이 범퍼카 토토는 급여가 음수인 행을 제거합니다.emp테이블:
범퍼카 토토 생성 clean_emp()는 void AS '를 반환합니다.
emp에서 삭제
급여 < 0인 경우;
' 언어 SQL;
SELECT clean_emp();
clean_emp
-----------
(1행)
의 구문은범퍼카 토토 생성명령을 사용하려면 범퍼카 토토 본문을 문자열로 작성해야 합니다. 일정하다. 일반적으로 달러 인용을 사용하는 것이 가장 편리합니다. (참조섹션 4.1.2.2)를 문자열 상수로 사용합니다. 사용을 선택하시면 일반 작은따옴표로 묶인 문자열 상수 구문을 사용하려면 이스케이프해야 합니다. 작은따옴표(') 및 백슬래시 (\) 범퍼카 토토 본문에 사용됩니다. 일반적으로 두 배로 늘립니다(참조섹션 4.1.2.1).
SQL 함수에 대한 인수는 함수에서 참조됩니다. 구문을 사용하는 본문$n: $1참조 첫 번째 인수로,$2두번째, 등등. 인수가 복합 유형인 경우 점은 표기법, 예:$1.이름, 다음 용도로 사용될 수 있습니다. 인수의 속성에 액세스합니다. 인수만 사용할 수 있습니다. 식별자가 아닌 데이터 값으로. 따라서 예를 들어 이것은 다음과 같습니다 합리적인:
Mytable VALUES($1)에 삽입;
그러나 이것은 작동하지 않습니다:
$1 값에 삽입(42);
가능한 가장 간단한SQL범퍼카 토토에는 인수가 없으며 단순히 기본 유형을 반환합니다. 와 같이정수:
CREATE FUNCTION one()은 정수를 $$로 반환합니다.
결과로 1개 선택;
$$ 언어 SQL;
-- 문자열 리터럴의 대체 구문:
CREATE FUNCTION one()은 정수 AS '를 반환합니다.
결과로 1개 선택;
' 언어 SQL;
하나를 선택();
하나
-----
1
범퍼카 토토 내에서 열 별칭을 정의했음을 확인하세요. 범퍼카 토토 결과의 본문(이름 포함)결과), 하지만 이 열 별칭은 표시되지 않습니다. 함수 외부. 따라서 결과에는 라벨이 지정됩니다.하나대신결과.
정의하기가 거의 쉽습니다SQL기본 유형을 다음과 같이 취하는 함수 인수. 아래 예에서 우리가 어떻게 참조하는지 주목하세요. 함수 내의 인수는 다음과 같습니다.$1그리고$2.
CREATE FUNCTION add_em(정수, 정수) $$로 정수를 반환합니다.
$1 + $2를 선택하세요.
$$ 언어 SQL;
SELECT add_em(1, 2) AS 답변;
대답하다
--------
3
여기에 인출에 사용할 수 있는 더 유용한 기능이 있습니다. 은행 계좌:
CREATE FUNCTION tf1 (정수, 숫자) $$로 정수를 반환합니다.
업데이트 뱅크
SET 잔액 = 잔액 - $2
어디에 accountno = $1;
1을 선택하세요.
$$ 언어 SQL;
사용자는 이 기능을 실행하여 계좌 17에서 인출할 수 있습니다. 다음과 같이 $100.00:
tf1(17, 100.0) 선택;
실제로는 더 유용한 결과를 원할 것입니다. 상수 1보다 함수에서 더 가능성이 높습니다. 정의는
CREATE FUNCTION tf1 (정수, 숫자) 숫자를 $$로 반환합니다.
업데이트 뱅크
SET 잔액 = 잔액 - $2
어디에 accountno = $1;
계좌 번호 = $1인 은행에서 잔액을 선택하세요.
$$ 언어 SQL;
잔액을 조정하고 새 잔액을 반환합니다.
복합 유형의 인수로 범퍼카 토토를 작성할 때 우리는
위에서 했던 것처럼 우리가 원하는 인수를 지정해야 할 뿐만 아니라
와 함께$1그리고$2)뿐만 아니라 원하는 속성(필드)도
그 주장. 예를 들어 다음과 같이 가정해 보겠습니다.emp은 직원 데이터가 포함된 테이블입니다.
따라서 각 행의 복합 유형 이름도
테이블. 다음은 함수입니다.double_salary누군가의 것을 계산하는 것
급여가 두 배가 된다면:
테이블 emp 생성(
이름 텍스트,
급여 숫자,
나이 정수,
큐비클 포인트
);
CREATE FUNCTION double_salary(emp) 숫자를 $$로 반환합니다.
SELECT $1.급여 * 2 AS 급여;
$$ 언어 SQL;
SELECT 이름, double_salary(emp.*) AS dream
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
이름 | 꿈
------+---------
빌 | 8400
구문 사용에 유의하세요$1.급여인수의 필드 하나를 선택하려면 행 값. 또한 호출 방법에 주목하세요.선택명령 사용*테이블의 현재 행 전체를 복합으로 선택하려면 가치. 또는 다음을 사용하여 테이블 행을 참조할 수도 있습니다. 테이블 이름은 다음과 같습니다.
SELECT 이름, double_salary(emp) AS 꿈
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
그러나 이 사용법은 쉽게 얻을 수 있으므로 더 이상 사용되지 않습니다. 혼란스러워요.
때때로 복합 인수를 구성하는 것이 편리합니다. 즉시 가치를 부여합니다. 이는 다음을 사용하여 수행할 수 있습니다.ROW구조물. 예를 들어, 범퍼카 토토에 전달되는 데이터:
SELECT name, double_salary(ROW(이름, 급여*1.1, 나이, 칸막이)) AS dream
Emp에서;
다음을 반환하는 함수를 만드는 것도 가능합니다 복합형. 다음은 다음을 반환하는 함수의 예입니다. 싱글emp행:
함수 만들기 new_emp() emp를 $$로 반환합니다.
SELECT 텍스트 '없음' AS 이름,
AS연봉 1000.0,
25 AS나이,
포인트 '(2,2)' AS 칸막이;
$$ 언어 SQL;
이 예에서는 각 속성을 지정했습니다. 상수 값을 사용하지만 어떤 계산이라도 가능했습니다. 이 상수로 대체되었습니다.
범퍼카 토토 정의에 관한 두 가지 중요한 사항에 유의하세요.
쿼리의 선택 목록 순서는 정확히 다음과 같아야 합니다. 테이블에 열이 나타나는 것과 동일 복합 유형과 연관되어 있습니다. (열 이름을 다음과 같이 지정합니다. 위에서 한 내용은 시스템과 관련이 없습니다.)
다음과 일치하도록 표현식을 유형 변환해야 합니다. 복합 유형을 정의하지 않으면 오류가 발생합니다 이렇게:
오류: emp를 반환하도록 선언된 함수가 열 1의 텍스트 대신 varchar를 반환합니다.
동일한 함수를 정의하는 다른 방법은 다음과 같습니다:
함수 만들기 new_emp() emp를 $$로 반환합니다.
SELECT ROW('없음', 1000.0, 25, '(2,2)')::emp;
$$ 언어 SQL;
여기에 우리는 다음을 썼습니다.선택반환 올바른 복합 유형의 단일 열입니다. 이건 아니다 이 상황에서는 정말 더 좋지만 편리한 대안입니다. 어떤 경우에는 — 예를 들어 결과를 계산해야 하는 경우 원하는 합성물을 반환하는 다른 함수를 호출하여 값.
우리는 이 함수를 두 가지 중 하나에서 직접 호출할 수 있습니다 방법:
SELECT new_emp();
new_emp
-------------
(없음,1000.0,25,"(2,2)")
SELECT * FROM new_emp();
이름 | 급여 | 나이 | 칸막이
------+---------+------+---------
없음 | 1000.0 | 25 | (2,2)
두 번째 방법은 다음에 더 자세히 설명되어 있습니다.섹션 32.4.4.
당신이 복합 유형을 반환하는 함수를 사용할 때, 결과에서 하나의 필드(속성)만 원할 수도 있습니다. 당신은 할 수 있습니다 다음과 같은 구문을 사용하세요.
SELECT (new_emp()).name; 이름 ------ 없음
파서가 다음을 수행하지 못하도록 하려면 추가 괄호가 필요합니다. 혼란스러워지고 있습니다. 그들 없이 하려고 하면, 이런 것:
SELECT new_emp().name;
오류: '.' 근처에 구문 오류가 있습니다. 문자 17에서
라인 1: SELECT new_emp().name;
^
또 다른 옵션은 추출을 위해 함수 표기법을 사용하는 것입니다 속성. 이것을 설명하는 간단한 방법은 다음과 같습니다. 표기법속성(테이블)그리고테이블.속성교환 가능합니다.
SELECT 이름(new_emp()); 이름 ------ 없음
-- 이는 다음과 같습니다: -- emp.name AS youngster FROM emp WHERE emp.age < 30; SELECT name(emp) AS youngster FROM emp WHERE age(emp) < 30; 젊은이 ----------- 샘 앤디
팁:범퍼카 토토 표기법의 동등성 속성 표기법을 사용하면 범퍼카 토토를 사용할 수 있습니다. 에뮬레이트할 복합 유형에 대해"계산됨 필드". 예를 들어, 에 대한 이전 정의double_salary(emp), 쓸 수 있어요
emp.name, emp.double_salary FROM emp;이것을 사용하는 응용프로그램은 직접적으로 실행될 필요가 없습니다. 그것을 알고 있다double_salary아닙니다 테이블의 실제 열. (계산된 것을 에뮬레이션할 수도 있습니다. 보기가 있는 필드입니다.)
복합 유형을 반환하는 함수를 사용하는 또 다른 방법은 다음과 같습니다. 올바른 결과를 받아들이는 다른 함수에 결과를 전달하려면 입력으로서의 행 유형:
CREATE FUNCTION getname(emp) 텍스트를 $$로 반환합니다.
$1.이름을 선택하세요.
$$ 언어 SQL;
SELECT getname(new_emp());
getname
---------
없음
(1행)
복합을 반환하는 범퍼카 토토를 사용하는 또 다른 방법 유형은 에 설명된 대로 테이블 범퍼카 토토로 호출하는 것입니다.섹션 32.4.4.
함수 결과를 설명하는 또 다른 방법은 다음과 같습니다. 다음으로 정의하세요.출력 매개변수, 이 예에서는:
CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)
AS '선택 $1 + $2'
언어 SQL;
SELECT add_em(3,7);
add_em
--------
10
(1행)
이것은 버전과 본질적으로 다르지 않습니다.add_em표시됨섹션 32.4.1. 출력 매개변수의 실제 가치는 여러 가지를 반환하는 함수를 정의하는 편리한 방법 열. 예를 들어,
CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int) AS '선택 $1 + $2, $1 * $2' 언어 SQL; SELECT * FROM sum_n_product(11,42); 합계 | 제품 ------+--------- 53 | 462 (1행)
여기서 본질적으로 일어난 일은 우리가 함수 결과에 대한 익명 복합 유형입니다. 는 위의 예는 다음과 동일한 최종 결과를 갖습니다.
CREATE TYPE sum_prod AS (합계 정수, 제품 정수); CREATE FUNCTION sum_n_product (int, int) 반환 sum_prod AS '선택 $1 + $2, $1 * $2' 언어 SQL;
그러나 별도의 복합 유형을 사용하지 않아도 됩니다. 정의는 종종 편리합니다.
출력 매개변수는 SQL에서 이러한 함수를 호출할 때 인수 목록을 호출합니다. 그 이유는PostgreSQL함수 정의를 위해 입력 매개변수만 고려합니다. 서명을 부릅니다. 이는 또한 입력만 의미합니다. 매개변수는 목적을 위해 함수를 참조할 때 중요합니다. 떨어뜨리는 등. 위의 함수를 다음과 같이 삭제할 수 있습니다. 중 하나
DROP FUNCTION sum_n_product(x int, y int, OUT sum int, OUT product int); 삭제 함수 sum_n_product (int, int);
매개변수는 다음과 같이 표시될 수 있습니다.IN( 기본값),아웃또는INOUT. 안INOUT매개변수는 입력 매개변수( 호출 인수 목록) 및 출력 매개변수( 결과 레코드 유형).
모든 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 | 조 | 조
(1행)
예제에서 볼 수 있듯이, 우리는 함수의 결과는 마치 함수의 열인 것처럼 동일합니다. 일반 테이블.
함수에서 단 하나의 행만 얻었음을 참고하세요. 이것은 우리는 사용하지 않았기 때문에SETOF. 즉 다음 섹션에서 설명합니다.
SQL 함수가 반환으로 선언된 경우SETOF어떤 유형, 범퍼카 토토의 마지막선택쿼리는 다음과 같습니다 실행이 완료되고 출력되는 각 행은 다음과 같이 반환됩니다. 결과 집합의 요소입니다.
이 기능은 일반적으로 다음에서 함수를 호출할 때 사용됩니다.발신절. 이 경우 각 행 함수에 의해 반환된 것은 테이블의 행이 됩니다. 쿼리. 예를 들어 다음 테이블을 가정해 보겠습니다.foo위와 내용이 동일하며 우리는 말하다:
범퍼카 토토 생성 getfoo(int)는 setof foo를 $$로 반환합니다.
SELECT * FROM foo WHERE fooid = $1;
$$ 언어 SQL;
SELECT * FROM getfoo(1) AS t1;
그러면 우리는 다음을 얻게 될 것입니다:
푸이드 | 후수비드 | fooname
--------+------------+---------
1 | 1 | 조
1 | 2 | 에드
(2행)
현재 집합을 반환하는 함수는 다음에서도 호출될 수 있습니다. 쿼리의 선택 목록입니다. 쿼리가 수행되는 각 행에 대해 자체적으로 생성되고, 집합을 반환하는 함수가 호출됩니다. 함수의 각 요소에 대해 출력 행이 생성됩니다. 결과 집합. 하지만 이 기능은 더 이상 사용되지 않습니다. 향후 릴리스에서는 제거될 수 있습니다. 다음은 선택 목록에서 세트를 반환하는 예제 함수:
CREATE FUNCTION listchildren(text) SETOF 텍스트를 $$로 반환합니다.
SELECT 이름 FROM 노드 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등. 이런 일이 발생하는 이유는listchildren빈 세트를 반환합니다.
해당 인수에 대해서는 결과 행이 생성되지 않습니다.
SQL함수는 다음과 같습니다.
다형성 유형을 허용하고 반환하도록 선언되었습니다.모든 요소그리고모든 배열. 참조섹션
32.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) $$로 부울을 반환합니다.
$1 $2를 선택하세요.
$$ 언어 SQL;
SELECT is_greater(1, 2);
is_greater
------------
에프
(1줄)
CREATE FUNCTION valid_func() 모든 요소를 $$로 반환합니다.
1을 선택하세요.
$$ 언어 SQL;
오류: 결과 데이터 유형을 확인할 수 없습니다.
세부사항: "anyarray" 또는 "anyelement"를 반환하는 함수에는 두 유형 중 하나 이상의 인수가 있어야 합니다.
다형성은 출력이 있는 범퍼카 토토와 함께 사용할 수 있습니다. 인수. 예를 들면:
CREATE FUNCTION dup(f1 모든 요소, OUT f2 모든 요소, OUT f3 모든 배열) AS '$1 선택, 배열[$1,$1]' LANGUAGE sql; SELECT * FROM dup(22); f2 | f3 ----+--------- 22 | 22,22