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

24.2. 설명

24.2.1. pl/pgsql의 구조

PL/PGSQL은 A입니다.블록 구조화언어. 모든 키워드와 식별자는 혼합 된 상태에서 사용할 수 있습니다 상단 및 소문자. 블록은 다음과 같이 정의됩니다.

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

문에 서브 블록이 몇 개있을 수 있습니다. 블록의 섹션. 서브 블록을 사용하여 변수를 숨길 수 있습니다 진술 블록 외부에서.

선언 된 선언 섹션에서 선언 된 변수 블록은 매번 기본값으로 초기화됩니다. 함수 호출 당 한 번뿐만 아니라 블록이 입력됩니다. 을 위한 예:

함수 만들기 nosefunc ()은 정수를 반환합니다.
선언하다
   수량 정수 : = 30;
시작하다
   ``여기서 수량은 %'', 수량을 높이십시오.  - 여기서 수량은 30입니다
   수량 : = 50;
   -
   -하위 블록을 만듭니다
   -
   선언하다
      수량 정수 : = 80;
   시작하다
      ``여기서 수량은 %'', 수량을 높이십시오.  - 여기서 수량은 80입니다
   끝;

   ``여기서 수량은 %'', 수량을 높이십시오.  - 여기서 수량은 50입니다
끝;
'언어'plpgsql ';

시작/종료의 사용을 혼동하지 않는 것이 중요합니다. Database 명령과 pl/pgsql의 그룹화 명령문 거래 제어. PL/PGSQL의 시작/종료만을위한 것입니다 그룹화; 그들은 거래를 시작하거나 종료하지 않습니다. 기능 및 트리거 절차는 항상 거래 내에서 실행됩니다 외부 쿼리에 의해 설정 --- 시작하거나 커밋 할 수 없습니다. 거래, 이후Postgres중첩 된 거래가 없습니다.

24.2.2. 의견

PL/PGSQL에는 두 가지 유형의 주석이 있습니다. 더블 대시--연장되는 주석을 시작합니다 줄의 끝. 에이/*시작 a 다음 발생으로 확장되는 블록 댓글*/. 블록 댓글은 중첩 될 수는 없지만 두 배입니다 대시 댓글은 블록 댓글과 더블로 둘러싸여 있습니다. 대시는 블록 주석을 숨길 수 있습니다/*and*/.

24.2.3. 사설 토토 사이트 및 상수

블록 또는 그에 사용되는 모든 사설 토토 사이트, 행 및 레코드 하위 블록은 차단하다. 예외는 루프 용 루프 사설 토토 사이트입니다. 범위의 정수 값을 반복합니다.

PL/PGSQL 변수는와 같은 SQL 데이터 유형을 가질 수 있습니다.정수, varcharandchar. 모든 사설 토토 사이트는 기본값입니다 가치SQL널 값.

변수 선언의 몇 가지 예는 다음과 같습니다.

user_id 정수;
수량 번호 (5);
url varchar;

24.2.3.1. 상수와 기본값이있는 사설 토토 사이트

선언에는 다음 구문이 있습니다.

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

상수로 선언 된 변수의 값은 될 수 없습니다 변경. null이 지정되지 않으면 null 할당 값은 런타임 오류가 발생합니다. 기본값 이후 모든 변수는입니다.SQLnull 값, null이 아닌 모든 사설 토토 사이트는 또한 기본값 지정.

함수가있을 때마다 기본값이 평가됩니다. 라고 불리는. 그래서 ' 할당now' a 유형 사설 토토 사이트타임 스탬프원인 실제 함수 호출 시간이없는 가변. 함수가 바이트 코드에 미리 컴파일되었을 때.

예 :

수량 정수 : = 32;
url varchar : = ''http://mysite.com '';
user_id 상수 정수 : = 10;

24.2.3.2. 사설 토토 사이트 기능으로 전달

함수로 전달 된 사설 토토 사이트는 식별자$ 1, $ 2등 (최대 16). 몇 가지 예 :

기능 생성 sales_tax (real)는 real을 반환합니다.
선언하다
    1 달러에 대한 소계 별칭;
시작하다
    반환 하위 토탈 * 0.06;
