이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

24.2. 설명

24.2.1. PL/pgSQL의 구조

PL/pgSQL은블록 구조언어. 모든 키워드와 식별자는 혼합하여 사용할 수 있습니다. 대문자와 소문자. 블록은 다음과 같이 정의됩니다.

[<<라벨]
[선언선언]
시작하다문장END;

문에는 하위 블록이 얼마든지 있을 수 있습니다 블록의 섹션. 하위 블록을 사용하여 사설 토토 사이트를 숨길 수 있습니다. 명령문 블록 외부에서.

이전 선언 섹션에서 선언된 사설 토토 사이트 블록은 매번 기본값으로 초기화됩니다. 블록은 함수 호출당 한 번만 입력되는 것이 아닙니다. 을 위한 예:

함수 만들기 somefunc()는 정수를 '로 반환합니다.
선언하다
   수량 INTEGER := 30;
시작하다
   인상 공지 ''여기의 수량은 %'',수량입니다;  -- 여기의 수량은 30입니다.
   수량 := 50;
   --
   -- 하위 블록 생성
   --
   선언하다
      수량 INTEGER := 80;
   시작하다
      인상 공지 ''여기의 수량은 %'',수량입니다;  -- 여기의 수량은 80입니다.
   끝;

   인상 공지 ''여기의 수량은 %'',수량입니다;  -- 여기의 수량은 50입니다.
끝;
' 언어 'plpgsql';

BEGIN/END 사용을 혼동하지 않는 것이 중요합니다. 데이터베이스 명령을 사용하여 PL/pgSQL의 그룹화 문 거래 통제. PL/pgSQL의 BEGIN/END는 그룹화; 트랜잭션을 시작하거나 종료하지 않습니다. 기능과 트리거 프로시저는 항상 트랜잭션 내에서 실행됩니다. 외부 쿼리에 의해 설정됨 --- 시작하거나 커밋할 수 없습니다. 거래, 이후포스트그레스중첩된 트랜잭션이 없습니다.

24.2.2. 댓글

PL/pgSQL에는 두 가지 유형의 주석이 있습니다. 이중 대시--다음으로 확장되는 댓글을 시작합니다. 줄의 끝. 에이/*을 시작합니다 다음 발생으로 확장되는 블록 주석*/. 블록 주석은 중첩될 수 없지만 이중 주석입니다. 대시 주석은 블록 주석과 이중 주석으로 묶을 수 있습니다. 대시는 블록 주석 구분 기호를 숨길 수 있습니다./*그리고*/.

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

블록 또는 그 블록에 사용된 모든 사설 토토 사이트, 행 및 레코드 하위 블록은 선언 섹션에서 선언되어야 합니다. 차단하다. FOR 루프의 루프 사설 토토 사이트는 예외입니다. 정수 값 범위를 반복합니다.

PL/pgSQL 사설 토토 사이트는 다음과 같은 모든 SQL 데이터 유형을 가질 수 있습니다.INTEGER, VARCHAR그리고CHAR. 모든 사설 토토 사이트에는 기본값이 있습니다. 가치를 평가하다SQLNULL 값.

다음은 사설 토토 사이트 선언의 몇 가지 예입니다:

사용자 ID INTEGER;
수량 NUMBER(5);
URL VARCHAR;

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

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

이름 [상수] 유형 [NULL이 아님] [기본 | := ];

CONSTANT로 선언된 사설 토토 사이트의 값은 다음과 같을 수 없습니다. 변경되었습니다. NOT NULL이 지정되면 NULL이 할당됩니다. 값으로 인해 런타임 오류가 발생합니다. 기본값은 모든 사설 토토 사이트는SQLNULL 값이 있는 경우 NOT NULL로 선언된 모든 사설 토토 사이트에는 기본값이 지정되었습니다.

