표메이저 토토 사이트 함수는 임의의 메이저 토토 사이트 문 목록을 실행하여 목록의 마지막 쿼리 결과를 반환합니다. 단순(설정되지 않은) 경우에는 마지막 쿼리 결과의 첫 번째 행이 반환됩니다. (이 점을 명심하세요.)“첫 번째 행”다음을 사용하지 않으면 여러 행 결과가 잘 정의되지 않습니다.주문 기준.) 마지막 쿼리에서 행이 전혀 반환되지 않으면 null 값이 반환됩니다.
또는 함수의 반환 유형을 다음과 같이 지정하여 집합(즉, 여러 행)을 반환하도록 메이저 토토 사이트 함수를 선언할 수 있습니다.SETOF또는 다음과 같이 선언하여 동등하게어떤 종류반환 테이블(. 이 경우 마지막 쿼리 결과의 모든 행이 반환됩니다. 자세한 내용은 아래에 나와 있습니다.열)
메이저 토토 사이트 함수의 본문은 세미콜론으로 구분된 메이저 토토 사이트 문의 목록이어야 합니다. 마지막 문 뒤의 세미콜론은 선택 사항입니다. 함수가 반환되도록 선언되지 않는 한공허, 마지막 문은 다음과 같아야 합니다.선택또는삽입, 업데이트또는삭제그것은돌아오는 중절.
다음 명령 모음메이저 토토 사이트언어는 함께 패키지화되어 함수로 정의될 수 있습니다. 게다가선택쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다(삽입, 업데이트및삭제) 및 기타 메이저 토토 사이트 명령. (트랜잭션 제어 명령을 사용할 수 없습니다. 예:커밋, 세이브포인트및 일부 유틸리티 명령(예:진공, 안으로메이저 토토 사이트함수.) 그러나 최종 명령은 다음과 같아야 합니다.선택또는 다음을 가지고 있습니다돌아오는 중15249_15466무효. 예를 들어, 이 함수는에서 급여가 음수인 행을 제거합니다.emp테이블:
함수 생성 clean_emp()는 void AS '를 반환합니다.
emp에서 삭제
급여 < 0인 경우;
' 언어 메이저 토토 사이트;
SELECT clean_emp();
clean_emp
-----------
(1행)
또한 이것을 프로시저로 작성할 수 있으므로 반환 유형 문제를 피할 수 있습니다. 예를 들면:
CREATE PROCEDURE clean_emp() AS '
emp에서 삭제
급여 < 0인 경우;
' 언어 메이저 토토 사이트;
clean_emp() 호출;
이와 같은 간단한 경우에는 반환하는 함수의 차이공허그리고 절차는 대부분 문체적입니다. 그러나 프로시저는 함수에서 사용할 수 없는 트랜잭션 제어와 같은 추가 기능을 제공합니다. 또한 프로시저는 메이저 토토 사이트 표준이지만 반환하는 경우는 다음과 같습니다.공허Postgre메이저 토토 사이트 확장 프로그램입니다.
메이저 토토 사이트 함수의 전체 본문은 실행되기 전에 구문 분석됩니다. 메이저 토토 사이트 함수에는 시스템 카탈로그를 변경하는 명령이 포함될 수 있습니다(예:테이블 생성), 이러한 명령의 효과는 함수의 이후 명령을 구문 분석하는 동안 표시되지 않습니다. 따라서 예를 들어,테이블 생성 foo (...); foo 값에 삽입(...);단일 메이저 토토 사이트 함수로 패키지화하면 원하는 대로 작동하지 않습니다. 왜냐하면foo다음에는 아직 존재하지 않습니다.삽입명령이 구문 분석되었습니다. 사용하는 것이 좋습니다.PL/pg메이저 토토 사이트이러한 상황에서는 메이저 토토 사이트 함수 대신.
의 구문함수 생성명령을 사용하려면 함수 본문을 문자열 상수로 작성해야 합니다. 일반적으로 달러 인용을 사용하는 것이 가장 편리합니다(참조섹션 4.1.2.4)를 문자열 상수로 사용합니다. 일반적인 작은따옴표로 묶인 문자열 상수 구문을 사용하기로 선택한 경우 작은따옴표()를 두 번 사용해야 합니다.') 및 백슬래시(\)(이스케이프 문자열 구문 가정) 함수 본문(참조섹션 4.1.2.1).
메이저 토토 사이트 함수의 인수는 이름이나 숫자를 사용하여 함수 본문에서 참조될 수 있습니다. 두 가지 방법의 예가 아래에 나와 있습니다.
이름을 사용하려면 함수 인수에 이름이 있다고 선언한 다음 함수 본문에 해당 이름을 쓰십시오. 인수 이름이 함수 내 현재 메이저 토토 사이트 명령의 열 이름과 동일한 경우 열 이름이 우선합니다. 이를 재정의하려면 함수 자체의 이름으로 인수 이름을 한정하십시오. 즉,. (이것이 정규화된 열 이름과 충돌하는 경우 다시 열 이름이 우선합니다. 메이저 토토 사이트 명령 내에서 테이블에 대해 다른 별칭을 선택하여 모호성을 피할 수 있습니다.)함수_이름.argument_name
이전 숫자 접근 방식에서는 인수가 다음 구문을 사용하여 참조됩니다.$: n$1첫 번째 입력 인수를 나타냅니다.$2두번째까지 등등. 이는 특정 인수가 이름으로 선언되었는지 여부에 관계없이 작동합니다.
인수가 복합 유형인 경우 점 표기법은 다음과 같습니다.또는argname.필드 이름$1., 인수의 속성에 액세스하는 데 사용할 수 있습니다. 다시 말하지만, 인수 이름이 있는 형식을 명확하게 만들기 위해 인수 이름을 함수 이름으로 한정해야 할 수도 있습니다.필드명
메이저 토토 사이트 함수 인수는 식별자가 아닌 데이터 값으로만 사용할 수 있습니다. 따라서 예를 들어 이것은 합리적입니다.
INSERT INTO mytable VALUES($1);
그러나 이것은 작동하지 않습니다:
$1 값에 삽입(42);
메이저 토토 사이트 함수 인수를 참조하기 위해 이름을 사용하는 기능이 추가되었습니다.Postgre메이저 토토 사이트9.2. 이전 서버에서 사용되는 기능은 다음을 사용해야 합니다.$표기법.n
가능한 가장 간단한메이저 토토 사이트함수에는 인수가 없으며 단순히 다음과 같은 기본 유형을 반환합니다.정수:
CREATE FUNCTION one()은 정수를 $$로 반환합니다.
결과로 1개 선택;
$$ 언어 메이저 토토 사이트;
-- 문자열 리터럴의 대체 구문:
CREATE FUNCTION one()은 정수 AS '를 반환합니다.
결과로 1개 선택;
' 언어 메이저 토토 사이트;
하나를 선택();
하나
-----
1
함수 결과에 대해 함수 본문 내에서 열 별칭을 정의했음을 주목하세요(이름 포함)결과), 그러나 이 열 별칭은 함수 외부에서 표시되지 않습니다. 따라서 결과에는 라벨이 지정됩니다.하나대신결과.
정의하는 것이 거의 쉽습니다메이저 토토 사이트기본 유형을 인수로 취하는 함수:
CREATE FUNCTION add_em(x 정수, y 정수) $$로 정수를 반환합니다.
x + y를 선택하세요.
$$ 언어 메이저 토토 사이트;
SELECT add_em(1, 2) AS 답변;
대답하다
--------
3
또는 인수 이름을 생략하고 숫자를 사용할 수도 있습니다:
CREATE FUNCTION add_em(정수, 정수) $$로 정수를 반환합니다.
$1 + $2를 선택하세요.
$$ 언어 메이저 토토 사이트;
SELECT add_em(1, 2) AS 답변;
대답하다
--------
3
다음은 은행 계좌에서 인출하는 데 사용할 수 있는 더 유용한 기능입니다:
CREATE FUNCTION tf1 (계좌 번호 정수, 차변 숫자) RETURNS 숫자 AS $$
업데이트 뱅크
SET 잔액 = 잔액 - 차변
여기서 accountno = tf1.accountno;
1을 선택하세요.
$$ 언어 메이저 토토 사이트;
사용자는 이 함수를 실행하여 다음과 같이 17번 계좌에서 $100.00를 인출할 수 있습니다.
tf1(17, 100.0) 선택;
이 예에서는 이름을 선택했습니다.계정번호첫 번째 인수의 경우, 그러나 이는의 열 이름과 동일합니다.은행테이블. 이내업데이트명령,계정 번호컬럼을 참조함bank.accountno그러니까tf1.accountno23136_23251
실제로는 상수 1보다 함수로부터 더 유용한 결과를 원할 것이므로 더 그럴듯한 정의는 다음과 같습니다:
CREATE FUNCTION tf1 (계좌 번호 정수, 차변 숫자) RETURNS 숫자 AS $$
업데이트 뱅크
SET 잔액 = 잔액 - 차변
여기서 accountno = tf1.accountno;
은행 잔액 선택 WHERE accountno = tf1.accountno;
$$ 언어 메이저 토토 사이트;
잔액을 조정하고 새 잔액을 반환합니다. 다음을 사용하여 하나의 명령으로 동일한 작업을 수행할 수 있습니다.돌아오는 중:
CREATE FUNCTION tf1 (계좌 번호 정수, 차변 숫자) RETURNS 숫자 AS $$
업데이트 뱅크
SET 잔액 = 잔액 - 차변
여기서 accountno = tf1.accountno
잔액 반환;
$$ 언어 메이저 토토 사이트;
마지막이라면선택또는돌아오는 중a의 절메이저 토토 사이트함수는 함수가 선언한 결과 유형을 정확히 반환하지 않습니다.Postgre메이저 토토 사이트암시적 또는 할당 캐스트로 가능한 경우 자동으로 값을 필수 유형으로 캐스트합니다. 그렇지 않으면 명시적 캐스트를 작성해야 합니다. 예를 들어, 이전을 원한다고 가정해 보겠습니다.add_em반환 유형에 대한 함수float8대신. 작성하면 충분합니다.
CREATE FUNCTION add_em(정수, 정수) float8을 $$로 반환합니다.
$1 + $2를 선택하세요.
$$ 언어 메이저 토토 사이트;
이후정수sum은 암시적으로 캐스트될 수 있습니다.float8. (참조10장또는캐스트 생성캐스트에 대한 자세한 내용을 확인하세요.)
복합 유형의 인수로 함수를 작성할 때 우리는 원하는 인수뿐만 아니라 해당 인수의 원하는 속성(필드)도 지정해야 합니다. 예를 들어 다음과 같이 가정해 보겠습니다.emp은 직원 데이터를 포함하는 테이블이므로 테이블의 각 행에 대한 복합 유형의 이름이기도 합니다. 다음은 함수입니다.double_salary연봉이 두 배가 된다면 연봉이 얼마나 될지 계산합니다:
테이블 emp 생성(
이름 텍스트,
급여 숫자,
나이 정수,
큐비클 포인트
);
INSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');
CREATE FUNCTION double_salary(emp) 숫자를 $$로 반환합니다.
SELECT $1.급여 * 2 AS 급여;
$$ 언어 메이저 토토 사이트;
SELECT 이름, double_salary(emp.*) AS dream
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
이름 | 꿈
------+---------
빌 | 8400
구문 사용에 유의하세요$1.급여인수 행 값의 한 필드를 선택합니다. 또한 호출 방법에 주목하세요.선택명령 사용테이블_이름.*테이블의 현재 행 전체를 복합 값으로 선택합니다. 또는 다음과 같이 테이블 이름만 사용하여 테이블 행을 참조할 수도 있습니다.
SELECT 이름, double_salary(emp) AS 꿈
엠프에서
WHERE emp.cubicle ~= 포인트 '(2,1)';
그러나 이 사용법은 혼동되기 쉽기 때문에 더 이상 사용되지 않습니다. (참조섹션 8.16.5테이블 행의 복합 값에 대한 이 두 가지 표기법에 대한 자세한 내용은.)
때때로 즉석에서 복합 인수 값을 구성하는 것이 편리할 때가 있습니다. 이는 다음을 사용하여 수행할 수 있습니다.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 칸막이;
$$ 언어 메이저 토토 사이트;
이 예에서 우리는 상수 값으로 각 속성을 지정했지만 어떤 계산이라도 이러한 상수로 대체될 수 있었습니다.
함수 정의에 관한 두 가지 중요한 사항에 유의하십시오:
쿼리의 선택 목록 순서는 열이 복합 유형에 나타나는 순서와 정확히 동일해야 합니다. (위에서 했던 것처럼 열 이름을 지정하는 것은 시스템과 관련이 없습니다.)
우리는 각 표현식의 유형이 복합 유형의 해당 열의 유형으로 변환될 수 있는지 확인해야 합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.
오류: emp를 반환하도록 선언된 함수의 반환 유형 불일치
세부정보: 최종 문은 열 4의 지점 대신 텍스트를 반환합니다.
기본 유형의 경우와 마찬가지로 시스템은 명시적 캐스트를 자동으로 삽입하지 않고 암시적 또는 할당 캐스트만 삽입합니다.
동일한 기능을 정의하는 다른 방법은 다음과 같습니다:
함수 만들기 new_emp() emp를 $$로 반환합니다.
SELECT ROW('없음', 1000.0, 25, '(2,2)')::emp;
$$ 언어 메이저 토토 사이트;
여기에 우리는 다음을 썼습니다.선택올바른 복합 유형의 단일 열만 반환합니다. 이 상황에서는 이것이 실제로 더 좋지는 않지만 어떤 경우에는 편리한 대안이 됩니다. 예를 들어 원하는 복합 값을 반환하는 다른 함수를 호출하여 결과를 계산해야 하는 경우입니다. 또 다른 예는 일반 복합 유형이 아닌 복합을 통해 도메인을 반환하는 함수를 작성하려는 경우 전체 행 결과를 강제할 수 있는 방법이 없기 때문에 항상 단일 열을 반환하도록 작성해야 한다는 것입니다.
우리는 이 함수를 값 표현식에 사용하여 직접 호출할 수 있습니다:
SELECT new_emp();
new_emp
-------------
(없음,1000.0,25,"(2,2)")
또는 테이블 함수로 호출하여:
SELECT * FROM new_emp(); 이름 | 급여 | 나이 | 칸막이 ------+---------+------+--------- 없음 | 1000.0 | 25 | (2,2)
두 번째 방법은 다음에 더 자세히 설명되어 있습니다.섹션 38.5.8.
복합 유형을 반환하는 함수를 사용할 때 결과에서 하나의 필드(속성)만 필요할 수 있습니다. 다음과 같은 구문을 사용하면 됩니다.
SELECT (new_emp()).name; 이름 ------ 없음
파서가 혼동되는 것을 방지하려면 추가 괄호가 필요합니다. 그것들 없이 하려고 하면 다음과 같은 결과가 나타납니다:
SELECT new_emp().name;
오류: '.' 근처에 구문 오류가 있습니다.
라인 1: SELECT new_emp().name;
^
또 다른 옵션은 속성을 추출하기 위해 함수 표기법을 사용하는 것입니다:
SELECT 이름(new_emp()); 이름 ------ 없음
설명에 따라섹션 8.16.5, 필드 표기와 함수 표기는 동일합니다.
복합 유형을 반환하는 함수를 사용하는 또 다른 방법은 올바른 행 유형을 입력으로 받아들이는 다른 함수에 결과를 전달하는 것입니다:
CREATE FUNCTION getname(emp) 텍스트를 $$로 반환합니다.
$1.이름을 선택하세요.
$$ 언어 메이저 토토 사이트;
SELECT getname(new_emp());
getname
---------
없음
(1행)
함수 결과를 설명하는 또 다른 방법은 다음을 사용하여 함수를 정의하는 것입니다.출력 매개변수, 이 예에서와 같이:
CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)
AS '선택 x + y'
언어 메이저 토토 사이트;
SELECT add_em(3,7);
add_em
--------
10
(1행)
이것은 버전과 본질적으로 다르지 않습니다.add_em표시됨섹션 38.5.2. 출력 매개변수의 실제 가치는 여러 열을 반환하는 함수를 정의하는 편리한 방법을 제공한다는 것입니다. 예를 들어,
CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int) AS 'SELECT x + y, x * y' 언어 메이저 토토 사이트; 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' 언어 메이저 토토 사이트;
그러나 별도의 복합 유형 정의에 신경 쓸 필요가 없는 것이 종종 편리합니다. 출력 매개변수에 첨부된 이름은 단순한 장식이 아니라 익명 복합 유형의 열 이름을 결정합니다. (출력 매개변수의 이름을 생략하면 시스템이 자체적으로 이름을 선택합니다.)
메이저 토토 사이트에서 이러한 함수를 호출할 때 출력 매개변수가 호출 인수 목록에 포함되지 않는다는 점에 유의하세요. 그 이유는Postgre메이저 토토 사이트함수의 호출 서명을 정의하기 위해 입력 매개변수만 고려합니다. 이는 또한 함수를 삭제하는 등의 목적으로 함수를 참조할 때 입력 매개변수만 중요하다는 것을 의미합니다. 다음 중 하나를 사용하여 위 함수를 삭제할 수 있습니다.
DROP FUNCTION sum_n_product(x int, y int, OUT sum int, OUT product int); 삭제 함수 sum_n_product (int, int);
매개변수는 다음과 같이 표시될 수 있습니다.IN(기본값),밖으로, INOUT또는VARIADIC. 안INOUT매개변수는 입력 매개변수(호출 인수 목록의 일부)와 출력 매개변수(결과 레코드 유형의 일부) 역할을 모두 수행합니다.VARIADIC매개변수는 입력 매개변수이지만 아래 설명과 같이 특별히 처리됩니다.
출력 매개변수는 프로시저에서도 지원되지만 함수와는 약간 다르게 작동합니다. 에서전화명령, 출력 매개변수는 인수 목록에 포함되어야 합니다. 예를 들어, 이전의 은행 계좌 인출 루틴은 다음과 같이 작성할 수 있습니다.
CREATE PROCEDURE tp1 (계좌 번호 정수, 차변 숫자, OUT new_balance 숫자) AS $$
업데이트 뱅크
SET 잔액 = 잔액 - 차변
여기서 accountno = tp1.accountno
잔액 반환;
$$ 언어 메이저 토토 사이트;
이 절차를 호출하려면 다음과 일치하는 인수아웃매개변수가 포함되어야 합니다. 라고 쓰는 것이 관례입니다.NULL:
tp1 호출(17, 100.0, NULL);
다른 것을 작성하는 경우 입력 매개변수와 마찬가지로 매개변수의 선언된 유형으로 암시적으로 강제할 수 있는 표현식이어야 합니다. 그러나 그러한 표현식은 평가되지 않습니다.
다음에서 프로시져를 호출할 때PL/pg메이저 토토 사이트, 쓰는 대신NULL프로시저의 출력을 받을 변수를 작성해야 합니다. 참조섹션 43.6.3자세한 내용은.
토토 42 |_1 |04함수는 가변 개수의 인수를 허용하도록 선언될 수 있습니다.“선택사항”인수는 동일한 데이터 유형입니다. 선택적 인수는 함수에 배열로 전달됩니다. 함수는 마지막 매개변수를 다음과 같이 표시하여 선언됩니다.VARIADIC; 이 매개변수는 배열 유형으로 선언되어야 합니다. 예를 들면:
CREATE FUNCTION mleast(VARIADIC arr 숫자[]) 숫자를 $$로 반환합니다.
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ 언어 메이저 토토 사이트;
SELECT meast(10, -1, 5, 4.4);
최소
--------
-1
(1행)
사실상, 모든 실제 주장은 그 이상입니다.VARIADIC위치는 마치 작성한 것처럼 1차원 배열로 수집됩니다.
SELECT meast(ARRAY[10, -1, 5, 4.4]); -- 작동하지 않습니다.
그러나 실제로 그것을 작성할 수는 없습니다. 또는 적어도 이 함수 정의와 일치하지 않을 것입니다. 표시된 매개변수VARIADIC자체 유형이 아닌 요소 유형이 하나 이상 일치합니다.
가끔 이미 구성된 배열을 가변 함수에 전달할 수 있는 것이 유용할 때가 있습니다. 이는 하나의 가변 함수가 배열 매개변수를 다른 함수에 전달하려고 할 때 특히 유용합니다. 또한 이는 신뢰할 수 없는 사용자가 객체를 생성하도록 허용하는 스키마에 있는 가변 함수를 호출하는 유일한 안전한 방법입니다. 참조섹션 10.3. 다음을 지정하여 이를 수행할 수 있습니다.VARIADIC통화 중:
SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);
이것은 함수의 가변 매개변수가 요소 유형으로 확장되는 것을 방지하여 배열 인수 값이 정상적으로 일치하도록 허용합니다.VARIADIC함수 호출의 마지막 실제 인수에만 첨부할 수 있습니다.
지정 중VARIADIC호출에서 빈 배열을 가변 함수에 전달하는 유일한 방법이기도 합니다. 예를 들면 다음과 같습니다.
SELECT mleast(VARIADIC ARRAY[]::숫자[]);
단순히 글쓰기SELECT meast()39386_39520최소, 그러한 호출을 허용하려는 경우 매개변수 없이.)
가변 매개변수에서 생성된 배열 요소 매개변수는 자체 이름이 없는 것으로 처리됩니다. 이는 명명된 인수()를 사용하여 가변 함수를 호출할 수 없음을 의미합니다.PostgreSQL : 문서 : 14 : 4.3. 스포츠 토토 베트맨 호출)(지정하는 경우 제외)VARIADIC. 예를 들어 다음과 같이 작동합니다.
SELECT mleast(VARIADIC arr = ARRAY[10, -1, 5, 4.4]);
그러나 이것들은 아닙니다:
SELECT meast(arr = 10); SELECT mleast(arr = ARRAY[10, -1, 5, 4.4]);
함수는 일부 또는 모든 입력 인수에 대해 기본값을 사용하여 선언될 수 있습니다. 실제 인수가 충분하지 않은 상태에서 함수가 호출될 때마다 기본값이 삽입됩니다. 인수는 실제 인수 목록의 끝에서만 생략할 수 있으므로 기본값이 있는 매개변수 다음의 모든 매개변수에도 기본값이 있어야 합니다. (명명된 인수 표기법을 사용하면 이 제한이 완화될 수 있지만 위치 인수 표기법이 현명하게 작동하도록 여전히 적용됩니다.) 사용 여부에 관계없이 이 기능은 일부 사용자가 다른 사용자를 불신하는 데이터베이스에서 함수를 호출할 때 예방 조치가 필요합니다. 보다토토 42 |_1 |04.
예:
함수 생성 foo(a int, b int DEFAULT 2, c int DEFAULT 3)
반환 정수
언어 메이저 토토 사이트
AS $$
$1 + $2 + $3을 선택하세요.
$$;
SELECT foo(10, 20, 30);
푸
-----
60
(1줄)
SELECT foo(10, 20);
푸
-----
33
(1줄)
SELECT foo(10);
푸
-----
15
(1줄)
선택 foo(); -- 첫 번째 인수에 대한 기본값이 없으므로 실패합니다.
오류: foo() 함수가 존재하지 않습니다.
그=키워드 대신 기호를 사용할 수도 있습니다.기본값.
모든 메이저 토토 사이트 함수는 다음에서 사용할 수 있습니다.발신절이지만 복합 유형을 반환하는 함수에 특히 유용합니다. 기본 유형을 반환하도록 함수가 정의된 경우 테이블 함수는 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;
$$ 언어 메이저 토토 사이트;
SELECT *, upper(fooname) FROM getfoo(1) AS t1;
푸이드 | 후수비드 | 이름 | 상부
--------+----------+---------+-------
1 | 1 | 조 | 조
(1행)
예제에서 볼 수 있듯이, 우리는 함수 결과의 열을 일반 테이블의 열과 동일하게 사용할 수 있습니다.
함수에서 단 하나의 행만 얻었음을 참고하세요. 이는 우리가 사용하지 않았기 때문입니다SETOF. 이에 대해서는 다음 섹션에서 설명합니다.
메이저 토토 사이트 함수가 반환으로 선언된 경우SETOF, 함수의 최종 쿼리가 실행되어 완료되고, 출력되는 각 행이 결과 집합의 요소로 반환됩니다.어떤 종류
이 기능은 일반적으로 다음에서 함수를 호출할 때 사용됩니다.발신절. 이 경우 함수에서 반환된 각 행은 쿼리에서 표시되는 테이블의 행이 됩니다. 예를 들어 다음 테이블을 가정해 보겠습니다.foo위 내용과 동일하며 다음과 같이 말합니다.
함수 생성 getfoo(int)는 setof foo를 $$로 반환합니다.
SELECT * FROM foo WHERE fooid = $1;
$$ 언어 메이저 토토 사이트;
SELECT * FROM getfoo(1) AS t1;
그러면 우리는 다음을 얻게 될 것입니다:
푸이드 | 후수비드 | fooname
--------+------------+---------
1 | 1 | 조
1 | 2 | 에드
(2행)
다음과 같이 출력 매개변수로 정의된 열이 있는 여러 행을 반환하는 것도 가능합니다.
CREATE TABLE 탭(y int, z int);
INSERT INTO 탭 값 (1, 2), (3, 4), (5, 6), (7, 8);
CREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)
SETOF 레코드를 반환합니다.
AS $$
SELECT $1 + tab.y, $1 * tab.y FROM 탭;
$$ 언어 메이저 토토 사이트;
SELECT * FROM sum_n_product_with_tab(10);
합계 | 제품
------+---------
11 | 10
13 | 30
15 | 50
17 | 70
(4행)
여기서 핵심은 다음과 같이 작성해야 한다는 것입니다.SETOF 레코드 반환함수가 하나가 아닌 여러 행을 반환함을 나타냅니다. 출력 매개변수가 하나만 있는 경우, 대신 해당 매개변수의 유형을 작성하세요.기록.
각 호출에 대한 매개변수가 테이블 또는 하위 쿼리의 연속 행에서 오는 경우 집합 반환 함수를 여러 번 호출하여 쿼리 결과를 구성하는 것이 유용한 경우가 많습니다. 이를 수행하는 가장 좋은 방법은측면다음에 설명된 키워드섹션 7.2.1.5. 다음은 트리 구조의 요소를 열거하기 위해 집합 반환 함수를 사용하는 예입니다.
SELECT * FROM 노드;
이름 | 부모
---------+---------
탑 |
어린이1 | 탑
차일드2 | 탑
어린이3 | 탑
하위 하위1 | 어린이1
하위 하위2 | 어린이1
(6열)
함수 만들기 listchildren(text) SETOF 텍스트를 $$로 반환합니다.
SELECT 이름 FROM 노드 WHERE 상위 = $1
$$ 언어 메이저 토토 사이트 안정;
SELECT * FROM listchildren('상위');
목록어린이
--------------
어린이1
어린이2
어린이3
(3열)
SELECT 이름, 자식 FROM 노드, LATERAL listchildren(이름) AS 자식;
이름 | 아이
------+------------
탑 | 어린이1
탑 | 어린이2
탑 | 어린이3
어린이1 | 하위 하위1
어린이1 | 하위 하위2
(5행)
이 예는 간단한 조인으로 수행할 수 없는 작업을 수행하지 않지만 더 복잡한 계산에서는 일부 작업을 함수에 넣는 옵션이 매우 편리할 수 있습니다.
함수 반환 세트는 쿼리의 선택 목록에서도 호출될 수 있습니다. 쿼리가 자체적으로 생성하는 각 행에 대해 집합 반환 함수가 호출되고 함수 결과 집합의 각 요소에 대해 출력 행이 생성됩니다. 이전 예는 다음과 같은 쿼리를 사용하여 수행할 수도 있습니다.
SELECT listchildren('상단');
목록어린이
--------------
어린이1
어린이2
어린이3
(3열)
SELECT 이름, listchildren(이름) FROM 노드;
이름 | 목록어린이
------+---------------
탑 | 어린이1
탑 | 어린이2
탑 | 어린이3
어린이1 | 하위 하위1
어린이1 | 하위 하위2
(5행)
마지막에선택,에 대한 출력 행이 나타나지 않습니다.아이2, 아이3등. 이런 일이 발생하는 이유는목록어린이은 해당 인수에 대해 빈 집합을 반환하므로 결과 행이 생성되지 않습니다. 이는를 사용할 때 함수 결과에 대한 내부 조인에서 얻은 것과 동일한 동작입니다.측면구문.
포스트그레메이저 토토 사이트48078_48228측면에서48267_48303
SELECT x, generate_series(1,5) AS g FROM 탭;
거의 다음과 같습니다.
탭에서 x, g 선택, LATERAL generate_series(1,5) AS g;
이 특정 예에서 기획자가 다음을 입력하도록 선택할 수 있다는 점을 제외하면 이는 정확히 동일합니다.g이후 중첩 루프 조인 외부에g실제 측면 종속성이 없습니다.탭. 그러면 출력 행 순서가 달라집니다. 선택 목록의 집합 반환 함수는 항상 나머지 부분과 함께 중첩 루프 조인 내부에 있는 것처럼 평가됩니다.발신절, 그러면 함수가 다음 행 이전에 완료될 때까지 실행됩니다.발신절이 고려됩니다.
쿼리의 선택 목록에 하나 이상의 세트 반환 함수가 있는 경우 동작은 함수를 단일에 넣는 것과 유사합니다.다음 행( ... ) 발신-절 항목. 기본 쿼리의 각 행에는 각 함수의 첫 번째 결과를 사용하는 출력 행이 있고 두 번째 결과를 사용하는 출력 행 등이 있습니다. 집합 반환 함수 중 일부가 다른 함수보다 적은 수의 출력을 생성하는 경우 누락된 데이터가 null 값으로 대체되므로 하나의 기본 행에 대해 방출된 총 행 수가 가장 많은 출력을 생성한 집합 반환 함수와 동일합니다. 따라서 집합 반환 함수가 실행됩니다.“동일한 단계에서”모두 소진될 때까지 다음 기본 행에서 실행이 계속됩니다.
설정 반환 함수는 선택 목록에 중첩될 수 있지만 허용되지는 않습니다.발신-절 항목. 이러한 경우 각 중첩 수준은 마치 별도의 중첩인 것처럼 별도로 처리됩니다.다음 행( ... )항목. 예를 들어,
탭에서 srf1(srf2(x), srf3(y)), srf4(srf5(z)) 선택;
설정 반환 함수srf2, srf3및srf5의 각 행에 대해 고정된 방식으로 실행됩니다.탭그리고 나서srf1그리고srf4하위 함수에 의해 생성된 각 행에 고정적으로 적용됩니다.
세트 반환 함수는 다음과 같은 조건부 평가 구성 내에서 사용할 수 없습니다.사례또는합체. 예를 들어 다음을 고려하세요.
SELECT x, CASE WHEN x 0 THEN generate_series(1, 5) ELSE 0 END FROM 탭;
이것은 다음과 같은 입력 행의 5번의 반복을 생성해야 하는 것처럼 보일 수 있습니다.x 0, 그렇지 않은 것의 단일 반복; 하지만 사실은, 왜냐면generate_series(1, 5)암시적으로 실행됩니다측면에서이전 항목사례표현식을 평가하면 모든 입력 행에 대해 5번의 반복이 생성됩니다. 혼란을 줄이기 위해 이러한 경우에는 구문 분석 시간 오류가 대신 발생합니다.
함수의 마지막 명령이 다음과 같은 경우삽입, 업데이트또는삭제와돌아오는 중, 함수가 다음과 같이 선언되지 않은 경우에도 해당 명령은 항상 실행되어 완료됩니다.SETOF또는 호출 쿼리가 모든 결과 행을 가져오지 않습니다. 에 의해 생성된 추가 행돌아오는 중절은 자동으로 삭제되지만 명령된 테이블 수정은 여전히 발생합니다(그리고 함수에서 반환되기 전에 모두 완료됩니다).
이전Postgre메이저 토토 사이트10, 동일한 선택 목록에 둘 이상의 집합 반환 함수를 넣는 것은 항상 동일한 수의 행을 생성하지 않는 한 매우 현명하게 작동하지 않았습니다. 그렇지 않은 경우에는 집합 반환 함수에서 생성된 행 수의 최소 공배수와 동일한 출력 행 수를 얻었습니다. 또한 중첩된 집합 반환 함수는 위에서 설명한 대로 작동하지 않았습니다. 대신 집합 반환 함수는 최대 하나의 집합 반환 인수를 가질 수 있으며 집합 반환 함수의 각 중첩은 독립적으로 실행되었습니다. 또한 조건부 실행(내부에 set-return 함수가 있음)사례etc)가 이전에 허용되었기 때문에 상황이 더욱 복잡해졌습니다. 의 사용측면이전 버전에서 작동해야 하는 쿼리를 작성할 때 구문을 권장합니다.포스트그레메이저 토토 사이트버전. 이렇게 하면 여러 버전에서 일관된 결과를 얻을 수 있기 때문입니다. 집합 반환 함수의 조건부 실행에 의존하는 쿼리가 있는 경우 조건부 테스트를 사용자 지정 집합 반환 함수로 이동하여 문제를 해결할 수 있습니다. 예를 들어,
SELECT x, CASE WHEN y 0 THEN generate_series(1, z) ELSE 5 END FROM 탭;
될 수 있다
CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)
SETOF int를 $$로 반환합니다.
시작
IF 조건 THEN
RETURN QUERY SELECT generate_series(start, fin);
그 외
반환 쿼리 SELECT els;
종료하면;
END$$ LANGUAGE plpgsql;
SELECT x, case_generate_series(y 0, 1, z, 5) FROM 탭;
이 공식은 모든 버전에서 동일하게 작동합니다.포스트그레메이저 토토 사이트.
표함수를 집합을 반환하는 것으로 선언하는 또 다른 방법은 다음 구문을 사용하는 것입니다.반환 테이블(. 이는 하나 이상을 사용하는 것과 같습니다.열)밖으로매개변수와 함수를 반환으로 표시SETOF 레코드(또는SETOF해당하는 경우 단일 출력 매개변수 유형). 이 표기법은 최신 버전의 메이저 토토 사이트 표준에 지정되어 있으므로 다음을 사용하는 것보다 이식성이 더 뛰어날 수 있습니다.SETOF.
예를 들어, 이전의 합계와 곱의 예는 다음과 같이 수행될 수도 있습니다:
함수 생성 sum_n_product_with_tab (x int)
RETURNS TABLE(sum int, product int) AS $$
SELECT $1 + tab.y, $1 * tab.y FROM 탭;
$$ 언어 메이저 토토 사이트;
명시적인 사용은 허용되지 않습니다.아웃또는INOUT매개변수반품 테이블표기법 — 모든 출력 열을표목록.
메이저 토토 사이트함수는 다음에 설명된 다형성 유형을 허용하고 반환하도록 선언될 수 있습니다.섹션 38.2.5. 다음은 다형성 함수입니다.make_array임의의 두 데이터 유형 요소로 배열을 구성합니다.
CREATE FUNCTION make_array(anyelement, anyelement) 모든 배열을 $$로 반환합니다.
배열 선택[$1, $2];
$$ 언어 메이저 토토 사이트;
SELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;
인타레이 | 텍스트 배열
---------+------------
1,2 | a,b
타입캐스트 사용에 유의하세요'a'::텍스트인수가 유형임을 지정하기 위해텍스트. 인수가 문자열 리터럴인 경우 필수입니다. 그렇지 않으면 유형으로 처리됩니다.알 수 없음및 배열알 수 없음은 유효한 유형이 아닙니다. 타입캐스트가 없으면 다음과 같은 오류가 발생합니다.
오류: 입력에 알 수 없는 유형이 있으므로 다형성 유형을 결정할 수 없습니다.
함께make_array위와 같이 선언된 경우 정확히 동일한 데이터 유형의 두 인수를 제공해야 합니다. 시스템은 유형 차이를 해결하려고 시도하지 않습니다. 따라서 예를 들어 이것은 작동하지 않습니다.
SELECT make_array(1, 2.5) AS 숫자배열; 오류: make_array(정수, 숫자) 함수가 존재하지 않습니다.
대체 접근 방식은 다음을 사용하는 것입니다.“공통”시스템이 적합한 공통 유형을 식별할 수 있도록 하는 다형성 유형 계열:
CREATE FUNCTION make_array2(any호환, 모든호환)
모든 호환 가능한 배열을 $$로 반환합니다.
배열 선택[$1, $2];
$$ 언어 메이저 토토 사이트;
SELECT make_array2(1, 2.5) AS 숫자배열;
숫자 배열
--------------
1,2.5
공통 유형 결정 규칙은 기본적으로 유형 선택으로 설정되어 있기 때문입니다.텍스트모든 입력이 알 수 없는 유형인 경우에도 작동합니다.
SELECT make_array2('a', 'b') AS 텍스트 배열;
텍스트 배열
-----------
a,b
고정된 반환 유형을 가진 다형성 인수를 갖는 것이 허용되지만 그 반대는 허용되지 않습니다. 예를 들면:
CREATE FUNCTION is_greater(anyelement, anyelement) $$로 부울을 반환합니다.
$1 $2를 선택하세요.
$$ 언어 메이저 토토 사이트;
SELECT is_greater(1, 2);
is_greater
------------
에프
(1줄)
CREATE FUNCTION valid_func() 모든 요소를 $$로 반환합니다.
1을 선택하세요.
$$ 언어 메이저 토토 사이트;
오류: 결과 데이터 유형을 확인할 수 없습니다.
세부사항: anyelement 유형의 결과에는 anyelement, anyarray, anynonarray, anyenum 또는 anyrange 유형의 입력이 하나 이상 필요합니다.
다형성은 출력 인수가 있는 함수와 함께 사용할 수 있습니다. 예를 들면:
CREATE FUNCTION dup(f1 모든 요소, OUT f2 모든 요소, OUT f3 모든 배열) AS '$1 선택, 배열[$1,$1]' LANGUAGE 메이저 토토 사이트; SELECT * FROM dup(22); f2 | f3 ----+--------- 22 | 22,22
다형성은 또한 가변 함수와 함께 사용될 수 있습니다. 예를 들면:
CREATE FUNCTION anyleast (VARIADIC anyarray) 모든 요소를 $$로 반환합니다.
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ 언어 메이저 토토 사이트;
SELECT 최소(10, -1, 5, 4);
어쨌든
----------
-1
(1줄)
SELECT anyleast('abc'::text, 'def');
어쨌든
----------
알파벳
(1줄)
CREATE FUNCTION concat_values(text, VARIADIC anyarray) 텍스트를 $$로 반환합니다.
SELECT array_to_string($2, $1);
$$ 언어 메이저 토토 사이트;
SELECT concat_values('|', 1, 4, 2);
concat_values
---------------
1|4|2
(1행)
메이저 토토 사이트 함수에 조합 가능한 데이터 유형의 매개변수가 하나 이상 있는 경우 다음에 설명된 대로 실제 인수에 할당된 데이터 정렬에 따라 각 함수 호출에 대해 데이터 정렬이 식별됩니다.PostgreSQL : 문서 : 14 : 24.2. 토토 커뮤니티 Support. 데이터 정렬이 성공적으로 식별되면(즉, 인수 간에 암시적 데이터 정렬 충돌이 없는 경우) 모든 조합 가능한 매개 변수는 암시적으로 해당 데이터 정렬을 갖는 것으로 처리됩니다. 이는 함수 내에서 데이터 정렬에 민감한 작업의 동작에 영향을 미칩니다. 예를 들어,아무튼위에 설명된 함수, 결과
SELECT anyleast('abc'::text, 'ABC');
데이터베이스의 기본 데이터 정렬에 따라 달라집니다. 에서C로케일 결과는 다음과 같습니다ABC, 그러나 다른 많은 로케일에서는 그럴 것입니다.abc. 사용할 데이터 정렬은 다음을 추가하여 강제로 적용할 수 있습니다.콜레이트인수에 대한 절, 예를 들어
SELECT anyleast('abc'::text, 'ABC' COLLATE "C");
또는 호출 대상에 관계없이 특정 데이터 정렬로 함수를 작동하려면 다음을 삽입하십시오.콜레이트61587_61652아무튼항상 사용함en_US문자열을 비교할 로케일:
CREATE FUNCTION anyleast (VARIADIC anyarray) 모든 요소를 $$로 반환합니다.
SELECT min($1[i] COLLATE "en_US") FROM generate_subscripts($1, 1) g(i);
$$ 언어 메이저 토토 사이트;
그러나 대조할 수 없는 데이터 유형에 적용하면 오류가 발생한다는 점에 유의하십시오.
실제 인수 간에 공통 데이터 정렬을 식별할 수 없는 경우 메이저 토토 사이트 함수는 해당 매개변수를 데이터 유형의 기본 데이터 정렬(일반적으로 데이터베이스의 기본 데이터 정렬이지만 도메인 유형의 매개변수에 따라 다를 수 있음)이 있는 것으로 처리합니다.
조합 가능한 매개변수의 동작은 텍스트 데이터 유형에만 적용할 수 있는 제한된 형태의 다형성으로 생각할 수 있습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.