끝;
'언어'plpgsql ';

기능 악기 생성 (Varchar, Integer)은 정수를 '로 반환합니다.
선언하다
    $ 1에 대한 v_string 별칭;
    $ 2의 색인 별칭;
시작하다
    - 여기에 일부 계산
끝;
'언어'plpgsql ';

24.2.3.3. 속성

사용%유형and%rowtype속성은 변수를 선언 할 수 있습니다 동일한 데이터 유형 또는 다른 데이터베이스 항목의 구조로 (예 : 테이블 필드).

%유형

%유형의 데이터 유형을 제공합니다 변수 또는 데이터베이스 열. 이것을 사용할 수 있습니다 데이터베이스 값을 유지하는 변수를 선언합니다. 을 위한 예를 들어,라는 열이 있다고 가정 해 봅시다.user_idin사용자테이블. 동일한 데이터 유형이있는 변수를 선언하려면 당신이하는 사용자 :

user_id users.user_id%유형;

사용하여%유형필요하지 않습니다 당신이있는 구조의 데이터 유형을 알기 위해 의 데이터 유형 인 경우 참조 및 가장 중요한 미래에 참조 된 항목 변경 (예 : 변경 user_id의 테이블 정의는 진짜가되기 위해 기능 정의를 변경할 필요가 없습니다.

이름 테이블%RowType;

주어진 구조로 행을 선언합니다 테이블.테이블데이터베이스의 기존 테이블 또는보기 이름. 필드 행의 행은 도트 표기법으로 액세스됩니다. 매개 변수 함수에는 복합 유형이 될 수 있습니다 (완전한 테이블 줄). 이 경우 해당 식별자 $ n입니다 RowType이지만 위에서 설명한 별명 명령.

테이블 행의 사용자 속성 만 있습니다 행에 액세스 가능, OID 또는 기타 시스템이 없습니다 속성 (행은보기에서 나올 수 있기 때문에). 그만큼 RowType의 필드는 테이블의 필드 크기를 상속합니다 또는 정밀도char ()등. 데이터 유형.

선언
    users_rec user%rowtype;
  user_id 사용자%유형;
시작하다
    user_id : = user_rec.user_id;
    ...

기능 작성 CS_REFRESH_ONE_MV (Integer) 정수를 반환합니다.
   선언하다
        $ 1의 주요 별칭;
        table_data cs_materialized_views%rowtype;
   시작하다
        cs_materialized_views에서 table_data *로 선택하십시오
               여기서 sort_key = 키;

        찾을 수없는 경우
           예외 ''view ''||를 높이십시오 키 || ``찾을 수 없다 '';
           반환 0;
        끝 IF;

        -CS_Materialized_Views Stores View의 MV_NAME 열
        - 이름.

        자르기 테이블 테이블 _data.mv_name;
        table_data.mv_name ||에 삽입하십시오 '' '' '|| table_data.mv_query;

        반환 1;
끝;
'언어'plpgsql ';

24.2.3.4. 이름 바꾸기

이름 바꾸기를 사용하여 변수 이름, 레코드의 이름을 변경할 수 있습니다. 또는 행. 이것은 새롭거나 오래된 방아쇠 절차 내부의 다른 이름.

구문 및 예 :

RenameOldNametoNewName;

us user_id로 이름 바꾸기;
this_var를 that_var로 바꾸십시오.

24.2.4. 표현

PL/PGSQL 문에 사용 된 모든 표현식이 처리됩니다 백엔드의 집행자 사용. 나타나는 표현 실제로 상수는 런타임 평가가 필요할 수 있습니다 (예 :'now'타임 스탬프type) PL/PGSQL 파서가 아닌 실제 상수 값을 식별합니다. 널 키워드. 모든 표현식은 내부적으로 평가됩니다 쿼리 실행

select표현
사용SPI관리자. 에서 표현식, 가변 식별자의 발생은 대체됩니다 변수의 매개 변수와 실제 값은 전달됩니다. 매개 변수 배열의 집행자. a에 사용 된 모든 표현 PL/PGSQL 기능은 한 번만 준비되고 저장됩니다. 유일한 이 규칙에 대한 예외는 쿼리가 발생할 때마다 필요합니다.

Postgres메인 파서에는 부작용이 있습니다 일정한 값의 해석에. 세부적으로 a 이 두 기능의 차이점 :

함수 생성 logfunc1 (텍스트) 타임 스탬프를 반환합니다.
    선언하다
        $ 1에 대한 logtxt 별칭;
    시작하다
        Logtable 값에 삽입 (logtxt, 'now' ');
        ``지금 '' '을 반환합니다.
    끝;
'언어'plpgsql ';
and
함수 생성 logfunc2 (텍스트) 타임 스탬프를 반환합니다.
    선언하다
        $ 1에 대한 logtxt 별칭;
        곡선 타임 스탬프;
    시작하다
        큐 타임 : = ''now '';
        Logtable 값 (logtxt, curtime)에 삽입;
        큐 타임 리턴;
    끝;
'언어'plpgsql ';
의 경우logfunc1 (), ThePostgresMain Parser는 언제 알고 있습니다 삽입 계획 준비, 문자열'now'타임 스탬프Logtable의 대상 필드가 이루어지기 때문입니다 그 유형. 따라서 지금은 일정하게 만들어지고 이 상수 값은의 모든 호출에 사용됩니다.logfunc1 ()수명 동안 백엔드. 말할 것도없이 이것이 프로그래머가 아닙니다 구함.

의 경우logfunc2 (), thePostgres메인 파서는 그렇지 않습니다 어떤 유형을 알고'now'따라서 데이터 유형을 반환합니다텍스트문자열 포함'now'. 동안 로컬 변수 곡선, ​​PL/PGSQL에 대한 할당 통역사 그만큼text_out ()andTimestamp_in ()변환.

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

레코드 필드가 표현 또는 진술에 사용되는 경우 필드의 데이터 유형은 하나의 호출과 같은 표현. 트리거를 작성할 때 이것을 명심하십시오 하나 이상의 테이블에 대한 이벤트를 처리하는 절차.

24.2.5. 진술

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

24.2.5.1. 과제

변수 또는 행/레코드 필드에 값을 할당 다음과 같이 작성되었습니다 :

식별자: =표현;
표현식 결과 데이터 유형이 일치하지 않는 경우 변수 데이터 유형 또는 변수의 크기/정밀도가 있습니다. 알려진 (forchar (20)), 결과 값 PL/PGSQL 바이트 코드 통역사가 암시 적으로 캐스팅됩니다 결과 유형 사용 출력 및 변수 유형 사용 입력 기능. 이로 인해 런타임이 발생할 수 있습니다 유형 입력 함수에 의해 생성 된 오류.
user_id : = 20;
세금 : = 하위 토탈 * 0.06;

24.2.5.2. 부름 다른 기능

a에 정의 된 모든 함수Postgres데이터베이스는 값을 반환합니다. 따라서, 함수를 호출하는 일반적인 방법은 선택을 실행하는 것입니다. 쿼리 또는 할당 수행 (PL/PGSQL 결과 내부 선택).

그러나 누군가가 관심이없는 경우가 있습니다. 기능의 결과. 이 경우 성과를 사용하십시오 성명.

공연쿼리
이것은 a를 실행합니다.select쿼리SPI 관리자결과를 버립니다. 식별자가 좋아요 로컬 변수는 여전히 매개 변수로 대체됩니다.
create_mv 수행
     SELECT SENTER SENCED_ID, PAGE_ID, COUNT (*) AS N_HITS,
              sum (dwell_time)은 dwell_time으로, count (dwell_time)를 dwell_count로 카운트합니다
     cs_fact_table에서
     session_id, page_id '')에 의해 그룹 그룹

24.2.5.3. 동적 쿼리 실행

종종 동적 쿼리를 생성하려고합니다 PL/PGSQL 기능 내부. 또는 기능이 있습니다 다른 기능을 생성합니다. PL/PGSQL은 실행을 제공합니다 이 경우에 대한 진술.

executeQuery-String
여기서Query-stringis 유형 문자열텍스트포함쿼리실행 될 예정입니다.

동적 쿼리로 작업 할 때는 직면해야합니다. pl/pgsql에서 단일 따옴표의 탈출. 참조하십시오 "Oracle PL/SQL의 포팅"장에서 제공됩니다 당신을 절약 할 수있는 자세한 설명을 위해 노력.

pl/pgsql의 다른 모든 쿼리와 달리,쿼리실행 명세서에 의해 실행됩니다 생애 동안 한 번만 준비하고 저장되지 않았습니다. 섬기는 사람. 대신,쿼리IS 진술이 실행될 때마다 준비됩니다. 그만큼Query-String동적으로 만들 수 있습니다 가변 테이블에서 작업을 수행하는 절차 내에서 그리고 들판.

Select Queries의 결과는 Execute에 의해 폐기됩니다. 그리고 Select Into는 현재 Execute 내에서 지원되지 않습니다. 따라서 결과를 추출하는 유일한 방법은 동적으로 생성 된 Select는 for ... Execute Form을 사용하는 것입니다. 나중에 설명.

예 :

execute ''update tbl set '' '
        || QUOTE_INDEN (FieldName)
        || ''= '' '
        || quote_literal (newValue)
        || '' 어디 ...'';

이 예제는 함수 사용을 보여줍니다QUOTE_INDEN(텍스트) 및quote_literal(텍스트). 필드 및 테이블을 포함하는 변수 식별자를 기능으로 전달해야합니다quote_ident (). 리터럴을 포함하는 변수 동적 쿼리 문자열의 요소를 전달해야합니다quote_literal (). 둘 다 단일로 동봉 된 입력 텍스트를 반환하기위한 적절한 단계 또는 이중 인용문 및 임베디드 스페셜 캐릭터.

동적 쿼리의 훨씬 더 큰 예가 있습니다. 실행하다:

함수 생성 CS_UPDATE_REFERRER_TYPE_PROC () 정수를 반환합니다.
선언하다
    참조 _keys 레코드;  - a에 사용할 일반 레코드를 선언하십시오.
    a_output varchar (4000);
시작하다 
    a_output : = ''기능 생성 CS_FIND_REFERRER_TYPE (Varchar, Varchar, Varchar) 
                  varchar를`` '' '로 반환합니다. 
                     선언하다 
                         $ 1의 V_host 별칭; 
                         V_Domain 별칭 $ 2; 
                         3 달러에 대한 v_url 별칭; '';; 

    - 
    - 루프 용 쿼리 결과를 스캔하는 방법에 주목하십시오.
    - for <crecor 구성을 사용합니다.
    -

    select * in select * from cs_referrer_keys writ_order loop의 referrer_keys 용.
        a_output : = a_output || ''v_ ''|| referrer_keys.kind || '' 좋다 '''''''''' 
                 || referrer_keys.key_string || `` '' '' '' '' ''그런 다음‘ '' '' ' 
                 || referrer_keys.referrer_type || '' '' '';; 끝 If; ''; 
    엔드 루프; 

    a_output : = a_output || ``return null; 끝; '' ''언어 '' 'PLPGSQL' '' ';' '; 

    - 변수를 대체하지 않기 때문에 작동합니다.
    - 그렇지 않으면 실패합니다. 기능을 실행하는 다른 방법으로 수행하십시오

    a_output를 실행하십시오. 
끝; 
'언어'plpgsql ';

24.2.5.4. 다른 사람을 얻습니다 결과 상태

진단 받기가변=항목[ , ... ]
이 명령은 시스템 상태 표시기를 검색 할 수 있습니다. 각항목는 키워드 식별입니다 지정된 변수에 할당 할 상태 값 ( 수신하기에 적합한 데이터 타입이어야합니다). 현재 사용 가능한 상태 항목은row_count, 마지막으로 처리 된 행 수SQL쿼리는로 전송됩니다.SQL엔진; 그리고result_oid, 가장 최근에 삽입 된 마지막 행의 OIDSQL쿼리. 참고result_oid삽입 후에 만 ​​유용합니다 질문.

24.2.5.5. a에서 돌아온다 기능

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

표현식 결과는 자동으로 캐스팅됩니다 할당에 대해 설명 된 기능의 반환 유형.

24.2.6. 제어 구조

제어 구조는 아마도 가장 유용 할 것입니다 (및 중요한) PL/SQL의 일부. PL/PGSQL의 제어 구조를 사용하여 조작 할 수 있습니다PostgreSQL매우 유연하고 강력한 방식으로 데이터.

24.2.6.1. 가정 어구 제어 : If 문자

if진술을하겠습니다 특정 조건에 따른 조치. PL/PGSQL에는 3 개가 있습니다 if : if-then, if-then-else, if-then-else if. 메모: 모든 pl/pgsql 진술에 해당하는 경우종료 if진술. else-if 진술에서 두 가지가 필요합니다 : 하나는 첫 번째 if와 두 번째 if (다른 하나는 하나입니다. 만약에).

if-then

if-then 문은 IF의 가장 간단한 형태입니다. 그때와 종료 사이의 진술은 실행되면 끝납니다. 조건이 참이면. 그렇지 않으면 진술 다음 종료 후 실행됩니다.

if v_user_id < 0입니다
    사용자 업데이트는 이메일 = v_email user_id = v_user_id를 설정합니다.
끝 If;
if-then-else

if-then-else 문은 If-then에 추가됩니다 실행 해야하는 진술을 지정합니다 조건은 거짓으로 평가됩니다.

Parentid가 null 또는 parentid = '' ''인 경우
그 다음에 
    풀 이름을 반환하십시오.
또 다른
    hp_true_filename (parentid) ||를 반환합니다 ''/''|| 풀 이름;
끝 IF;

v_count 0이면 
    user_count (count) 값 (v_count)에 삽입;
    `` 't' '를 반환합니다.
또 다른 
    `` 'f' ';
끝 If;

진술이 중첩 될 수 있고 다음에 중첩 될 수 있습니다 예:

if demo_row.sex = ''m ''라는 경우
  pretty_sex : = ''man '';
또 다른
  demo_row.sex = ''f ''라는 경우
    pretty_sex : = ''여자 '';
  끝 IF;
끝 If;
if-then-else if

"else if"문을 사용하면 당신은입니다 실제로 다른 내부에 if 문을 중첩합니다 성명. 따라서 각각에 대해 한쪽 끝 IF 문이 필요합니다 IF와 하나의 중첩 IF-ELSE를위한 중첩.

예 :

demo_row.sex = ''m ''이면
   pretty_sex : = ''man '';
그렇지 않으면 demo_row.sex = ''f ''라는 경우
        pretty_sex : = ''여자 '';
     끝 IF;
끝 If;

24.2.6.2. 반복 제어 : 루프, 그리고 나가는 동안

루프와 함께, 진술과 종료 할 수 있습니다. PL/PGSQL 프로그램 실행 흐름을 제어하십시오 반복적으로.

loop
[<< 레이블 ]
고리진술엔드 루프;
명시 적으로 종료 해야하는 무조건 루프 종료 성명서. 옵션 레이블은 출구에서 사용할 수 있습니다 어떤 레벨의 중첩을 지정하기위한 중첩 루프의 진술 종료됩니다.
출구
종료 [ 레이블 ] [언제표현 ];
NO레이블가 제공됩니다 가장 안쪽 루프가 종료되고 엔드 루프 다음으로 명세서가 종료됩니다. 다음에 실행됩니다. 만약에레이블is 주어진 것은 전류 또는 상위 레벨의 레이블이어야합니다. 중첩 루프 블록. 그런 다음 이름이 지정된 루프 또는 블록이 종료됩니다 루프/블록 이후의 명령문으로 제어가 계속됩니다 해당 끝.

예 :

루프
    - 일부 계산
    count 0이면
        출구;  - 종료 루프
    끝 IF;
엔드 루프;

고리
    - 일부 계산
    count 0 일 때 종료;
엔드 루프;

시작하다
    - 일부 계산
    주식이 100000이면
        출구;  -- 불법적인. 루프 외부에서 종료를 사용할 수 없습니다
    끝 IF;
끝;
while

while 문을 사용하면 a 평가의 순서 순서 조건 표현은 사실입니다.

[<< 레이블 ]
하는 동안표현loop진술엔드 루프;
예 :
while Voll_owed 0 및 Gift_certificate_balance 0 루프
    - 여기에 일부 계산
엔드 루프;

Boolean_expression 루프는 아닙니다
    - 여기에 일부 계산
엔드 루프;
for
[<< 레이블 ]
을 위한이름in [Reverse]표현 .. 표현루프진술엔드 루프;
다양한 정수 값을 반복하는 루프. 그만큼 변하기 쉬운이름자동으로입니다 타입 정수로 생성되며 루프 안에만 존재합니다. 둘 범위의 하부 및 상한을 제공하는 표현은 다음과 같습니다. 루프에 들어갈 때만 평가되었습니다. 반복 단계는 항상입니다 1.

for 루프의 일부 예 (참조섹션 24.2.7루프) :

I의 경우 1..10 루프
  - 여기에 일부 표현

    제기 통지 'I is %', i;
엔드 루프;

반전 1..10 루프
    - 여기에 일부 표현
엔드 루프;

24.2.7. 작업 기록

레코드는 RowTypes와 유사하지만 사전 정의되지 않았습니다. 구조. 그들은 선택 및 루프를 유지하는 데 사용됩니다. 선택 작업에서 실제 데이터베이스 행 하나.

24.2.7.1. 선언

유형 레코드의 하나의 변수는 다른 경우 사용할 수 있습니다. 선택. 레코드에 액세스하거나 할당하려는 시도 실제 행이 없을 때 레코드 필드에 대한 가치 런타임 오류가 발생합니다. 그들은 좋아한다고 선언 할 수 있습니다 이것:

이름레코드;

24.2.7.2. 과제

전체 선택을 레코드 또는 행에 할당 할 수 있습니다 :

대상 표현From ...;
대상레코드, 행이 될 수 있습니다 변수의 변수 또는 쉼표로 분리 된 변수 목록 레코드/행 필드. 이것은 상당히 다릅니다 Postgres의 선택에 대한 정상적인 해석, 즉 Target은 새로 생성 된 테이블입니다. (당신이 만들고 싶다면 a PL/PGSQL 함수 내부의 선택 결과에서 동등한 구문테이블을 선택하여.)

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

기록 또는 행이 레코드에 할당되면 변수, ""를 사용할 수 있습니다. (DOT) 필드에 액세스하기위한 표기법 그 기록에서 :

선언
    user_rec 레코드;
    full_name varchar;
시작하다
    user_id = 3 인 사용자에서 user_rec *로 선택하십시오.

  full_name : = user_rec.first_name || '' '' '|| users_rec.last_name;

found of type이라는 특수 변수가 있습니다.부울바로 다음에 사용할 수 있습니다 과제가 성공했는지 확인하려면 선택하십시오.

empname = myName;
찾을 수없는 경우
    ``Employee % found '', myName 예외를 높이십시오.
끝 If;
IS NULL (또는 ISNULL) 조건을 사용하여 테스트 할 수도 있습니다. 레코드/행의 무효. 선택이 여러 번 반환되는 경우 행, 첫 번째는 대상 필드로 이동됩니다. 다른 모든 것 조용히 폐기됩니다.
선언
    user_rec 레코드;
    full_name varchar;
시작하다
    user_id = 3 인 사용자에서 user_rec *로 선택하십시오.

    users_rec.homepage가 null이면
        - 사용자는 홈페이지를 입력하지 않고 "http : //"를 반환합니다.

        ``http : // '';
    끝 IF;
끝;

24.2.7.3. 반복 레코드를 통해

For Loop의 특수 유형을 사용하면 반복 할 수 있습니다. 쿼리의 결과와 그에 따라 해당 데이터를 조작합니다. 구문은 다음과 같습니다.

[37163_37186]
을 위한레코드 | 열inselect_clause루프진술엔드 루프;
레코드 또는 행에는 각각에 대해 조항과 루프 본체를 선택하십시오. 여기에 있습니다 예:
함수 만들기 cs_refresh_mviews () 정수를 반환합니다.
선언하다
     mviews 레코드;

     - 대신, 당신이했다면 :
     -MViews CS_MATERIALIZED_VIEWS%ROWTYPE;
     -이 레코드는 CS_Materialized_Views 테이블에 대해서만 사용할 수 있습니다.

시작하다
     cs_log ( ''상쾌한 구체화 된 뷰 ... '')를 수행합니다.

     SELECT *의 MVIEWS의 경우 CS_MATERIALIZED_VIEWS ORDER의 SORT_KEY LOOP 주문

         - 이제 "mviews"는 cs_materialized_views의 한 레코드를 가지고 있습니다

         cs_log ( ''Refreshing Inservized View ''|| mview.mv_name || ''... ')을 수행합니다.
         Truncate 테이블 mview.mv_name;
         mview.mv_name ||에 삽입하십시오 '' '' '|| mview.mv_query;
     엔드 루프;

     CS_LOG ( ''DONE RESHREATHING INSEVERIFED VIOGS. '');
     반환 1;
끝;
'언어'plpgsql ';
루프가 종료 문으로 종료되면 마지막 지정된 행은 루프 후에도 여전히 액세스 할 수 있습니다.

For-in Execute 진술은 반복하는 또 다른 방법입니다 오버 레코드 :

[<< 레이블 ]
을 위한레코드 | 열executetext_expressionloop진술엔드 루프;
이것은 소스 선택을 제외하고 이전 형식과 같습니다. 명령문은 문자열 표현식으로 지정되며 평가됩니다. FOR 루프에 대한 각 항목에서 다시 계획되었습니다. 이것은 허용합니다 미리 계획된 쿼리의 속도 또는 일반 실행과 마찬가지로 동적 쿼리의 유연성 성명.

24.2.8. 중단 및 메시지

Raine 문을 사용하여 메시지를Postgreselog 메커니즘.

Rain레벨'형식' [, 식별자[...]];
형식 내부,%후속 쉼표로 구분 된 식별자의 자리 표시 자. 가능한 레벨이 디버그됩니다 (생산에서 조용히 억제됩니다 데이터베이스 실행), 통지 (데이터베이스 로그에 작성 및 클라이언트 응용 프로그램으로 전달) 및 예외 (작성 데이터베이스 로그 및 트랜잭션 중단).
통지 ''ID 번호 ''|| 키 || ``찾을 수 없다! '';
통지를 통지하는 'CS_CREATE_JOB (%)' '', V_JOB_ID;
이 마지막 예에서 v_job_id는 %를 대체합니다. 끈.
예외를 높이기‘``redistent id- %'', user_id;
이것은 거래를 중단하고 데이터베이스에 쓸 것입니다. 통나무.

24.2.9. 예외

Postgresa 매우 현명한 예외 처리 모델. 파서가 될 때마다 플래너/최적화기 또는 집행자는 진술이 될 수 없다고 결정합니다 더 이상 처리되면 전체 거래가 중단됩니다 시스템이 기본 루프로 다시 뛰어 들어 다음 쿼리를 얻습니다. 클라이언트 응용 프로그램에서.

오류 메커니즘에 연결하여 눈에 띄는 것이 가능합니다. 이런 일이 일어납니다. 그러나 현재 무엇을 말하는 것은 불가능합니다 실제로 중단을 일으켰습니다 (입력/출력 변환 오류, 부동 소수점 오류, 구문 분석 오류). 그리고 가능합니다 데이터베이스 백엔드는이 시점에서 일관성없는 상태에 있습니다. 상위 집행자에게 반환하거나 더 많은 명령을 발행하면 전체 데이터베이스를 손상시킵니다. 그리고이 시점에서도 거래가 중단 된 정보는 이미 전송되었습니다 클라이언트 애플리케이션에 따라 작업을 재개하면 작동하지 않습니다. 모든 의미.

따라서 PL/PGSQL은 현재 유일하게하는 유일한 것입니다 함수 또는 트리거를 실행하는 동안 중단에 직면 절차는 몇 가지 추가 디버그 레벨 로그 메시지를 작성하는 것입니다. 어떤 기능과 장소에 대해 알려줍니다 (줄 번호 및 유형의 유형 성명서) 이런 일이 일어났습니다.