기본값은 함수가 실행될 때마다 평가됩니다. 라고 불리는. 그래서 '를 할당합니다지금' 에게 유형의 사설 토토 사이트타임스탬프이유는 실제 함수 호출 시간을 갖는 사설 토토 사이트가 아니라 함수가 바이트코드로 미리 컴파일되었을 때.

예:

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

24.2.3.2. 사설 토토 사이트 함수에 전달됨

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

함수 만들기 sales_tax(REAL) REAL AS '를 반환합니다.
선언하다
    $1에 대한 소계 별칭;
시작하다
    소계 * 0.06 반환;
끝;
' 언어 'plpgsql';

CREATE FUNCTION instr(VARCHAR,INTEGER)는 INTEGER를 '로 반환합니다.
선언하다
    v_string $1에 대한 별칭;
    $2에 대한 인덱스 별칭;
시작하다
    -- 여기에 몇 가지 계산이 있습니다.
끝;
' 언어 'plpgsql';

24.2.3.3. 속성

다음을 사용하여%TYPE그리고%ROWTYPE속성, 사설 토토 사이트를 선언할 수 있습니다. 다른 데이터베이스 항목과 동일한 데이터 유형 또는 구조를 사용하는 경우 (예: 테이블 필드).

%TYPE

%TYPE다음의 데이터 유형을 제공합니다. 사설 토토 사이트 또는 데이터베이스 열. 이를 사용하여 다음을 수행할 수 있습니다. 데이터베이스 값을 보유할 사설 토토 사이트를 선언합니다. 을 위한 예를 들어,라는 이름의 열이 있다고 가정해 보겠습니다.사용자_ID당신의사용자테이블. 동일한 데이터 유형을 가진 사설 토토 사이트를 선언하려면 귀하가 사용하는 사용자:

user_id users.user_id%TYPE;

사용하여%TYPE필요하지 않습니다 당신이 구조의 데이터 유형을 알고 참조하고 가장 중요한 것은 데이터 유형이 참조된 항목은 향후 변경될 예정입니다(예: user_id의 테이블 정의가 REAL이 됨) 함수 정의를 변경할 필요가 없습니다.

이름 테이블%ROWTYPE;

주어진 구조로 행을 선언합니다 테이블.테이블반드시 데이터베이스의 기존 테이블 또는 뷰 이름입니다. 필드 행의 점 표기법으로 액세스됩니다. 매개사설 토토 사이트 함수에 복합 유형이 될 수 있습니다(전체 테이블 행). 이 경우 해당 식별자 $n 행 유형이 되지만 다음을 사용하여 별칭을 지정해야 합니다. 위에서 설명한 ALIAS 명령입니다.

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

선언하다
    users_rec 사용자%ROWTYPE;
  user_id 사용자%TYPE;
시작하다
    user_id := users_rec.user_id;
    ...

함수 cs_refresh_one_mv(integer) 생성은 정수를 '로 반환합니다.
   선언하다
        $1의 주요 별칭;
        table_data cs_materialized_views%ROWTYPE;
   시작하다
        SELECT INTO table_data * FROM cs_materialized_views
               여기서 sort_key=key;

        발견되지 않은 경우
           예외 발생 ''보기'' || 키 || ''찾을 수 없습니다'';
           0을 반환합니다.
        종료하면;

        -- cs_materialized_views 상점 뷰의 mv_name 열
        -- 이름.

        TRUNCATE TABLE table_data.mv_name;
        table_data.mv_name에 삽입 || '' '' || table_data.mv_query;

        1을 반환합니다.
끝;
' 언어 'plpgsql';

24.2.3.4. 이름 바꾸기

RENAME을 사용하면 사설 토토 사이트 이름을 변경할 수 있습니다. 또는 행. 이는 NEW 또는 OLD를 참조해야 하는 경우 유용합니다. 트리거 프로시저 내의 다른 이름입니다.

구문 및 예:

RENAME이전 이름받는 사람새 이름;

ID를 user_id로 RENAME;
this_var의 이름을 that_var로 바꾸세요.

24.2.4. 표현식

