이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 토토 사이트 추천현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

설명

구조 PL/PGSQL

​​PL/PGSQL 언어는 사례 둔감합니다. 모든 키워드 및 식별자는 혼합 상부 및 소문자에서 사용할 수 토토 사이트 추천.

PL/PGSQL은 블록 지향 언어입니다. 블록은로 정의됩니다.

[<< 레이블 ]
[선언하다선언]
시작하다진술끝;

명세서 섹션에 여러 하위 블록이있을 수 있습니다. 블록. 서브 블록은 외부에서 변수를 숨기는 데 사용될 수 있습니다. 진술 블록. 변수는 선언에서 선언되었습니다 블록 앞의 섹션은 기본값으로 초기화됩니다. 블록이 입력 될 때마다 함수 당 한 번뿐만 아니라 부르다.

시작/종료의 의미를 오해하지 않는 것이 중요합니다. PL/PGSQL 및 데이터베이스 명령의 그룹화. 거래 제어. 함수 및 트리거 프로 시저를 시작할 수 없습니다 또는 거래 및Postgres중첩되지 않았습니다 업무.

댓글

pl/pgsql에는 두 가지 유형의 주석이 있습니다. 더블 대시 '-' 줄의 끝까지 확장되는 댓글을 시작합니다. '/*'가 시작됩니다 '*/'의 다음 발생으로 확장되는 블록 주석. 차단하다 댓글을 중첩 할 수는 없지만 이중 대시 주석을 동봉 할 수 있습니다. 블록 댓글과 이중 대시로 블록 댓글을 숨길 수 있습니다. Delimiters '/*'및 '*/'.

선언

블록에 사용 된 모든 변수, 행 및 레코드 하위 블록은 블록의 선언 섹션에서 선언해야합니다. 범위를 통해 반복되는 루프의 루프 변수를 제외하고 정수 값의. PL/PGSQL 함수에 주어진 매개 변수는 다음과 같습니다 일반적인 식별자 $ n으로 자동으로 선언했습니다. 그만큼 선언에는 다음 구문이 있습니다.

이름[Constant] typ [NOT NULL] [기본값 | : =value];

지정된 기본 유형의 변수를 선언합니다. 만약 변수는 상수로 선언되며 값을 변경할 수 없습니다. NULL이 지정되지 않으면 NULL 값 결과 할당 런타임 오류에서. 모든 변수의 기본값은 그만큼SQLnull 값, 모든 변수 NULL이 아닌 것으로 선언하여 기본값도 있어야합니다. 지정.

기본값은 기능이 라고 불리는. 그래서 ' 할당now' a 유형 변수dateTime변수가 실제 함수의 시간을 갖도록합니다. 함수가 사전 컴파일 된시기가 아닙니다 바이트 코드.

이름 클래스%RowType;

지정된 클래스의 구조로 행을 선언합니다. 수업 데이터베이스의 기존 테이블 또는 뷰 이름 여야합니다. 그만큼 행의 필드는 도트 표기법으로 액세스됩니다. 매개 변수 함수는 복합 유형 (완전한 테이블 행) 일 수 있습니다. ~ 안에 이 경우 해당 식별자 $ N은 RowType입니다. 그러나 아래에 설명 된 별칭 명령을 사용하여 별명을 사용해야합니다. 테이블 행의 사용자 속성 만 행, OID 또는 기타 시스템 속성 없음 (따라서 행은 보기와보기 행에서 행은 유용한 시스템이 없습니다. 속성).

RowType의 필드는 테이블 필드를 상속하거나 char () 등의 정밀도 데이터 유형.

이름레코드;

레코드는 RowTypes와 유사하지만 사전 정의되지 않았습니다. 구조. 그들은 선택 및 루프를 유지하는 데 사용됩니다. 선택한 작업에서 실제 데이터베이스 행 하나와 다른 선택에서 동일한 레코드를 사용할 수 토토 사이트 추천. 액세스 a 기록 또는 레코드 필드에 값을 할당하려는 시도는 실제 행이 없어도 런타임 오류가 발생합니다.

트리거의 새롭고 오래된 행이 절차에 제공됩니다. 기록으로. 이기 때문에 필요합니다.Postgres하나와 동일한 트리거 절차는 다른 테이블의 트리거 이벤트를 처리 할 수 ​​토토 사이트 추천.

이름$ n;에 대한 별칭

코드의 더 나은 가독성을 위해 정의 할 수 토토 사이트 추천. 함수에 대한 위치 매개 변수에 대한 별칭.

이 별칭은 주어진 복합 유형에 필요합니다 함수에 대한 인수. DOT 표기법 $ 1. SQL에서와 같이 PL/PGSQL에서는 기능이 허용되지 않습니다.

RenameOldNametoNewName;

