블록에 사용 된 모든 변수는 블록의 선언 섹션에 선언되어야합니다. (유일한 예외는 a의 루프 변수입니다.for
LOOP 범위의 정수 값을 반복하는 것은 정수 변수로 자동으로 선언되며 마찬가지로 A의 루프 변수와 마찬가지로for
커서의 결과를 통한 루프 반복은 자동으로 레코드 변수로 선언됩니다.)
pl/pgsql변수는와 같은 SQL 데이터 유형을 가질 수 있습니다.정수
, Varchar
및char
.
변수 선언의 몇 가지 예는 다음과 같습니다.
user_id 정수; 수량 숫자 (5); URL VARCHAR; Myrow tablename%rowtype; Myfield tablename.columnname%유형; 아로우 레코드;
변수 선언의 일반적인 구문은 다음과 같습니다.
이름
[Constant]타입
[Collatecollation_name
] [NOT NULL] [기본 | : = | =표현
];
the기본값
조항은 주어진 경우 블록을 입력 할 때 변수에 할당 된 초기 값을 지정합니다. 인 경우기본값
조항이 주어지지 않으면 변수가에 초기화됩니다SQL널 값. 그만큼Constant
옵션은 초기화 후 변수가 할당되는 것을 방지하여 블록 기간 동안 값이 일정하게 유지됩니다. 그만큼Collate
옵션 변수에 사용할 콜라이트를 지정합니다 (참조섹션 42.3.6). 만약에NOT NULL
지정되어 있으며, 널 값을 할당하면 런타임 오류가 발생합니다. 모든 변수는NOT NULL
unnull 기본값이 지정되어 있어야합니다. 동일한 (=
) pl/sql-compliant 대신에 사용할 수 있습니다: =
.
변수의 기본값이 평가되고 블록을 입력 할 때마다 변수에 할당됩니다 (함수 호출마다 한 번뿐만 아니라). 예를 들어, 할당now ()
유형 변수타임 스탬프
변수가 함수가 사전 컴파일 된 시간이 아니라 현재 함수 호출 시간을 갖도록합니다.
예 :
수량 정수 기본값 32; url varchar : = 'http://mysite.com'; user_id 상수 정수 : = 10;
함수로 전달 된 매개 변수는 식별자와 명명됩니다$ 1
, $ 2
등. 선택적으로, 별명을 토토 사이트 순위 할 수 있습니다$
가독성 향상을위한 매개 변수 이름. 그런 다음 별명 또는 숫자 식별자를 사용하여 매개 변수 값을 참조 할 수 있습니다.n
별칭을 만드는 방법에는 두 가지가 있습니다. 선호하는 방법은의 매개 변수에 이름을 제시하는 것입니다.기능 만들기
명령, 예 :
함수 생성 sales_tax (subtotal real)는 real을 $$로 반환합니다 시작하다 반환 하위 토탈 * 0.06; 끝; $$ 언어 plpgsql;
다른 방법은 토토 사이트 순위문 구문을 사용하여 별칭을 명시 적으로 토토 사이트 순위하는 것입니다
이름
alias for $n
;
이 스타일의 동일한 예는 다음과 같습니다.
함수 생성 sales_tax (real)는 real을 $$로 반환합니다 토토 사이트 순위하다 1 달러에 대한 소계 별칭; 시작하다 반환 하위 토탈 * 0.06; 끝; $$ 언어 plpgsql;
이 두 예제는 완벽하게 동일하지 않습니다. 첫 번째 경우subtotal
를 참조 할 수 있습니다sales_tax.subtotal
, 그러나 두 번째 경우에는 할 수 없었습니다. (우리가 내부 블록에 라벨을 부착 했습니까?subtotal
대신 해당 레이블로 자격을 갖추 수 있습니다.)
더 많은 예 :
CREATE FOCTION DIST (VarChar, Integer)는 정수를 $$로 반환합니다 선언하다 $ 1에 대한 v_string 별칭; $ 2의 색인 별칭; 시작하다 - v_string 및 색인을 사용한 일부 계산 끝; $$ 언어 plpgsql; conection concat_selected_fields (in_t tomesableName) 텍스트를 $$로 반환합니다 시작하다 IN_T.F1 || 반환 in_t.f3 || in_t.f5 || in_t.f7; 끝; $$ 언어 plpgsql;
언제pl/pgsql함수는 출력 매개 변수로 선언되어 출력 매개 변수가 제공됩니다$
일반 입력 매개 변수와 동일한 방식으로 이름 및 선택적 별칭. 출력 매개 변수는 사실상 NULL을 시작하는 변수입니다. 함수 실행 중에 할당해야합니다. 매개 변수의 최종 값은 반환됩니다. 예를 들어, 판매 세 예제는 다음과 같은 방식으로 수행 할 수 있습니다.n
함수 sales_tax (subtotal real, out tax real)를 $$로 만듭니다 시작하다 세금 : = 하위 운동 * 0.06; 끝; $$ 언어 plpgsql;
우리가 생략 한 것을 알았습니다Retors Real
- 우리는 그것을 포함시킬 수 있었지만 중복 될 것입니다.
출력 매개 변수는 여러 값을 반환 할 때 가장 유용합니다. 사소한 예는 다음과 같습니다.
함수 생성 Sum_n_Product (x int, y int, out sum int, out prod int) $$ 시작하다 합 : = x + y; prod : = x * y; 끝; $$ 언어 plpgsql;
에서 논의 된대로섹션 37.5.4, 이것은 기능 결과에 대한 익명 레코드 유형을 효과적으로 만듭니다. a반환
절의 조항이 주어지고 말해야합니다레코드 반환
.
토토 사이트 순위하는 또 다른 방법pl/pgsql함수는입니다.테이블 리턴
, 예 :
함수 생성 extended_sales (p_itemno int) 테이블 (수량 int, 총 숫자)을 $$로 반환합니다 시작하다 반환 쿼리 SELECT S.QUANTITY, S.QUANTITY * S. S. PRICE AS AS 여기서 s.itemno = p_itemno; 끝; $$ 언어 plpgsql;
이것은 하나 이상을 토토 사이트 순위하는 것과 정확히 동일합니다out
매개 변수 및 지정returns setof
.Somegeype
반환 유형의시기pl/pgsql함수는 다형성 유형으로 토토 사이트 순위됩니다 (Anylement
, AnyArray
, AnynonArray
, AnyEnum
, 또는AnyRange
), 특별 매개 변수$ 0
생성되었습니다. 데이터 유형은 실제 입력 유형에서 추론 된 실제 리턴 유형입니다 (참조섹션 37.2.5). 이를 통해 기능이 표시된대로 실제 반환 유형에 액세스 할 수 있습니다.섹션 42.3.3. $ 0
|는 null로 초기화되어 함수에 의해 수정 될 수 있으므로 원하는 경우 반환 값을 유지하는 데 사용될 수 있습니다..$ 0
또한 별명을받을 수 있습니다. 예를 들어이 기능은 A가있는 모든 데이터 유형에서 작동합니다.+
운영자 :
함수 생성 add_three_values (v1 anylement, v2 anylement, v3 anylement) 모든 요소를 $$로 반환합니다 선언하다 $ 0에 대한 결과 별칭; 시작하다 결과 : = v1 + v2 + v3; 반환 결과; 끝; $$ 언어 plpgsql;
하나 이상의 출력 매개 변수를 다형성 유형으로 선언하여 동일한 효과를 얻을 수 있습니다. 이 경우 특별$ 0
매개 변수는 사용되지 않습니다. 출력 매개 변수 자체는 동일한 목적을 제공합니다. 예를 들어:
함수 생성 add_three_values (v1 anylement, v2 anylement, v3 anylement, out sum anylement) $$로 시작하다 합 : = v1 + v2 + v3; 끝; $$ 언어 plpgsql;
별명
NewName
별칭OldName
;
thealias
구문은 이전 섹션에서 제안한 것보다 더 일반적입니다. 함수 매개 변수가 아닌 변수에 대한 별명을 선언 할 수 있습니다. 이것에 대한 주요 실질적인 사용은와 같은 미리 정해진 이름을 가진 변수에 대해 다른 이름을 할당하는 것입니다.NEW
또는old
트리거 함수 내에서.
예 :
선언 이전의 사전 별칭; 새로운 별명을 업데이트했습니다.
이후alias
동일한 객체의 이름을 지정하는 두 가지 다른 방법을 만듭니다. 무제한 사용은 혼란 스러울 수 있습니다. 사전 결정된 이름을 우선하기 위해서만 사용하는 것이 가장 좋습니다.
가변
%유형
%유형
변수 또는 테이블 열의 데이터 유형을 제공합니다. 이를 사용하여 데이터베이스 값을 유지하는 변수를 선언 할 수 있습니다. 예를 들어,라는 열이 있다고 가정 해 봅시다.user_id
in사용자
테이블. 동일한 데이터 유형의 변수를 선언하려면users.user_id
당신은 다음 :
user_id users.user_id%유형;
사용하여%유형
참조중인 구조의 데이터 유형을 알 필요가 없으며, 가장 중요한 것은 참조 된 항목의 데이터 유형이 향후에 변경되는 경우 (예를 들어 : 유형을 변경하는 경우user_id
정수
toReal
), 함수 정의를 변경할 필요가 없을 수도 있습니다.
%유형
내부 변수에 필요한 데이터 유형이 한 호출에서 다음 호출로 변경 될 수 있기 때문에 다형성 함수에서 특히 가치가 있습니다. 적용하여 적절한 변수를 만들 수 있습니다%유형
함수의 인수 또는 결과 자리 표시 자에게.
이름
table_name
%RowType
;이름
composite_type_name
;
복합 유형의 변수를 a라고합니다.Row변수 (또는Row-Type변수). 이러한 변수는 A의 전체 행을 보유 할 수 있습니다.select
또는for
쿼리 결과가 선언 된 변수 유형과 일치하는 한 쿼리 결과. 행 값의 개별 필드는 일반적인 도트 표기법을 사용하여 액세스합니다 (예 :Rowvar.field
.
행 변수는를 사용하여 기존 테이블 또는보기의 행과 동일한 유형을 갖도록 선언 할 수 있습니다.table_name
%RowType
표기법; 또는 복합 유형의 이름을 제공하여 선언 할 수 있습니다. (모든 테이블에 동일한 이름의 합성 유형이 있으므로 실제로는 중요하지 않습니다PostgreSQL쓰기 여부%RowType
하지만 형식%RowType
더 휴대가 가능합니다.)
함수의 매개 변수는 복합 유형 (완전한 테이블 행) 일 수 있습니다. 이 경우 해당 식별자$
예를 들어 행 변수이며 필드를 선택할 수 있습니다.n
$ 1.user_id
.
다음은 복합 유형을 사용하는 예입니다.표 1
및표 2
기존 테이블은 최소한 언급 된 필드를 가지고 있습니다.
함수 생성 merge_fields (t_row table1)는 텍스트를 $$로 반환합니다 선언하다 T2_ROW 표 2%RowType; 시작하다 * T2_ROW로 *를 선택하여 표 2에서 ...; t_row.f1 ||를 반환합니다 t2_row.f3 || t_row.f5 || t2_row.f7; 끝; $$ 언어 plpgsql; 표 1 T에서 merge_fields (t.*)를 선택하십시오 ...;
이름
레코드;
레코드 변수는 행 유형 변수와 유사하지만 사전 정의 된 구조는 없습니다. 그들은 a 동안 할당 된 행의 실제 행 구조를 취합니다.select
또는for
명령. 레코드 변수의 하위 구조는 할당 할 때마다 변경 될 수 있습니다. 그 결과 레코드 변수가 먼저 할당 될 때까지 하위 구조가 없으며 필드에 액세스하려는 시도는 런타임 오류가 발생한다는 것입니다..
참고레코드
는 실제 데이터 유형이 아니라 자리 표시 자입니다. 또한 A를 깨달아야합니다.PL/PGSQL함수는 유형을 반환하도록 선언 됨레코드
, 이러한 함수가 레코드 변수를 사용하여 결과를 유지할 수 있지만 레코드 변수와 같은 개념이 아닙니다. 두 경우 모두 함수가 작성 될 때 실제 행 구조는 알 수 없지만 함수의 경우레코드
실제 구조는 호출 쿼리가 구문 분석 될 때 결정되는 반면, 레코드 변수는 행 구조를 날개 내내 변경할 수 있습니다..
aPL/PGSQL함수는 하나 이상의 Collatable Data 유형의 매개 변수를 가지고 있으며,에 설명 된대로 실제 인수에 할당 된 콜로레이션에 따라 각 기능 호출에 대해 Collation이 식별됩니다.PostgreSQL : 문서 : 12 : 23.2. 배트맨 토토 Support. Collation이 성공적으로 식별되면 (즉, 인수간에 암시 적 콜라주의 충돌이 없음) 모든 Collatable 매개 변수는 해당 충돌을 암시 적으로 갖는 것으로 취급됩니다. 이는 함수 내에서 Collation-Ensentivent Operation의 동작에 영향을 미칩니다. 예를 들어, 고려
함수 생성 Less_than (텍스트, B 텍스트) Boolean을 $$로 반환합니다. 시작하다 a <b; 끝; $$ 언어 plpgsql; table1에서 Less_than (text_field_1, text_field_2)을 선택하십시오. Less_than (Text_field_1, Text_field_2 Collate "C")을 select table1;
첫 번째 사용Less_than
의 공통 콜레이션을 사용합니다Text_field_1
및Text_field_2
비교의 경우 두 번째 사용은 사용됩니다C
Collation.
또한 식별 된 콜레이션은 또한 Collatable 유형의 로컬 변수의 콜레이션으로 가정됩니다. 따라서이 기능은로 작성된 경우 다르게 작동하지 않습니다.
함수 만들기 Less_than (텍스트, b 텍스트) Boolean을 $$로 반환합니다. 선언하다 local_a 텍스트 : = a; local_b 텍스트 : = b; 시작하다 Local_a <local_b를 반환합니다. 끝; $$ 언어 plpgsql;
Colllatable 데이터 유형의 매개 변수가 없거나 공통된 Collation을 식별 할 수없는 경우 매개 변수 및 로컬 변수는 데이터 유형의 기본 충돌 (일반적으로 데이터베이스의 기본 충돌이지만 도메인 유형의 변수에 대해 다를 수 있음)을 사용합니다.
Collatable Data Type의 로컬 변수는를 포함하여 이와 관련된 다른 Collation을 가질 수 있습니다Collate
예를 들어 토토 사이트 순위의 옵션
토토 사이트 순위 local_a 텍스트는 "en_us";를 충족시킵니다.
이 옵션은 위의 규칙에 따라 변수에 주어질 수있는 콜레이션을 무시합니다.
물론 명시 적Collate
특정 작업에 특정 콜레이션을 강제로 사용하기를 원한다면 클로즈는 함수 내부에 쓸 수 있습니다. 예를 들어,
함수 만들기 Less_than_c (텍스트, b 텍스트) Boolean을 $$로 반환합니다. 시작하다 a <b collate "c"를 반환합니다. 끝; $$ 언어 plpgsql;
이것은 일반 SQL 명령에서 발생하는 것처럼 표현식에 사용 된 테이블 열, 매개 변수 또는 로컬 변수와 관련된 콜라이트를 무시합니다..