PL/pgSQL 문에 사용된 모든 표현식이 처리됩니다. 백엔드의 실행자를 사용합니다. 에 나타나는 표현 상수를 포함하면 실제로 런타임 평가가 필요할 수 있습니다(예:'지금'에 대한타임스탬프유형) 따라서 불가능합니다. PL/pgSQL 파서가 아닌 실제 상수 값을 식별합니다. NULL 키워드. 모든 표현식은 내부적으로 다음과 같이 평가됩니다. 쿼리 실행 중

선택표현
다음을 사용하여SPI관리자. 에서 표현식에서 사설 토토 사이트 식별자의 발생은 다음으로 대체됩니다. 매개사설 토토 사이트와 사설 토토 사이트의 실제 값이 전달됩니다. 매개사설 토토 사이트 배열의 실행자. 에 사용되는 모든 표현 PL/pgSQL 함수는 한 번만 준비되고 저장됩니다. 유일한 이 규칙의 예외는 EXECUTE 문입니다. 쿼리는 발생할 때마다 필요합니다.

다음에 의해 수행된 유형 검사포스트그레스주 파서에는 몇 가지 부작용이 있습니다 상수 값의 해석. 자세하게는 이 두 함수가 수행하는 작업의 차이점은 다음과 같습니다.

CREATE FUNCTION logfunc1(텍스트) RETURNS 타임스탬프 AS '
    선언하다
        $1에 대한 logtxt 별칭;
    시작하다
        INSERT INTO 로그 테이블 VALUES(logtxt, ''now'');
        RETURN ''지금'';
    끝;
' 언어 'plpgsql';
그리고
CREATE FUNCTION logfunc2 (텍스트) RETURNS 타임스탬프 AS '
    선언하다
        $1에 대한 logtxt 별칭;
        curtime 타임스탬프;
    시작하다
        curtime := ''지금'';
        INSERT INTO 로그 테이블 VALUES(logtxt, curtime);
        복귀 시간;
    끝;
' 언어 'plpgsql';
다음의 경우logfunc1(), 그포스트그레주 파서는 언제인지 알고 있습니다. INSERT 계획을 준비하는 중입니다. 문자열은'지금'다음과 같이 해석되어야 합니다타임스탬프로그 테이블의 대상 필드가 다음과 같기 때문입니다. 그 유형. 따라서 이 시점에서 상수를 만들 것입니다. 이 상수 값은 다음의 모든 호출에 사용됩니다.logfunc1()수명 동안 백엔드. 말할 필요도 없이 이것은 프로그래머가 하는 일이 아닙니다. 원했습니다.

다음의 경우logfunc2(), 그포스트그레주 파서는 그렇지 않습니다 어떤 유형인지 알아요'지금'이 되어야 하며 따라서 다음과 같은 데이터 유형을 반환합니다.텍스트문자열 포함'지금'. 동안 지역 사설 토토 사이트 curtime에 대한 할당, PL/pgSQL 인터프리터는 다음을 호출하여 이 문자열을 타임스탬프 유형으로 변환합니다. 그만큼text_out()그리고timestamp_in()기능 변환.

이 유형 확인은 다음에 의해 수행됩니다.포스트그레주 파서가 다음 이후에 구현되었습니다. PL/pgSQL이 거의 완료되었습니다. 6.3과 차이가 있네요 6.4 및 준비된 계획 기능을 사용하는 모든 기능에 영향을 미칩니다 의SPI관리자. 로컬 사용 위의 방식으로 사설 토토 사이트를 사용하는 것이 현재 유일한 방법입니다. 해당 값을 올바르게 해석하려면 PL/pgSQL을 사용하세요.

레코드 필드가 표현식이나 명령문에 사용되는 경우, 필드의 데이터 유형은 하나의 호출과 호출 사이에 변경되어서는 안 됩니다. 같은 표현. 트리거 작성 시 이 점을 명심하세요. 둘 이상의 테이블에 대한 이벤트를 처리하는 프로시저입니다.