변수, 레코드 또는 행의 이름을 변경합니다. 이것은 유용합니다 새 또는 오래된 사람이 다른 이름으로 참조 해야하는 경우 트리거 절차.

데이터 유형

변형의 유형은 기존의 기본 유형 일 수 토토 사이트 추천. 데이터베이스.typein 위의 선언 섹션은 다음과 같이 정의됩니다.

  • Postgres-BaseType

  • 변수%유형

  • class.field%유형

변수a의 이름입니다 이전에 동일한 함수로 선언 된 변수는 보입니다. 이 시점에서.

클래스기존 이름입니다 테이블 또는보기필드입니다 속성의 이름.

사용class.field%유형 PL/PGSQL이 첫 번째 속성 정의를 조회하게합니다. 백엔드 수명 동안 Funciton으로 전화하십시오. 테이블이 있습니다 Char (20) 속성 및 일부 PL/PGSQL 기능으로 로컬 변수의 내용이 있습니다. 이제 누군가가 그것을 결정합니다 char (20)는 충분하지 않고 테이블을 버리고, 떨어 뜨리고, 지금 재창조합니다. 문제의 속성이 char (40)로 정의되고 복원됩니다. 데이터. 하 - 그는 funcitons를 잊었다. 내부 계산 그것들은 값을 20 자로 잘립니다. 그러나 그들이 있다면 사용 정의class.field%유형 선언은 자동으로 크기 변경을 처리하거나 새 테이블 스키마는 속성을 텍스트 유형으로 정의합니다.

표현

PL/PGSQL 문에 사용 된 모든 표현식은 처리됩니다 백엔드 집행자. 포함 된 것으로 보이는 표현 상수는 실제로 런타임 평가가 필요할 수 있습니다 (예 : '지금' DateTime 유형) PL/PGSQL 파서가 불가능합니다. NULL 키워드 이외의 실제 상수 값을 식별하십시오. 모두 표현식은 쿼리를 실행하여 내부적으로 평가됩니다

select표현

SPI 관리자 사용. 표현에서, 발생 가변 식별자는 매개 변수 및 실제로 대체됩니다 변수의 값은 매개 변수 배열. PL/PGSQL 기능에 사용 된 모든 표현식은 다음과 같습니다 한 번만 준비되고 저장되었습니다.

Postgres메인 파서에는 몇 가지 부작용이 토토 사이트 추천 일정한 값의 해석. 세부적으로 a 두 기능의 차이

