블록에 사용된 모든 변수는 블록의 선언 섹션에서 선언되어야 합니다. (유일한 예외는 a의 루프 변수입니다.for정수 값 범위를 반복하는 루프는 자동으로 정수 변수로 선언되며 마찬가지로 a의 루프 변수도 마찬가지입니다.for커서 결과를 반복하는 루프는 자동으로 레코드 변수로 선언됩니다.)
PL/pgSQL변수는 다음과 같은 모든 SQL 데이터 유형을 가질 수 있습니다.정수, varchar및문자.
다음은 변수 선언의 몇 가지 예입니다:
user_id 정수; 수량 숫자(5); URL varchar; myrow 테이블명%ROWTYPE; myfield 테이블 이름.열 이름%TYPE; 연속 기록;
변수 선언의 일반적인 구문은 다음과 같습니다:
이름[상수]유형[콜레이트collation_name] [NULL이 아님] [기본 | := | =표현];
그기본값절이 주어지면 블록이 입력될 때 변수에 할당되는 초기 값을 지정합니다. 만약기본값절이 제공되지 않으면 변수가 다음으로 초기화됩니다.SQL널 값.상수옵션은 초기화 후에 변수가 할당되는 것을 방지하여 해당 값이 블록 기간 동안 일정하게 유지되도록 합니다.콜레이트옵션은 변수에 사용할 데이터 정렬을 지정합니다(참조섹션 43.3.6). 만일NULL이 아님이 지정되면 null 값을 할당하면 런타임 오류가 발생합니다. 모든 변수는 다음과 같이 선언되었습니다.NULL이 아님에는 Null이 아닌 기본값이 지정되어 있어야 합니다. 같음(=13836_13880:=.
변수의 기본값은 블록이 입력될 때마다(단지 함수 호출당 한 번이 아니라) 평가되고 변수에 할당됩니다. 예를 들어 할당지금()유형의 변수에타임스탬프변수가 함수가 사전 컴파일된 시간이 아닌 현재 함수 호출 시간을 가지게 됩니다.
예:
수량 정수 기본값 32; URL varchar := 'http://mysite.com'; transaction_time 시간대가 포함된 상수 타임스탬프 := now();
일단 선언된 변수의 값은 동일한 블록의 이후 초기화 표현식에서 사용될 수 있습니다. 예를 들면 다음과 같습니다:
선언하다 x 정수 := 1; y 정수 := x + 1;
함수에 전달된 매개변수는 식별자로 이름이 지정됩니다.$1, $2등 선택적으로 별칭을 선언할 수 있습니다.$가독성 향상을 위한 매개변수 이름입니다. 별칭이나 숫자 식별자를 사용하여 매개변수 값을 참조할 수 있습니다.n
별칭을 만드는 방법에는 두 가지가 있습니다. 선호되는 방법은의 매개변수에 이름을 지정하는 것입니다.함수 생성명령, 예:
CREATE FUNCTION sales_tax(소계 실수) $$로 실제 반환
시작
RETURN 소계 * 0.06;
끝;
$$ 언어 plpgsql;
다른 방법은 선언 구문을 사용하여 별칭을 명시적으로 선언하는 것입니다.
이름$에 대한 별칭n;
이 스타일의 동일한 예는 다음과 같습니다:
CREATE FUNCTION sales_tax(real) $$로 실제 반환
선언
$1에 대한 소계 별칭;
시작
RETURN 소계 * 0.06;
끝;
$$ 언어 plpgsql;
이 두 가지 예는 완벽하게 동일하지 않습니다. 첫 번째 경우에는,소계다음과 같이 참조될 수 있음sales_tax.subtotal, 그러나 두 번째 경우에는 그럴 수 없습니다. (내부 블록에 라벨을 부착했다면,소계대신 해당 라벨로 한정될 수 있습니다.)
추가 예:
CREATE FUNCTION instr(varchar, 정수) $$로 정수를 반환합니다.
선언
v_string $1에 대한 별칭;
$2에 대한 인덱스 별칭;
시작
-- 여기서 v_string과 인덱스를 사용한 일부 계산
끝;
$$ 언어 plpgsql;
CREATE FUNCTION concat_selected_fields(in_t sometablename) 텍스트를 $$로 반환합니다.
시작
반환 in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
끝;
$$ 언어 plpgsql;
언제PL/pgSQL함수는 출력 매개변수로 선언되었으며, 출력 매개변수가 제공되었습니다.$일반 입력 매개변수와 동일한 방식으로 이름과 선택적 별칭을 지정합니다. 출력 매개변수는 사실상 NULL로 시작하는 변수입니다. 함수 실행 중에 할당되어야 합니다. 매개변수의 최종 값이 반환됩니다. 예를 들어 판매세 예시는 다음과 같이 수행할 수도 있습니다.n
CREATE FUNCTION sales_tax(소계 실질, OUT 세금 실질) AS $$
시작
세금 := 소계 * 0.06;
끝;
$$ 언어 plpgsql;
생략했음을 주목하세요실제 반환— 포함할 수도 있었지만 중복됩니다.
함수를 호출하려면아웃매개변수, 함수 호출에서 출력 매개변수를 생략합니다.
SELECT sales_tax(100.00);
출력 매개변수는 여러 값을 반환할 때 가장 유용합니다. 간단한 예는 다음과 같습니다:
CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
시작
합 := x + y;
prod := x * y;
끝;
$$ 언어 plpgsql;
SELECT * FROM sum_n_product(2, 4);
합계 | 찌르다
-----+------
6 | 8
에서 논의한 대로섹션 38.5.4, 이는 함수 결과에 대한 익명 레코드 유형을 효과적으로 생성합니다. 만약에반품절이 주어졌으므로 다음과 같이 말해야 합니다.반품 기록.
이것은 다음과 같은 절차에도 적용됩니다:
CREATE PROCEDURE sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
시작
합 := x + y;
prod := x * y;
끝;
$$ 언어 plpgsql;
프로시저 호출 시 모든 매개변수를 지정해야 합니다. 출력 매개변수의 경우,NULL일반 SQL에서 프로시저를 호출할 때 지정할 수 있습니다.
CALL sum_n_product(2, 4, NULL, NULL); 합계 | 찌르다 -----+------ 6 | 8
그러나 다음에서 프로시져를 호출할 때PL/pgSQL, 대신 출력 매개변수에 대한 변수를 작성해야 합니다. 변수는 호출 결과를 수신합니다. 참조섹션 43.6.3자세한 내용은.
a를 토토 베이하는 또 다른 방법PL/pgSQL함수는 다음과 같습니다반품 테이블, 예:
CREATE FUNCTION 확장_판매(p_itemno int)
RETURNS TABLE(수량 정수, 총 숫자) AS $$
시작
RETURN QUERY SELECT s.수량, s.수량 * s.가격 FROM 판매 AS s
s.itemno = p_itemno;
끝;
$$ 언어 plpgsql;
이것은 하나 이상을 토토 베이하는 것과 정확히 동일합니다.출력매개변수 및 지정SETOF 반환.어떤 종류
a의 반환 유형이PL/pgSQL함수가 다형성 유형으로 선언되었습니다(참조섹션 38.2.5), 특수 매개변수$0생성되었습니다. 해당 데이터 유형은 실제 입력 유형에서 추론된 함수의 실제 반환 유형입니다. 이를 통해 함수는 다음과 같이 실제 반환 유형에 액세스할 수 있습니다.섹션 43.3.3. $0은 null로 초기화되고 함수에 의해 수정될 수 있으므로 필요한 경우 반환 값을 보유하는 데 사용할 수 있지만 필수는 아닙니다.$0별칭을 부여할 수도 있습니다. 예를 들어, 이 함수는 다음이 있는 모든 데이터 유형에서 작동합니다.+연산자:
CREATE FUNCTION add_ three_values(v1 모든 요소, v2 모든 요소, v3 모든 요소)
모든 요소를 $$로 반환합니다.
선언
$0에 대한 별칭 결과;
시작
결과 := v1 + v2 + v3;
결과 반환;
끝;
$$ 언어 plpgsql;
하나 이상의 출력 매개변수를 다형성 유형으로 선언하여 동일한 효과를 얻을 수 있습니다. 이 경우 특수$0매개변수가 사용되지 않습니다. 출력 매개변수 자체도 동일한 목적으로 사용됩니다. 예를 들면:
CREATE FUNCTION add_ three_values(v1 모든 요소, v2 모든 요소, v3 모든 요소,
OUT 합계 모든 요소)
AS $$
시작
합 := v1 + v2 + v3;
끝;
$$ 언어 plpgsql;
실제로 다음을 사용하여 다형성 함수를 선언하는 것이 더 유용할 수 있습니다.모든 호환 가능유형군으로, 입력 인수가 일반 유형으로 자동 승격됩니다. 예를 들면:
CREATE FUNCTION add_ three_values(v1 모든 호환, v2 모든 호환, v3 모든 호환)
모든 호환 가능한 AS $$를 반환합니다.
시작
v1 + v2 + v3을 반환합니다.
끝;
$$ 언어 plpgsql;
이 예에서는 다음과 같은 호출이 있습니다.
SELECT add_ three_values(1, 2, 4.7);
작동하여 자동으로 정수 입력을 숫자로 승격합니다. 사용하는 함수모든 요소세 개의 입력을 동일한 유형으로 수동으로 변환해야 합니다.
별칭 #새 이름별칭:이전 이름;
그별칭구문은 이전 섹션에서 제안한 것보다 더 일반적입니다. 함수 매개변수뿐만 아니라 모든 변수에 대한 별칭을 선언할 수 있습니다. 이에 대한 주요 실제 용도는 다음과 같이 미리 결정된 이름을 가진 변수에 다른 이름을 할당하는 것입니다.신규또는오래된트리거 함수 내에서.
예:
선언하다 이전에 대한 이전 별칭; 새로운 별칭을 업데이트했습니다.
이후별칭동일한 개체의 이름을 지정하는 두 가지 다른 방법을 생성하므로 제한 없이 사용하면 혼란스러울 수 있습니다. 미리 결정된 이름을 재정의하는 목적으로만 사용하는 것이 가장 좋습니다.
변수%TYPE
%TYPE변수 또는 테이블 열의 데이터 유형을 제공합니다. 이를 사용하여 데이터베이스 값을 보유할 변수를 선언할 수 있습니다. 예를 들어,라는 이름의 열이 있다고 가정해 보겠습니다.사용자_ID당신의사용자테이블. 동일한 데이터 유형을 가진 변수를 선언하려면users.user_id당신은 다음과 같이 씁니다:
user_id users.user_id%TYPE;
사용하여%TYPE당신은 참조하고 있는 구조의 데이터 유형을 알 필요가 없으며 가장 중요한 것은 참조된 항목의 데이터 유형이 미래에 변경되는 경우(예: 유형을 변경하는 경우)사용자_IDfrom정수에진짜), 함수 정의를 변경할 필요가 없을 수도 있습니다.
%TYPE은 내부 변수에 필요한 데이터 유형이 호출마다 변경될 수 있으므로 다형성 함수에서 특히 중요합니다. 적용하여 적절한 변수를 생성할 수 있습니다%TYPE함수의 인수 또는 결과 자리 표시자에.
이름테이블_이름%ROWTYPE;이름composite_type_name;
복합 유형의 변수를 a라고 합니다.행변수(또는행 유형변수). 이러한 변수는 a의 전체 행을 보유할 수 있습니다.선택또는for쿼리 결과(해당 쿼리의 열 세트가 선언된 변수 유형과 일치하는 경우). 행 값의 개별 필드는 일반적인 점 표기법을 사용하여 액세스됩니다. 예를 들어rowvar.field.
행 변수는 다음을 사용하여 기존 테이블이나 뷰의 행과 동일한 유형을 갖도록 선언할 수 있습니다.테이블_이름%ROWTYPE표기법; 또는 복합 유형의 이름을 제공하여 선언할 수 있습니다. (모든 테이블에는 동일한 이름의 연관된 복합 유형이 있으므로 실제로는 중요하지 않습니다.PostgreSQL당신이 쓰든 말든%ROWTYPE아님. 하지만%ROWTYPE휴대성이 더 좋습니다.)
함수에 대한 매개변수는 복합 유형(전체 테이블 행)일 수 있습니다. 이 경우 해당 식별자$행 변수가 되며 여기에서 필드를 선택할 수 있습니다.n$1.user_id.
다음은 복합 유형을 사용하는 예입니다.테이블1그리고테이블2적어도 언급된 필드가 있는 기존 테이블입니다.
CREATE FUNCTION merge_fields(t_row table1) 텍스트를 $$로 반환합니다.
선언
t2_row 테이블2%ROWTYPE;
시작
SELECT * INTO t2_row FROM table2 WHERE ... ;
반환 t_row.f1 || t2_row.f3 || t_row.f5 || t2_row.f7;
끝;
$$ 언어 plpgsql;
SELECT merge_fields(t.*) FROM table1 t WHERE ... ;
이름기록;
레코드 변수는 행 유형 변수와 유사하지만 사전 정의된 구조가 없습니다. 그들은 a 동안 할당된 행의 실제 행 구조를 취합니다.선택또는for명령. 레코드 변수의 하위 구조는 할당될 때마다 변경될 수 있습니다. 결과적으로 레코드 변수가 처음 할당될 때까지 하위 구조가 없으며 해당 필드에 액세스하려고 하면 런타임 오류가 발생합니다.
참고하세요기록은 실제 데이터 유형이 아니며 자리 표시자일 뿐입니다. 또한 다음과 같은 경우에도 깨달아야 합니다.PL/pgSQL함수가 반환 유형으로 선언되었습니다.기록, 비록 함수가 결과를 저장하기 위해 레코드 변수를 사용할 수 있더라도 이는 레코드 변수와 완전히 동일한 개념은 아닙니다. 두 경우 모두 함수가 작성될 때 실제 행 구조를 알 수 없지만 반환하는 함수의 경우기록실제 구조는 호출 쿼리가 구문 분석될 때 결정되는 반면, 레코드 변수는 행 구조를 즉시 변경할 수 있습니다.
언제PL/pgSQL함수에는 조합 가능한 데이터 유형의 매개변수가 하나 이상 있으며, 다음에 설명된 대로 실제 인수에 할당된 조합에 따라 각 함수 호출에 대해 조합이 식별됩니다.PostgreSQL : 문서 : 16 : 24.2. 토토 사이트 Support. 데이터 정렬이 성공적으로 식별되면(즉, 인수 간에 암시적 데이터 정렬 충돌이 없는 경우) 모든 조합 가능한 매개 변수는 암시적으로 해당 데이터 정렬을 갖는 것으로 처리됩니다. 이는 함수 내에서 데이터 정렬에 민감한 작업의 동작에 영향을 미칩니다. 예를 들어 다음을 고려하세요.
CREATE FUNCTION less_than(a text, b text) $$로 부울을 반환합니다.
시작
반환 a < b;
끝;
$$ 언어 plpgsql;
SELECT less_than(text_field_1, text_field_2) FROM table1;
SELECT less_than(text_field_1, text_field_2 COLLATE "C") FROM table1;
처음 사용less_than다음의 공통 데이터 정렬을 사용합니다text_field_1그리고text_field_2비교를 위해, 두 번째 사용에서는 다음을 사용할 것입니다.C조합.
또한 식별된 조합은 조합 가능한 유형의 지역 변수의 조합으로 간주됩니다. 따라서 이 함수는 다음과 같이 작성해도 다르게 작동하지 않습니다.
CREATE FUNCTION less_than(a text, b text) $$로 부울을 반환합니다.
선언
local_a 텍스트 := a;
local_b 텍스트 := b;
시작
RETURN local_a < local_b;
끝;
$$ 언어 plpgsql;
조합 가능한 데이터 유형의 매개변수가 없거나 공통 데이터 정렬을 식별할 수 없는 경우 매개변수와 지역 변수는 해당 데이터 유형의 기본 데이터 정렬을 사용합니다(일반적으로 데이터베이스의 기본 데이터 정렬이지만 도메인 유형의 변수에 따라 다를 수 있음).
조합 가능한 데이터 유형의 지역 변수는 다음을 포함하여 다른 조합을 가질 수 있습니다.콜레이트토토 베이의 옵션, 예를 들어
토토 베이하다
local_a text 대조 "en_US";
이 옵션은 위의 규칙에 따라 변수에 제공되는 데이터 정렬을 무시합니다.
또한 물론 명시적입니다콜레이트32425_32568
CREATE FUNCTION less_than_c(a text, b text) $$로 부울 반환
시작
RETURN a < b COLLATE "C";
끝;
$$ 언어 plpgsql;
이것은 일반 SQL 명령에서 발생하는 것과 마찬가지로 표현식에 사용된 테이블 열, 매개변수 또는 지역 변수와 관련된 데이터 정렬을 재정의합니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.