24.2.5. 진술

PL/pgSQL 파서가 지정된 대로 이해하지 못하는 모든 것 아래는 쿼리에 들어가 데이터베이스로 전송됩니다. 실행하는 엔진. 결과 쿼리는 어떤 것도 반환해서는 안 됩니다. 데이터.

24.2.5.1. 과제

사설 토토 사이트 또는 행/레코드 필드에 값 할당 다음과 같이 작성됩니다:

식별자 := 표현;
식 결과 데이터 유형이 일치하지 않는 경우 사설 토토 사이트 데이터 유형이거나 사설 토토 사이트의 크기/정밀도가 다음과 같습니다. 알려진문자(20)), 결과 값 PL/pgSQL 바이트코드 인터프리터에 의해 암시적으로 캐스팅됩니다. 결과 유형 출력 및 사설 토토 사이트 유형 사용 입력 기능. 이로 인해 잠재적으로 런타임이 발생할 수 있습니다. 유형 입력 함수에 의해 생성된 오류입니다.
사용자_ID := 20;
세금 := 소계 * 0.06;

24.2.5.2. 부름 다른 기능

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

그러나 누군가가 관심을 갖지 않는 경우가 있습니다. 함수의 결과. 이러한 경우에는 PERFORM을 사용하십시오. 성명.

