블록에 사용 된 모든 변수는 블록의 사설 토토 섹션. (유일한 예외는 그 것입니다 a의 루프 변수for루프 범위의 정수 값을 반복하는 것이 자동으로됩니다 정수 변수로 사설 토토되었습니다.)
pl/pgsql변수가 가질 수 있습니다 와 같은 모든 SQL 데이터 유형정수, Varchar및char.
변수 선언의 몇 가지 예는 다음과 같습니다.
user_id 정수; 수량 숫자 (5); URL VARCHAR; Myrow tablename%rowtype; Myfield tablename.columnname%유형; 아로우 레코드;
변수 선언의 일반적인 구문은 다음과 같습니다.
이름[Constant]type[NOT NULL] [기본값 | : =표현 ];
the기본값조항, 주어진 경우, 변수에 할당 된 초기 값을 블록이 입력되었습니다. 인 경우기본값절 제공되지 않으면 변수가에 초기화됩니다.SQL널 값. 그만큼Constant옵션은 변수가 존재하는 것을 방지합니다 그 값이 기간 동안 일정하게 유지되도록 할당 블록의. 만약에NOT NULL지정되어 있습니다. 널 값을 할당하면 런타임 오류가 발생합니다. 모두 변수로 사설 토토 된 변수NOT NULL지정되지 않은 기본값이 지정되었습니다.
변수의 기본값이 평가되고 할당됩니다. 블록이 입력 될 때마다 변수 (한 번만 기능 호출). 예를 들어, 할당now ()유형 변수타임 스탬프변수가 시간을 갖도록합니다 현재 함수 호출, 함수가 있었던 시간이 아닙니다. 사전 컴파일.
예 :
수량 정수 기본값 32; url varchar : = 'http://mysite.com'; user_id 상수 정수 : = 10;
함수로 전달 된 매개 변수는 식별자$ 1, $ 2등. 선택적으로, 별명은를 사설 토토 할 수 있습니다.$n가독성 증가에 대한 매개 변수 이름. 별칭 또는 그런 다음 숫자 식별자를 사용하여 매개 변수 값.
별칭을 만드는 방법에는 두 가지가 있습니다. 선호하는 방법은 의 매개 변수에 이름을 제시하려면함수 만들기명령, 예 :
함수 생성 sales_tax (subtotal real)는 real을 $$로 반환합니다 시작하다 반환 하위 토탈 * 0.06; 끝; $$ 언어 plpgsql;
다른 방법으로, 이전에 사용할 수있는 유일한 방법PostgreSQL8.0은 다음과 같습니다 선언문 구문을 사용하여 별칭을 명시 적으로 선언합니다
이름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함수는입니다 출력 매개 변수로 선언되면 출력 매개 변수는 다음과 같습니다 주어진$nJust의 이름 및 선택적 별칭 일반 입력 매개 변수와 마찬가지로. 출력 매개 변수는 사실상 null을 시작하는 변수입니다. 그것 함수 실행 중에 할당해야합니다. 그만큼 매개 변수의 최종 값은 반환됩니다. 예를 들어, 판매 세 예제는 다음과 같은 방식으로 수행 할 수 있습니다.
함수 sales_tax (subtotal real, out tax real)를 $$로 만듭니다 시작하다 세금 : = 하위 운동 * 0.06; 끝; $$ 언어 plpgsql;
우리가 생략 한 것을 알았습니다Retials Real- 우리는 그것을 포함시킬 수 있었지만 중복 될 것입니다.
출력 매개 변수는 여러 반환 할 때 가장 유용합니다 값. 사소한 예는 다음과 같습니다.
함수 생성 sum_n_product (x int, y int, out sum int, out prod int) $$ 시작하다 합 : = x + y; prod : = x * y; 끝; $$ 언어 plpgsql;
에서 논의 된대로섹션 34.4.3, 이것은 효과적으로 익명 레코드 유형을 만듭니다 기능의 결과. a반환조항이 제공되며 말해야합니다반환 기록.
반환 유형의시기pl/pgsql함수는 a로 사설 토토됩니다 다형성 유형 (Anylement, AnyArray, AnynonArray또는AnyEnum), 특별 매개 변수$ 0생성되었습니다. 데이터 유형은 실제입니다 실제 입력에서 추론 된 기능의 반환 유형 유형 (참조섹션 34.2.5). 이를 통해 기능이 실제 액세스 할 수 있습니다 표시된대로 반환 유형섹션 38.3.2. $ 0는 null로 초기화됩니다 함수에 의해 수정 될 수 있으므로 고정하는 데 사용될 수 있습니다. 원하는 경우 반환 값이 필요하지 않습니다.$ 0alias도 제공 할 수 있습니다. 을 위한 예,이 기능은가있는 모든 데이터 유형에서 작동합니다.+운영자 :
함수 생성 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;
variable%유형
%유형a의 데이터 유형을 제공합니다 변수 또는 테이블 열. 이것을 사용하여 변수를 선언 할 수 있습니다 데이터베이스 값을 유지합니다. 예를 들어, 당신이 가지고 있다고 가정 해 봅시다 이름이라는 열user_idin사용자테이블. 변수를 사설 토토합니다 와 동일한 데이터 유형으로users.user_id당신은 다음 :
user_id user.user_id%유형;
사용하여%유형당신은 필요하지 않습니다 참조하는 구조의 데이터 유형을 알고 가장 중요한 것은 참조 된 항목의 데이터 유형이 미래의 변경 (예 : 유형 변경user_idFromIntegertoReal) 기능 정의를 변경할 필요가 없습니다.
%유형특히 가치가 있습니다 내부에 필요한 데이터 유형이므로 다형성 기능 변수는 한 통화에서 다음 호출로 변경 될 수 있습니다. 적절한 변수는 적용하여 생성 할 수 있습니다%유형함수의 인수 또는 결과에 자리 표시 자.
이름 table_name%RowType;이름 composite_type_name;
복합 유형의 변수를 a라고합니다.row변수 (또는Row-Type변수). 이러한 변수는 a a의 전체 줄select또는for쿼리 Query의 열이라면 쿼리 결과 세트는 변수의 선언 된 유형과 일치합니다. 개인 행 값의 필드는 일반적인 점을 사용하여 액세스합니다. 표기법, 예를 들어Rowvar.field.
행 변수는 기존 테이블 또는 뷰의 행을 사용하여table_name%RowType표기법; 또는 선언 할 수 있습니다 복합 유형의 이름을 제공합니다. (모든 테이블에는 다음에 있습니다 동일한 이름의 관련 복합 유형, 실제로는 중요하지 않음PostgreSQL쓰기 여부%RowType하지만 형식%RowType더 많습니다 가지고 다닐 수 있는.)
함수의 매개 변수는 복합 유형 일 수 있습니다 (완료 테이블 행). 이 경우 해당 식별자$n는 행 변수이며 필드를 선택할 수 있습니다. 예$ 1.user_id.
테이블 행의 사용자 정의 열만 액세스 할 수 있습니다. OID 또는 기타 시스템 열이 아닌 행 형 변수에서 (행은보기에서 나올 수 있기 때문에). 행의 필드 입력 데이터 유형의 테이블의 필드 크기 또는 정밀도 상속 와 같은char (n).
다음은 복합 유형을 사용하는 예입니다.표 1and표 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함수가 선언되었습니다 유형을 반환하려면레코드, 이것은 그다지 아닙니다 그럼에도 불구하고 레코드 변수와 동일한 개념 함수는 레코드 변수를 사용하여 결과를 유지할 수 있습니다. ~ 안에 두 경우 모두 실제 행 구조는 함수가 작성되었지만 기능이 반환되는 경우레코드실제 구조는 다음과 같이 결정됩니다 쿼리 호출은 구문 분석되지만 레코드 변수는 변경 될 수 있습니다. 그 행 구조는 날개에 있습니다.
RenameOldNametoNewName;
사용Rename선언문 변수, 레코드 또는 행의 이름을 변경할 수 있습니다. 이것은 주로 유용하면NEW또는old내부의 다른 이름으로 참조해야합니다 방아쇠 절차. 참조 참조alias.
예 :
user_id로 id 이름을 바꿉니다. this_var를 that_var로 바꾸십시오.
참고 : Rename당시PostgreSQL7.3. 이것을 고치는 것은 우선 순위가 낮습니다.alias|Rename.