| PostgreSQL 9.0.23 문서 | ||||
|---|---|---|---|---|
| Postgre토토 핫 : 문서 : 9.0 : PL/PG토토 핫의 구조 | 위로 | 39장.PL/pgSQL - SQL절차적 언어 | 다음 | |
블록에 사용된 모든 변수는 블록의 선언 섹션. (유일한 예외는 다음과 같습니다. a의 루프 변수for루프 정수 값 범위를 반복하는 것은 자동으로 정수 변수로 롤 토토되었으며 마찬가지로 루프 변수도 마찬가지입니다. 의for커서 반복 루프 결과는 자동으로 레코드 변수로 롤 토토됩니다.)
PL/pgSQL변수는 다음을 가질 수 있습니다 모든 SQL 데이터 유형(예:정수, varchar및문자.
다음은 변수 선언의 몇 가지 예입니다:
user_id 정수; 수량 숫자(5); URL varchar; myrow 테이블명%ROWTYPE; myfield 테이블 이름.열 이름%TYPE; 연속 기록;
변수 선언의 일반적인 구문은 다음과 같습니다:
이름 [상수] 유형 [NULL이 아님] [기본 | :=표현 ];
그기본값절, 주어진 경우, 변수에 할당된 초기값을 지정합니다. 블록이 입력되었습니다. 만약기본값절 주어지지 않으면 변수가 다음으로 초기화됩니다.SQL널 값.상수옵션은 변수가 에 할당되어 해당 값이 해당 기간 동안 일정하게 유지됩니다. 블록 기간. 만일NULL이 아님이다 지정된 경우 null 값을 할당하면 런타임이 발생합니다. 오류. 모든 변수는 다음과 같이 선언되었습니다.아님 NULLnull이 아닌 기본값이 지정되어야 합니다.
변수의 기본값이 평가되어 다음에 할당됩니다. 블록이 입력될 때마다 변수가 변경됩니다(단 한 번만 아니라 함수 호출). 예를 들어 할당지금()유형의 변수에타임스탬프변수가 다음의 시간을 갖도록 합니다. 함수가 호출된 시간이 아닌 현재 함수 호출 미리 컴파일되었습니다.
예:
수량 정수 기본값 32; URL varchar := 'http://mysite.com'; user_id 상수 정수 := 10;
함수에 전달된 매개변수의 이름은 식별자$1, $2등. 선택적으로 별칭을 롤 토토할 수 있습니다.$n가독성 향상을 위한 매개변수 이름. 별칭 또는 그런 다음 숫자 식별자를 사용하여 매개변수 값입니다.
별칭을 만드는 방법에는 두 가지가 있습니다. 선호되는 방법은 의 매개변수에 이름을 지정하려면함수 생성명령, 예:
CREATE FUNCTION sales_tax(소계 실수) $$로 실제 반환
시작
    RETURN 소계 * 0.06;
끝;
$$ 언어 plpgsql;
    다른 방법, 이전에는 가능했던 유일한 방법포스트그레SQL8.0은 선언 구문을 사용하여 별칭을 명시적으로 선언합니다.
이름$에 대한 별칭n;
이 스타일의 동일한 예는 다음과 같습니다:
함수 만들기 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함수는 출력 매개변수로 선언된 경우 출력 매개변수는 다음과 같습니다. 주어진$n이름 및 선택적 별칭 일반 입력 매개변수와 동일한 방식입니다. 출력 매개변수는 사실상 NULL로 시작하는 변수입니다. 그것 기능 실행 중에 할당되어야 합니다. 는 매개변수의 최종 값이 반환됩니다. 예를 들어, 판매세 예시는 다음과 같이 수행할 수도 있습니다.
CREATE FUNCTION sales_tax(소계 실질, OUT 세금 실질) AS $$
시작
    세금 := 소계 * 0.06;
끝;
$$ 언어 plpgsql;
    생략했음을 주목하세요실제 반환— 포함할 수도 있었지만 중복됩니다.
출력 매개변수는 여러 개를 반환할 때 가장 유용합니다. 가치. 간단한 예는 다음과 같습니다:
CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
시작
    합 := x + y;
    prod := x * y;
끝;
$$ 언어 plpgsql;
    에서 논의한 대로섹션 35.4.4, 이는 효과적으로 익명 레코드 유형을 생성합니다. 함수의 결과. 만약에반환절이 주어졌으므로 다음과 같이 말해야 합니다.반환 기록.
롤 토토하는 또 다른 방법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함수는 다음과 같이 선언되었습니다. 다형성 유형(모든 요소, 모든 배열, anynonarray또는anyenum), 특수 매개변수$0생성되었습니다. 데이터 유형은 실제 실제 입력에서 추론된 함수의 반환 유형 유형(참조섹션 35.2.5). 이를 통해 함수가 실제 액세스에 액세스할 수 있습니다. 반환 유형은 다음과 같습니다.섹션 39.3.3. $0널로 초기화되었습니다 함수에 의해 수정될 수 있으므로 보유하는 데 사용할 수 있습니다. 원하는 경우 반환 값을 반환하지만 필수는 아닙니다.$0별칭을 부여할 수도 있습니다. 에 대한 예를 들어, 이 함수는 다음이 있는 모든 데이터 유형에서 작동합니다.+연산자:
CREATE FUNCTION add_ three_values(v1 모든 요소, v2 모든 요소, v3 모든 요소)
모든 요소를 $$로 반환합니다.
선언
    $0에 대한 별칭 결과;
시작
    결과 := v1 + v2 + v3;
    결과 반환;
끝;
$$ 언어 plpgsql;
    하나 이상의 출력을 선언하면 동일한 효과를 얻을 수 있습니다. 매개변수를 다형성 유형으로 사용합니다. 이 경우 특수$0매개변수가 사용되지 않습니다. 출력 매개변수 자체도 동일한 목적으로 사용됩니다. 예를 들면:
함수 생성 add_ three_values(v1 모든 요소, v2 모든 요소, v3 모든 요소,
                                 OUT 합계 모든 요소)
AS $$
시작
    합 := v1 + v2 + v3;
끝;
$$ 언어 plpgsql;
  새 이름별칭:이전 이름;
그별칭구문이 더 일반적입니다. 이전 섹션에서 제안한 것보다 다음을 선언할 수 있습니다. 함수 매개변수뿐만 아니라 모든 변수에 대한 별칭입니다. 주요 이에 대한 실제적인 사용은 다음과 같이 미리 결정된 이름을 가진 변수신규또는오래된이내 트리거 절차.
예:
선언하다 이전에 대한 이전 별칭; 새로운 별칭을 업데이트했습니다.
이후별칭두 개의 서로 다른 생성 동일한 객체의 이름을 지정하는 방법은 제한 없이 사용할 수 있습니다. 혼란스럽다. 목적으로만 사용하는 것이 가장 좋습니다. 미리 결정된 이름을 재정의합니다.
변수%TYPE
%TYPE다음의 데이터 유형을 제공합니다. 변수 또는 테이블 열. 이를 사용하여 변수를 선언할 수 있습니다. 데이터베이스 값을 보유하게 됩니다. 예를 들어, 이름이 지정된 열사용자_ID당신의사용자테이블. 변수를 선언하려면 와 동일한 데이터 유형을 사용합니다.users.user_id당신은 다음과 같이 씁니다:
user_id users.user_id%TYPE;
사용하여%TYPE그럴 필요는 없습니다 참조하는 구조의 데이터 유형을 알고 가장 중요한 것은 참조된 항목의 데이터 유형이 향후 변경사항(예: 유형을 변경함)사용자_IDfrom정수에실제), 아마도 함수 정의를 변경할 필요가 없습니다.
%TYPE특히 가치가 있는 것은 다형성 함수(내부 데이터 유형이 필요하기 때문에) 변수는 한 호출에서 다음 호출로 변경될 수 있습니다. 적절한 적용하여 변수를 생성할 수 있습니다%TYPE함수의 인수 또는 결과에 자리 표시자.
이름 테이블_이름%ROWTYPE; 이름 composite_type_name;
복합 유형의 변수를 a라고 합니다.행변수 (또는행 유형변수). 이러한 변수는 a의 전체 행선택또는for쿼리 결과(해당 쿼리의 열에 한함) set은 선언된 변수 유형과 일치합니다. 개인 행 값의 필드는 일반적인 점을 사용하여 액세스됩니다. 예를 들어 표기법rowvar.field.
행 변수는 다음과 동일한 유형을 갖도록 선언될 수 있습니다. 를 사용하여 기존 테이블 또는 뷰의 행테이블_이름%ROWTYPE표기법; 또는 다음에 의해 선언될 수 있습니다. 복합 유형의 이름을 제공합니다. (테이블마다 테이블이 있기 때문에 동일한 이름의 연관된 복합 유형은 실제로 상관없어요PostgreSQL당신이 쓰든 말든%ROWTYPE아님. 하지만%ROWTYPE그 이상 휴대용.)
함수에 대한 매개변수는 복합 유형일 수 있습니다(완전 테이블 행). 이 경우 해당 식별자$n은 행 변수가 되며 여기에서 필드를 선택할 수 있습니다. 예$1.user_id.
테이블 행의 사용자 정의 열에만 접근 가능 OID나 다른 시스템 열이 아닌 행 유형 변수에서 (행이 뷰에 있을 수 있기 때문입니다) 행의 필드 유형은 데이터 유형에 대한 테이블의 필드 크기 또는 정밀도를 상속합니다. 같은문자(n).
다음은 복합 유형을 사용하는 예입니다.테이블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함수가 선언되었습니다 반환 유형기록, 이건 좀 아니네요 레코드 변수와 동일한 개념입니다. 함수는 레코드 변수를 사용하여 결과를 보관할 수 있습니다. 에서 두 경우 모두 실제 행 구조를 알 수 없습니다. 함수가 작성되었지만 반환하는 함수의 경우기록실제 구조는 다음과 같은 경우에 결정됩니다. 호출 쿼리는 구문 분석되지만 레코드 변수는 변경될 수 있습니다. 즉시 행 구조를 구현합니다.