수행질의
이것은 다음을 실행합니다선택질의위에SPI 관리자그리고 결과를 삭제합니다. 다음과 같은 식별자 지역 사설 토토 사이트는 여전히 매개사설 토토 사이트로 대체됩니다.
PERFORM create_mv(''cs_session_page_requests_mv'',''
     session_id, page_id, count(*)를 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은 EXECUTE를 제공합니다. 이러한 경우에 대한 성명입니다.

실행쿼리-문자열
어디에서쿼리-문자열은 유형의 문자열텍스트포함질의처형될 예정입니다.

동적 쿼리로 작업할 때 직면해야 할 문제 PL/pgSQL에서 작은따옴표를 이스케이프합니다. 다음을 참조하세요. "Oracle PL/SQL에서 포팅" 장에서 테이블을 볼 수 있습니다. 당신을 절약할 자세한 설명을 위해 노력.

PL/pgSQL의 다른 모든 쿼리와 달리 a질의21993_22116질의이다 명령문이 실행될 때마다 준비됩니다. 그만큼쿼리-문자열동적으로 생성될 수 있습니다. 사설 토토 사이트 테이블에 대한 작업을 수행하는 프로시저 내 및 필드.

SELECT 쿼리의 결과는 EXECUTE에 의해 폐기됩니다. SELECT INTO는 현재 EXECUTE 내에서 지원되지 않습니다. 따라서 결과를 추출하는 유일한 방법은 동적으로 생성된 SELECT는 FOR ... EXECUTE 형식을 사용하는 것입니다. 나중에 설명하겠습니다.

예:

''UPDATE tbl SET'' 실행
        || quote_ident(필드명)
        || '' = ''
        || quote_literal(새 값)
        || '' 어디 ...'';

이 예는 함수의 사용을 보여줍니다.quote_ident(텍스트) 및quote_literal(텍스트). 필드와 테이블을 포함하는 사설 토토 사이트 식별자는 함수에 전달되어야 합니다.quote_ident(). 리터럴을 포함하는 사설 토토 사이트 동적 쿼리 문자열의 요소는 다음으로 전달되어야 합니다.quote_literal(). 둘 다 단일로 묶인 입력 텍스트를 반환하는 적절한 단계 또는 큰따옴표 및 특수 문자가 포함된 경우 문자.

다음은 동적 쿼리의 훨씬 더 큰 예이며 실행하다:

함수 생성 cs_update_referrer_type_proc()는 정수를 '로 반환합니다.
선언하다
    Referrer_keys 기록;  -- FOR에 사용할 일반 레코드를 선언합니다.
    a_output varchar(4000);
시작하다 
    a_output := ''함수 생성 cs_find_referrer_type(varchar,varchar,varchar) 
                  varchar AS ''''를 반환합니다. 
                     선언하다 
                         $1에 대한 v_host 별칭; 
                         $2에 대한 v_domain 별칭; 
                         $3에 대한 v_url 별칭; ''; 

    -- 
    -- FOR 루프에서 쿼리 결과를 검색하는 방법에 주목하세요.
    -- FOR <record 구문을 사용합니다.
    --

    FOR Referrer_keys IN 선택 * cs_referrer_keys 순서 by try_order LOOP
        a_output := a_output || '' v_''인 경우 || Referrer_keys.kind || '' 좋다 '''''''''' 
                 || Referrer_keys.key_string || '''''''''' 그런 다음 ''''''를 반환합니다. 
                 || referrer_keys.referrer_type || ''''''; 종료하면;''; 
    엔드 루프; 

    a_output := a_output || '' null을 반환합니다. 끝; '''' 언어 ''''plpgsql'''';''; 

    -- 사설 토토 사이트를 대체하지 않기 때문에 작동합니다.
    -- 그렇지 않으면 실패할 것입니다. 함수를 실행하는 다른 방법은 PERFORM을 참조하세요.

    a_output을 실행합니다. 
끝; 
' 언어 'plpgsql';

24.2.5.4. 기타 획득 결과 상태

진단 받기사설 토토 사이트 = 항목 [ , ... ]
이 명령을 사용하면 시스템 상태 표시기를 검색할 수 있습니다. 각항목식별 키워드입니다 지정된 사설 토토 사이트에 할당될 상태 값(이것은 수신할 수 있는 올바른 데이터 유형이어야 합니다.) 현재 사용 가능한 상태 항목은 다음과 같습니다.ROW_COUNT, 마지막으로 처리된 행 수SQL쿼리가 다음으로 전송되었습니다.SQL엔진; 그리고RESULT_OID, 가장 최근에 삽입된 마지막 행의 OidSQL질의. 참고하세요RESULT_OIDINSERT 이후에만 유용합니다. 질문.

24.2.5.5. 에서 돌아오는 중 기능

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

표현식 결과는 자동으로 다음으로 변환됩니다. 할당에 대해 설명한 함수의 반환 유형입니다.

24.2.6. 제어 구조

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

24.2.6.1. 가정 어구 제어: IF 문

IF문을 사용하면 특정 조건에 따라 행동합니다. PL/pgSQL에는 세 가지가 있습니다. IF의 형태: IF-THEN, IF-THEN-ELSE, IF-THEN-ELSE IF. 메모: 모든 PL/pgSQL IF 문에는 해당가 필요합니다.END IF문장. ELSE-IF 문에서는 두 개가 필요합니다: 첫 번째 IF에 하나, 두 번째 IF에 하나(ELSE 만약에).

IF-THEN

IF-THEN 문은 IF의 가장 간단한 형태입니다. THEN과 END IF 사이의 명령문이 실행됩니다. 조건이 참이라면. 그렇지 않으면 진술은 다음 END IF가 실행됩니다.

IF v_user_id < 0 THEN
    사용자 업데이트 SET email = v_email WHERE user_id = v_user_id;
종료하면;
IF-THEN-ELSE

IF-THEN-ELSE 문은 다음과 같이 IF-THEN에 추가됩니다. 다음과 같은 경우에 실행되어야 하는 명령문을 지정합니다. 조건은 FALSE로 평가됩니다.

부모 ID가 NULL이거나 부모 ID = ''''인 경우
그 다음에 
    전체 이름을 반환합니다.
또 다른
    return hp_true_filename(parentid) || ''/'' || 성명;
종료하면;

IF v_count  0 그러면 
    INSERT INTO users_count(count) VALUES(v_count);
    ''t''를 반환합니다;
또 다른 
    ''f''를 반환합니다;
종료하면;

IF 문은 중첩될 수 있으며 다음과 같습니다. 예:

IF deco_row.sex = ''m'' THEN
  Pretty_sex := ''남자'';
또 다른
  IF deco_row.sex = ''f'' 그러면
    Pretty_sex := ''여자'';
  종료하면;
종료하면;
IF-THEN-ELSE IF

"ELSE IF" 문을 사용하면, 실제로 ELSE 내에 IF 문을 중첩합니다. 성명. 따라서 각각에 대해 하나의 END IF 문이 필요합니다. 중첩된 IF와 상위 IF-ELSE에 대한 것입니다.

예:

IF deco_row.sex = ''m'' THEN
   Pretty_sex := ''남자'';
ELSE IF deco_row.sex = ''f'' THEN
        Pretty_sex := ''여자'';
     종료하면;
종료하면;

24.2.6.2. 반복 제어: LOOP, WHILE, FOR 및 EXIT

LOOP, WHILE, FOR 및 EXIT 문을 사용하면 다음을 수행할 수 있습니다. PL/pgSQL 프로그램 실행 흐름 제어 반복적으로.

루프
[<<라벨]
고리문장END LOOP;
다음에 의해 명시적으로 종료되어야 하는 무조건 루프입니다. EXIT 문. 선택적 라벨은 EXIT에서 사용할 수 있습니다. 중첩 루프의 명령문을 사용하여 중첩 수준을 지정해야 합니다. 종료됩니다.
종료
종료 [ 라벨 ] [언제표현 ];
아니면라벨주어지면 가장 안쪽 루프가 종료되고 END LOOP 다음 명령문이 실행됩니다. 다음에 실행됩니다. 만약에라벨이다 주어진 경우 현재 또는 상위 수준의 레이블이어야 합니다. 중첩된 루프 블록. 그런 다음 명명된 루프나 블록이 종료되고 루프/블록 이후의 명령문으로 제어가 계속됩니다. 해당 END.

예:

루프
    -- 일부 계산
    IF 개수  0 그러면
        출구;  -- 루프 종료
    종료하면;
엔드 루프;

고리
    -- 일부 계산
    개수  0일 때 종료합니다.
엔드 루프;

시작하다
    -- 일부 계산
    IF 주식  100000 THEN
        출구;  -- 불법적인. LOOP 외부에서는 EXIT를 사용할 수 없습니다.
    종료하면;
끝;
동안

WHILE 문을 사용하면 다음을 반복할 수 있습니다. 평가가 진행되는 한 일련의 진술 조건식이 참입니다.

[<<라벨]
하는 동안표현루프문장END LOOP;
예:
채무 금액  0 AND 선물_증명서_잔고  0 LOOP인 동안
    -- 여기에 몇 가지 계산이 있습니다.
엔드 루프;

boolean_expression LOOP가 아닌 동안
    -- 여기에 몇 가지 계산이 있습니다.
끝 루프;
for
[<<라벨]
을 위한이름IN [반전] 표현 .. 표현루프문장END LOOP;
정수 값 범위를 반복하는 루프입니다. 그만큼 변하기 쉬운이름자동으로 정수 유형으로 생성되며 루프 내부에만 존재합니다. 둘 범위의 하한과 상한을 제공하는 표현식은 다음과 같습니다. 루프에 들어갈 때만 평가됩니다. 반복 단계는 항상 1.

FOR 루프의 몇 가지 예(참조섹션 24.2.7FOR의 레코드 반복용 루프):

i IN 1..10 루프용
  -- 여기에 몇 가지 표현이 있습니다.

    인상 알림 'i는 %',i;
엔드 루프;

역방향 1..10 루프의 i용
    -- 여기에 몇 가지 표현이 있습니다.
끝 루프;

24.2.7. 함께 일하기 기록

레코드는 행 유형과 유사하지만 사전 정의된 항목이 없습니다. 구조. 선택 및 FOR 루프에 사용됩니다. SELECT 작업의 실제 데이터베이스 행 하나.

24.2.7.1. 선언

RECORD 유형의 사설 토토 사이트 하나는 다른 용도로 사용될 수 있습니다. 선택. 기록에 접근하거나 할당을 시도하는 것 실제 행이 없을 때 레코드 필드에 대한 값 런타임 오류가 발생합니다. 다음과 같이 선언할 수 있습니다. 이것:

이름기록;

24.2.7.2. 과제

완전한 선택을 레코드나 행에 할당 다음 방법으로 수행할 수 있습니다:

선택대상 표현발신 ...;
대상레코드, 행일 수 있음 사설 토토 사이트 또는 쉼표로 구분된 사설 토토 사이트 목록 및 레코드/행 필드. 참고로 이거랑은 많이 다름 SELECT INTO에 대한 Postgres의 일반적인 해석은 다음과 같습니다. INTO 대상은 새로 생성된 테이블입니다. (만들고 싶다면 PL/pgSQL 함수 내 SELECT 결과의 테이블을 사용하려면 동등한 구문선택으로 테이블 생성.)

행 또는 사설 토토 사이트 목록이 대상으로 사용되는 경우, 선택한 값은 구조와 정확히 일치해야 합니다. 대상 또는 런타임 오류가 발생합니다. FROM 키워드는 다음과 같습니다. 그 뒤에는 유효한 자격, 그룹화, 정렬 등이 옵니다. SELECT 문에 제공될 수 있습니다.

레코드 또는 행이 RECORD에 할당되면 사설 토토 사이트에는 "."을 사용할 수 있습니다. 필드에 액세스하기 위한 (점) 표기법 해당 기록에서:

선언하다
    users_rec 기록;
    전체 이름 varchar;
시작하다
    SELECT INTO users_rec * FROM 사용자 WHERE user_id=3;

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

FOUND 유형의 특수 사설 토토 사이트가 있습니다.부울다음에 즉시 사용할 수 있습니다. 과제가 성공했는지 확인하려면 INTO를 선택하세요.

SELECT INTO myrec * FROM EMP WHERE empname = myname;
발견되지 않은 경우
    RAISE EXEPTION ''직원 %를 찾을 수 없습니다'', myname;
종료하면;
또한 IS NULL(또는 ISNULL) 조건을 사용하여 테스트할 수 있습니다 RECORD/ROW의 NULL성에 대한 것입니다. 선택 항목이 여러 개를 반환하는 경우 행의 경우 첫 번째 항목만 대상 필드로 이동됩니다. 기타 모든 자동으로 삭제됩니다.
선언하다
    users_rec 기록;
    전체 이름 varchar;
시작하다
    SELECT INTO users_rec * FROM 사용자 WHERE user_id=3;

    users_rec.homepage가 NULL인 경우
        -- 사용자가 홈페이지를 입력하지 않은 경우 "http://"를 반환합니다.

        ''http://''를 반환합니다.
    종료하면;
끝;

24.2.7.3. 반복 기록을 통해

특수한 유형의 FOR 루프를 사용하여 다음을 반복할 수 있습니다. 쿼리 결과를 확인하고 이에 따라 해당 데이터를 조작합니다. 구문은 다음과 같습니다:

[<<라벨]
을 위한기록 | 열INselect_clause루프문장END LOOP;
레코드 또는 행은 다음의 결과로 발생한 모든 행에 할당됩니다. select 절과 루프 본문이 각각 실행됩니다. 여기는 예:
생성 함수 cs_refresh_mviews()는 정수를 '로 반환합니다.
선언하다
     mviews 기록;

     -- 대신 다음과 같이 했다면:
     -- mviews cs_materialized_views%ROWTYPE;
     -- 이 레코드는 cs_materialized_views 테이블에만 사용할 수 있습니다.

시작하다
     PERFORM cs_log(''구체화된 뷰를 새로 고치는 중...'');

     FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP

         -- 이제 "mviews"에는 cs_materialized_views의 레코드가 하나 있습니다.

         PERFORM cs_log(''구체화된 뷰 새로 고침 '' || mview.mv_name || ''...'');
         TRUNCATE TABLE mview.mv_name;
         mview.mv_name에 삽입 || '' '' || mview.mv_query;
     엔드 루프;

     PERFORM cs_log(''구체화된 뷰 새로 고침이 완료되었습니다.'');
     1을 반환합니다.
끝;
' 언어 'plpgsql';
루프가 EXIT 문으로 종료되면 마지막 루프 후에도 할당된 행에 계속 액세스할 수 있습니다.

FOR-IN EXECUTE 문은 반복하는 또 다른 방법입니다. 기록 초과:

[<<라벨]
을 위한기록 | 열실행 중텍스트 표현루프문장END LOOP;
이것은 소스 SELECT를 제외하고 이전 형식과 같습니다. 명령문은 평가되는 문자열 표현식으로 지정됩니다. FOR 루프의 각 항목에 대해 다시 계획됩니다. 이를 통해 프로그래머는 미리 계획된 쿼리의 속도를 선택하거나 일반 EXECUTE와 마찬가지로 동적 쿼리의 유연성 성명.

24.2.8. 중단하는 중 및 메시지

RAISE 문을 사용하여 메시지를 던져보세요.포스트그레스elog 메커니즘.

상승레벨 '형식' [, 식별자 [...]];
형식 내부에서,%은 다음과 같이 사용됩니다. 후속 쉼표로 구분된 식별자에 대한 자리 표시자입니다. 가능한 수준은 DEBUG(프로덕션에서는 자동으로 억제됨)입니다. 실행 중인 데이터베이스), NOTICE(데이터베이스 로그에 기록되고 클라이언트 애플리케이션으로 전달됨) 및 EXCEPTION(다음에 기록됨) 데이터베이스 로그를 삭제하고 트랜잭션을 중단합니다.
RAISE NOTICE ''ID 번호 '' || 키 || '' 찾을 수 없습니다!'';
알림 올리기 ''cs_create_job(%) 호출 중'',v_job_id;
이 마지막 예에서 v_job_id는 끈.
예외 발생 ''존재하지 않는 ID -- %'',user_id;
이렇게 하면 트랜잭션이 중단되고 데이터베이스에 기록됩니다 통나무.

24.2.9. 예외

포스트그레이 없습니다 매우 똑똑한 예외 처리 모델. 파서가 실행될 때마다, 플래너/옵티마이저 또는 실행자는 명령문이 다음과 같이 결정될 수 없다고 결정합니다. 더 이상 처리되지 않으면 전체 거래가 중단되고 시스템은 다음 쿼리를 얻기 위해 메인 루프로 다시 점프합니다. 클라이언트 애플리케이션에서.

오류 메커니즘에 연결하여 알 수 있습니다. 이런 일이 일어난다는 것. 하지만 현재로서는 무엇인지 알 수 없습니다. 실제로 중단이 발생했습니다(입력/출력 변환 오류, 부동 소수점 오류, 구문 분석 오류). 그리고 다음이 가능합니다. 현재 데이터베이스 백엔드는 일관성이 없는 상태이므로 상위 실행기로 돌아가거나 추가 명령을 실행하면 전체 데이터베이스를 손상시킵니다. 그리고 설령 이 시점에서 거래가 중단되었다는 정보가 이미 전송되었습니다. 클라이언트 애플리케이션에 연결되므로 작업을 재개해도 어떤 의미라도.

따라서 PL/pgSQL이 현재 수행하는 유일한 작업은 함수 또는 트리거 실행 중에 중단이 발생했습니다. 절차는 추가 DEBUG 수준 로그 메시지를 작성하는 것입니다. 어떤 기능이 어디에 있는지 알려주는 것(줄 번호와 유형) 진술) 이런 일이 일어났습니다.