젠 토토 : 문서 : 9.6 : 젠 토토 | |||
---|---|---|---|
Postgre스포츠 토토 결과 : 문서 : 9.6 : PL/PG스포츠 토토 결과의 구조 | Postgre배트맨 토토 : 문서 : 9.6 : PL/PG배트맨 토토 -배트맨 토토 절차 언어 | 41 장pl/pgsql - SQL절차 언어 | 다음 |
블록에 사용 된 모든 변수는 블록의 윈 토토 섹션에서 윈 토토해야합니다. (유일한 예외는 a의 루프 변수입니다.forLOOP 범위의 정수 값을 반복하는 것은 정수 변수로 자동으로 윈 토토되며 마찬가지로 A의 루프 변수와 마찬가지로for커서의 결과를 통한 루프 반복은 자동으로 레코드 변수로 윈 토토됩니다.)
pl/pgsql변수는와 같은 SQL 데이터 유형을 가질 수 있습니다.Integer, varchar및char.
변수 선언의 몇 가지 예는 다음과 같습니다.
user_id 정수; 수량 숫자 (5); URL VARCHAR; Myrow tablename%rowtype; Myfield tablename.columnname%유형; 아로우 레코드;
변수 선언의 일반적인 구문은 다음과 같습니다.
이름[Constant]type[Collatecollation_name ] [NOT NULL] [기본 | : = | =표현 ];
the기본값조항은 주어진 경우 블록을 입력 할 때 변수에 할당 된 초기 값을 지정합니다. 인 경우기본값조항이 주어지지 않으면 변수가 초기화됩니다SQL널 값. 그만큼Constant옵션은 초기화 후 변수가 할당되는 것을 방지하여 블록 기간 동안 값이 일정하게 유지됩니다. 그만큼Collate옵션 변수에 사용할 콜라이트를 지정합니다 (참조섹션 41.3.6). 만약에NOT NULL지정되어 있으며, 널 값을 할당하면 런타임 오류가 발생합니다. 모든 변수는NOT NULLunnull 기본값이 지정되어 있어야합니다. 동일한 (=) PL/SQL 준수 대신 사용할 수 있습니다: =.
변수의 기본값이 평가되고 블록이 입력 될 때마다 변수에 할당됩니다 (함수 호출 당 한 번만 아님). 예를 들어, 할당now ()유형 변수타임 스탬프변수가 함수가 사전 컴파일 된 시간이 아니라 현재 함수 호출 시간을 갖도록합니다.
예 :
수량 정수 기본값 32; url varchar : = 'http://mysite.com'; user_id 상수 정수 : = 10;
Parameters passed to functions are named with the identifiers$ 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대신 해당 레이블로 자격을 갖추 수 있습니다.)
더 많은 예 :
기능 기기 만들기 (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함수는 출력 매개 변수로 윈 토토되며 출력 매개 변수가 제공됩니다$n일반 입력 매개 변수와 동일한 방식으로 이름 및 선택적 별칭. An output parameter is effectively a variable that starts out NULL; 함수 실행 중에 할당해야합니다. 매개 변수의 최종 값은 반환됩니다. 예를 들어, 판매 세 예제는 다음과 같은 방식으로 수행 할 수 있습니다.
함수 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;
에서 논의 된대로섹션 36.4.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 setofSOMENTYPE.
a의 반환 유형시기pl/pgsql함수는 다형성 유형으로 선언됩니다 (Anylement, AnyArray, AnynonArray, AnyEnum또는AnyRa윈 토토e), 특별 매개 변수$ 0생성되었습니다. 데이터 유형은 실제 입력 유형에서 추론 된 실제 리턴 유형입니다 (참조섹션 36.2.5). 이를 통해 기능이 표시된대로 실제 반환 유형에 액세스 할 수 있습니다.섹션 41.3.3. $ 0| 널로 초기화되어 함수에 의해 수정 될 수 있으므로 원하는 경우 반환 값을 유지하는 데 사용될 수 있습니다..$ 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_idin사용자테이블. 동일한 데이터 유형의 변수를 선언하려면users.user_id당신은 다음 :
user_id users.user_id%유형;
사용하여%유형참조중인 구조의 데이터 유형을 알 필요가 없으며 가장 중요한 것은 참조 된 항목의 데이터 유형이 향후에 변경되는 경우 (예 : 예를 들어 : 유형을 변경합니다user_idFrom정수toReal), 기능 정의를 변경할 필요가 없을 수도 있습니다.
%유형내부 변수에 필요한 데이터 유형이 한 호출에서 다음 호출로 변경 될 수 있기 때문에 다형성 함수에서 특히 가치가 있습니다. 적용하여 적절한 변수를 만들 수 있습니다%유형함수의 인수 또는 결과 자리 표시 자에게.
이름 table_name%RowType;이름 composite_type_name;
복합 유형의 변수를 a라고합니다.Row변수 (또는Row-Type변수). 이러한 변수는 A의 전체 행을 보유 할 수 있습니다.select또는for22033_22222Rowvar.field.
행 변수는를 사용하여 기존 테이블 또는보기의 행과 동일한 유형을 갖도록 선언 할 수 있습니다.table_name%RowType표기법; 또는 복합 유형의 이름을 제공하여 선언 할 수 있습니다. (모든 테이블에 동일한 이름의 합성 유형이 있으므로 실제로는 중요하지 않습니다PostgreSQL쓰기 여부%RowType하지만 형식%RowType더 휴대가 가능합니다.)
함수의 매개 변수는 복합 유형 (완전한 테이블 행) 일 수 있습니다. 이 경우 해당 식별자$n예를 들어 행 변수이며 필드를 선택할 수 있습니다 (예 :$ 1.user_id.
테이블 행의 사용자 정의 열만 OID 또는 기타 시스템 열이 아닌 행 유형 변수에서 액세스 할 수 있습니다 (행이보기에서 나올 수 있기 때문에). 행 유형의 필드는 테이블의 필드 크기 또는와 같은 데이터 유형의 정밀도를 상속합니다.char (n).
다음은 복합 유형을 사용하는 예입니다.표 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함수는 유형을 반환하도록 선언 됨record, 이러한 함수가 레코드 변수를 사용하여 결과를 유지할 수 있지만 레코드 변수와 같은 개념이 아닙니다. 두 경우 모두 함수가 작성 될 때 실제 행 구조는 알 수 없지만 함수의 경우레코드실제 구조는 호출 쿼리가 구문 분석 될 때 결정되는 반면, 레코드 변수는 행 구조를 날려 날려 버릴 수 있습니다..
apl/pgsql함수는 하나 이상의 Collatable 데이터 유형의 매개 변수를 가지고 있으며,에 설명 된대로 실제 인수에 지정된 콜라데요에 따라 각 기능 호출에 대해 콜로레이션이 식별됩니다.PostgreSQL : 문서 : 9.6 : 토토 커뮤니티 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비교의 경우 두 번째 사용은 사용됩니다CCollation.
또한 식별 된 콜레이션은 또한 Collatable 유형의 로컬 변수의 콜레이션으로 가정됩니다. 따라서이 기능은로 작성된 경우 다르게 작동하지 않습니다.
함수 생성 Less_than (텍스트, B 텍스트) Boolean을 $$로 반환합니다. 선언하다 local_a 텍스트 : = a; local_b 텍스트 : = b; 시작하다 Local_a <local_b를 반환합니다. 끝; $$ 언어 plpgsql;
Colllatable 데이터 유형의 매개 변수가 없거나 공통된 콜로레이션을 식별 할 수없는 경우 매개 변수 및 로컬 변수는 데이터 유형의 기본 충돌을 사용합니다 (일반적으로 데이터베이스의 기본 수정 사항이지만 도메인 유형의 변수에 대해 다를 수 있음).
Collatable Data Type의 로컬 변수는를 포함하여 다른 Collation을 가질 수 있습니다COLLATE윈 토토의 옵션
윈 토토 local_a 텍스트는 "en_us";를 충족시킵니다.
이 옵션은 위의 규칙에 따라 변수에 주어질 수있는 콜레이션을 무시합니다.
물론 명시 적Collate특정 작업에 특정 Collation을 사용하도록 강요하는 경우 기능 내부에 클로스를 작성할 수 있습니다. 예를 들어,
함수 만들기 Less_than_C (a 텍스트, b 텍스트) Boolean을 $$로 반환합니다. 시작하다 a <b collate "c"를 반환합니다. 끝; $$ 언어 plpgsql;
이것은 일반 SQL 명령에서 발생하는 것처럼 표현식에 사용 된 테이블 열, 매개 변수 또는 로컬 변수와 관련된 콜라이트를 무시합니다..