함수 생성 logfunc1 (텍스트) dateTime을 반환합니다.
    선언하다
        $ 1에 대한 logtxt 별칭;
    시작하다
        Logtable 값에 삽입 (logtxt, 'now' ');
        ``지금 '' '을 반환합니다.
    끝;
'언어'plpgsql ';
함수 생성 logfunc2 (텍스트) dateTime을 반환합니다.
    선언하다
        $ 1에 대한 logtxt 별칭;
        곡선 시간 시간;
    시작하다
        큐 타임 : = ''now '';
        Logtable 값 (logtxt, curtime)에 삽입;
        큐 타임 리턴;
    끝;
'언어'plpgsql ';
logfunc1 ()의 경우PostgresMain Parser는 준비 시점을 알고 있습니다 삽입 계획, 문자열 '지금'을 다음으로 해석해야합니다. DateTime 로그 테이블의 대상 필드가 해당 유형이기 때문에. 따라서 지금은 그것으로부터 일정하게 만들 것입니다. 그런 다음 일정한 값은 logfunc1 ()의 모든 호출에 사용됩니다. 백엔드의 수명. 말할 것도없이 이것이 무엇이 아니다 프로그래머가 원했습니다.

logfunc2 ()의 경우Postgres메인 파서는 어떤 유형을 모릅니다 '지금'이되어야하고 텍스트의 데이터 유형을 반환해야합니다. 문자열 '지금'을 포함합니다. 현지인에게 할당하는 동안 가변 큐 타임, PL/PGSQL 통역사 가이 문자열을 text_out () 및 datetime_in () 함수를 호출하여 dateTime 유형 전환을 위해.

이 유형 확인Postgres메인 파서가 구현되었습니다 PL/PGSQL이 거의 완료되었습니다. 6.3과 6.4의 차이입니다 준비된 계획 기능을 사용하여 모든 기능에 영향을 미칩니다. SPI 관리자. 위의 방식으로 로컬 변수를 사용합니다 현재 PL/PGSQL의 유일한 방법은 해당 값을 해석 할 수 있습니다. 바르게.

표현식 또는 진술에 레코드 필드가 사용되는 경우 데이터 필드 유형은 하나의 호출과 동일 사이에 변경되지 않아야합니다. 표현. 트리거 절차를 작성할 때이를 명심하십시오 하나 이상의 테이블에 대한 이벤트 처리.

진술

지정된 PL/PGSQL 파서에 의해 이해되지 않는 것은 아래는 쿼리에 넣고 데이터베이스 엔진으로 전송됩니다. 실행합니다. 결과 쿼리는 데이터를 반환해서는 안됩니다.

과제

변수 또는 행/레코드 필드에 값을 할당 로 작성되었습니다.

        식별자: =표현;
표현식 결과 데이터 유형이 일치하지 않는 경우 변수 데이터 유형 또는 변수의 크기/정밀도가 있습니다. 알려진 (char (20))에 따라 결과 값은 암시 적으로 캐스팅됩니다. 결과 유형 출력을 사용한 PL/PGSQL 바이트 코드 통역에 의해 변수는 입력 기능을 유형합니다. 이것은 할 수 있습니다 잠재적으로 유형 입력에 의해 생성 된 런타임 오류가 발생합니다. 기능.

전체 선택을 레코드 또는 행에 할당 에 의해 수행 할 수 토토 사이트 추천

select표현in대상From ...;
대상레코드, 행이 될 수 있습니다 변수의 변수 또는 쉼표로 분리 된 변수 목록 레코드/행 필드.

행 또는 가변 목록이 대상으로 사용되는 경우 선택한 값은 대상 또는 A의 구조와 정확히 일치해야합니다. 런타임 오류가 발생합니다. FROM 키워드 뒤에는 어떤 것도 다음과 같습니다 주어질 수있는 유효한 자격, 그룹화, 분류 등 선정 된 진술의 경우.

Type Bool이라는 이름의 특수 변수가 있습니다. 선택 후 즉시 사용할 수 있습니다. 과제는 성공했다.

empname = myName에서 EMP에서 MyRec으로 선택하십시오.
찾을 수없는 경우
    ``Employee % found '', myName 예외를 높이십시오.
끝 If;
선택이 여러 행을 반환하면 첫 번째는 대상 필드로 이동했습니다. 다른 모든 사람들은 조용히 폐기됩니다.
다른 기능 호출

a에 정의 된 모든 함수Prostgres데이터베이스는 값을 반환합니다. 따라서, 함수를 호출하는 일반적인 방법은 선택 쿼리를 실행하는 것입니다. 또는 과제 수행 (PL/PGSQL 내부를 초래합니다 선택하다). 그러나 누군가가 관심이없는 경우가 있습니다 기능 결과.

Perform쿼리

'select 실행쿼리' SPI 관리자를 통해 결과를 폐기합니다. 식별자가 좋아요 로컬 변수는 여전히 매개 변수로 대체됩니다.
함수에서 돌아 오는
return표현

함수가 종료되고 값표현상단으로 반환됩니다 집행자. 함수의 반환 값은 정의되지 않습니다. 만약에 제어 기능의 조정 블록의 끝에 컨트롤이 도달합니다. Return 문에 도달하지 않으면 런타임 오류가 발생합니다.

표현식 결과는 자동으로 시전됩니다 함수 과제에 대해 설명 된대로 반환 유형.

낙태 및 메시지

위의 예에 표시된대로 인상이 있습니다. 에 메시지를 던질 수있는 진술Postgreselog 메커니즘.

Rain레벨 형식''[,식별자[...]];
형식 내부 "%"는 a로 사용됩니다 후속 쉼표로 구분 된 식별자의 자리 표시 자. 가능한 레벨이 디버그됩니다 (생산에서 조용히 억제됩니다 데이터베이스 실행), 통지 (데이터베이스 로그에 작성 및 클라이언트 응용 프로그램으로 전달) 및 예외 (작성 데이터베이스 로그 및 트랜잭션 중단).
조건부
if표현the진술[else진술]
끝 If;
the표현반환해야합니다 적어도 부울 유형으로 캐스트 될 수있는 가치.
루프

여러 유형의 루프가 있습니다.

[<< 레이블 ]
고리진술엔드 루프;
명시 적으로 종료 해야하는 무조건 루프 종료 성명서. 옵션 레이블은 출구에서 사용할 수 있습니다 어떤 레벨의 중첩을 지정하기위한 중첩 루프의 진술 종료됩니다.
[<< 레이블 ]
하는 동안표현루프진술엔드 루프;
평가에 따라 실행되는 조건부 루프 의표현진실입니다.
[<< 레이블 ]
을 위한이름in [Reverse]표현 .. 표현loop진술엔드 루프;
범위의 정수 값을 반복하는 루프. 그만큼 변하기 쉬운이름자동으로 IS입니다 타입 정수로 생성되며 루프 안에만 존재합니다. 둘 범위의 하부 및 상한을 제공하는 표현은 다음과 같습니다. 루프에 들어갈 때만 평가했습니다. 반복 단계는 항상입니다 1.
[<< 레이블 ]
을 위한레코드 | 열inselect_clause루프진술엔드 루프;
레코드 또는 행에는 각각에 대해 실행 된 조항과 진술을 선택하십시오. 루프가 있다면 종료 명세서로 종료 된 마지막으로 지정된 행은 여전히 루프 후에 액세스 가능.
출구 [레이블] [when표현];
NO레이블주어진, 가장 안쪽 루프가 종료되고 엔드 루프 다음으로 명세서가 종료됩니다. 다음에 실행됩니다. 만약에레이블IS 주어진 것은 전류 또는 상위 레벨의 레이블이어야합니다. 중첩 루프 블록. 그런 다음 이름이 지정된 루프 또는 블록이 종료됩니다 루프/블록 이후의 명령문으로 제어가 계속됩니다 해당 끝.

트리거 절차

PL/PGSQL을 사용하여 트리거 절차를 정의 할 수 있습니다. 그들은입니다 평소 생성 함수 명령으로 논쟁이없고 불투명의 반환 유형.

일부가 토토 사이트 추천Postgres트리거 절차로 사용되는 함수의 특정 세부 사항.

먼저 몇 가지 특수 변수가 자동으로 생성되었습니다 Toplevel은 선언 섹션을 차단합니다. 그들은

NEW

데이터 유형 레코드; 새로운 데이터베이스 행을 고정하는 변수 행 수준 트리거에 작업/업데이트 작업.

old

데이터 유형 레코드; 기존 데이터베이스 행을 고정하는 변수 행 수준 트리거의 업데이트/삭제.

tg_name

데이터 유형 이름; 이름이 포함 된 변수 방아쇠가 실제로 해고되었습니다.

TG_WHEN

Datatype 텍스트; '이전'또는 '후'의 문자열 트리거 정의에 따라

tg_level

DataType 텍스트; '행'또는 '진술'의 문자열 트리거 정의에 따라

TG_OP

DataType 텍스트; '삽입', '업데이트'또는 '삭제'문자열 트리거가 실제로 해고되는 작업에 대한 정보.

TG_RELID

Datatype OID; 테이블의 객체 ID 호출 트리거.

tg_relname

데이터 유형 이름; 방아쇠를 일으킨 테이블의 이름 기도.

tg_nargs

Datatype Integer; 주어진 인수의 수 Trigger 문의 트리거 프로 시저.

tg_argv []

DataType 텍스트 배열; 생성의 주장 트리거 진술. 인덱스는 0에서 계산되며 다음과 같이 주어질 수 있습니다. 표현. 유효하지 않은 인덱스 (<0 또는 = tg_nargs) 널 값을 초래합니다.

두 번째로 그들은 null 또는 레코드/행 포함 된 레코드/행을 반환해야합니다. 정확히 테이블의 구조가 방아쇠를 발사했습니다. 발사 된 트리거는 항상 null 값을 반환 할 수 토토 사이트 추천. 효과. 트리거 관리자에게 건너 뛰기 전에 발사 된 트리거 NULL을 반환 할 때이 실제 행의 작업. 그렇지 않으면, 반환 된 레코드/행은 삽입/업데이트 된 행을 대체합니다 작업. 신규에서 직접 단일 값을 대체 할 수 토토 사이트 추천. 그리고 그것을 반환하거나 완전한 새로운 레코드/행을 구축하려면 반품.

예외

Postgres그다지 중요하지 않습니다 스마트 예외 처리 모델. 파서가 될 때마다 플래너/최적화기 또는 집행자는 진술이 될 수 없다고 결정합니다 더 이상 처리하면 전체 거래가 중단되고 시스템은 메인 루프로 돌아와 다음 쿼리를 얻습니다. 클라이언트 응용 프로그램.

오류 메커니즘에 연결하여 이런 일이 발생합니다. 그러나 현재 실제로 무엇을 말하는 것은 불가능합니다 중단 (입력/출력 변환 오류, 플로팅 포인트가 발생했습니다 오류, 구문 분석 오류). 데이터베이스 백엔드가 가능합니다 이 시점에서 일관되지 않은 상태이므로 상단으로 돌아갑니다. 집행자 또는 더 많은 명령을 발행하면 전체 데이터베이스가 손상 될 수 있습니다. 그리고이 시점에서 정보는 거래가 중단되고 이미 클라이언트 신청서로 전송되어 재개 작동은 의미가 없습니다.

따라서, 현재 유일하게 PL/PGSQL이 발생할 때 수행하는 유일한 것입니다. 함수 또는 트리거 절차를 실행하는 동안 중단은 다음과 같습니다. 추가 디버그 레벨 로그 메시지를 작성하십시오. 기능 및 위치 (줄 번호 및 진술 유형) 일어났다.