>48_word_end< | >50_word_end<
<>790_word_end <>682_word_end
<>682_word_end
790_word_end

>150_word_end<#

>202_word_end<>159_word_end<>204_word_end<PL/PG>161_word_end<>206_word_end<Postgre>161_word_end<>208_word_end<

>214_word_end<#

>220_word_end<>221_word_end<>222_word_end<>1108_word_end< >166_word_end<.

>230_word_end< >221_word_end< #

>221_word_end<>239_word_end<;

>221_word_end<>239_word_end<식과 함께 함수를 종료하고 값을 >1108_word_end<합니다>239_word_end<>245_word_end<>159_word_end<>247_word_end<

스칼라 유형을 >1108_word_end<하는 함수에서 >239_word_end<식 결과는 할당에 대해 >1110_word_end< 된대로 기능의 >1108_word_end< 유형으로 자동으로 표시됩니다. 그러나 합성 (행) 값을 >1108_word_end<하려면 요청 된 열 세트를 정확히 전달하는 >239_word_end<식을 작성해야합니다. 이것은 명시적인 캐스팅을 >297_word_end<해야 할 수 있습니다.

>251_word_end<>221_word_end<>239_word_end<이없는. 출력 매개 변수의 >71_word_end< 값이 >1108_word_end<됩니다.

>255_word_end<>256_word_end<>257_word_end<>221_word_end<명령문은 기능을 조기에 종료하는 데 >297_word_end<될 수 있습니다. 그러나 >166_word_end< >239_word_end<을 작성하지 마십시오>221_word_end<.

>263_word_end<>221_word_end<>265_word_end<>256_word_end<>267_word_end<>221_word_end<>269_word_end<

>271_word_end<

- 스칼라 유형을 >1108_word_end<하는 기능
>1108_word_end< 1 + 2;
>1108_word_end< scalar_var;

- 복합 유형을 >1108_word_end<하는 기능
>221_word_end< composite_type_var;
>221_word_end< (1, 2, 'Three':: 텍스트);  - 유형을 수정하기 위해 열을 캐스트해야합니다

>280_word_end< >166_word_end< >1108_word_end<>222_word_end<>221_word_end< query #

>166_word_end< >1108_word_end<>239_word_end<>292_word_end<>293_word_end<>292_word_end< >348_word_end<Comm>222_word_end<-str>682_word_end[>297_word_end<>239_word_end<[>300_word_end< ]>302_word_end<

>304_word_end<>159_word_end<>306_word_end<>307_word_end<>308_word_end<>309_word_end<>166_word_end< >1108_word_end<>311_word_end<>221_word_end< query>313_word_end<>221_word_end<인수가없는 명령은 함수가 실행 된 것을 나타내는 데 >297_word_end<됩니다.>166_word_end< >1108_word_end<스칼라 및 복합 데이터 유형 모두에서 >297_word_end<할 수 있습니다. 복합 결과 유형을 >297_word_end<하여 전체>319_word_end<>321_word_end<>221_word_end< query함수의 결과 세트에 >293_word_end<를 실행 한 결과를 추가합니다.>1108_word_end< >166_word_end<>222_word_end<>221_word_end< query>327_word_end<

>166_word_end< >1108_word_end<>222_word_end<>221_word_end< query실제로 함수에서 돌아 오지 마십시오. 단순히 함수의 결과 세트에 0 이상을 추가합니다. 그런 >166_word_end< 실행은의 >166_word_end< >510_word_end<로 >786_word_end<됩니다.>159_word_end<>334_word_end<>166_word_end< >1108_word_end<>311_word_end<>221_word_end< query>338_word_end<>221_word_end<, 인수가 없어야하는 것은 제어가 함수를 종료하도록 유발합니다 (>311_word_end< 제어가 함수의 끝에 도달하게 할 수 있습니다)>1001_word_end<

>221_word_end< query>343_word_end<>221_word_end< query >348_word_end<는 동적으로 실행될 >293_word_end<를 지정합니다. 매개 변수 >239_word_end<식은를 통해 계산 된 >293_word_end< 문자열에 >1100_word_end< 할 수 있습니다.>297_word_end<,>348_word_end<>349_word_end<

>351_word_end<>166_word_end< >1108_word_end<>239_word_end<이없는. 각 실행에서 출력 매개 변수 변수의 >71_word_end< 값은 결과 행으로 최종 >1108_word_end<을 위해 저장됩니다. 기능을 >1108_word_end<으로 >1256_word_end<해야합니다>354_word_end<여러 출력 매개 변수가있을 때 >311_word_end<>307_word_end<>357_word_end<>358_word_end<>308_word_end<>360_word_end<

여기를 >297_word_end<하는 함수의 예는 >166_word_end<과 같습니다.>166_word_end< >1108_word_end<:

>319_word_end< foo (FOOD >682_word_end682_word_end1100_word_end<;
foo 값 (4, 5, 'Six')에 >1100_word_end<;

함수를 만들거나 바꾸십시오 get_all_foo () foo setsof foo as를 >1108_word_end<합니다
$ body $
>1256_word_end<하다
    r foo%rowtype;
>878_word_end<하다
    r >682_word_end<을 위해
        foo fool where food 0을 선택하십시오
    고리
        - 여기에서 약간의 처리를 할 수 있습니다
        >166_word_end< r >1108_word_end<; - >71_word_end< 선택의 >71_word_end< 행을 >1108_word_end<합니다
    엔드 >782_word_end<;
    반품;
끝;
$ body $
언어 plpgsql;

get_all_foo ();에서 *를 선택하십시오.

여기를 >297_word_end<하는 함수의 예는입니다.>221_word_end< query:

함수 생성 get_available_flightid (날짜) >1020_word_end<를 설정합니다
$ body $
>878_word_end<하다
    >293_word_end<를 >1108_word_end<합니다
                   비행에서
                  여기서 FlightDate = $ 1
                    및 FlightDate <($ 1 + 1);

    - 실행이 완료되지 않았으므로 행이 >1108_word_end<되었는지 확인할 수 있습니다.
    - 그렇지 않으면 >1246_word_end<를 제기하십시오.
    찾을 수없는 경우
        >1246_word_end<를 제기 ' %에서 비행 >1201_word_end<', $ 1;
    끝 IF;

    반품;
 끝;
$ body $
언어 plpgsql;

- >297_word_end< 가능한 항공편을 >1108_word_end<하거나 >1246_word_end<가없는 경우
- >297_word_end< 가능한 항공편.
선택 *에서 get_available_flightid (current_date);에서 선택하십시오.

>375_word_end<

>71_word_end<의 구현>166_word_end< >1108_word_end<>222_word_end<>221_word_end< query>381_word_end<>159_word_end<>383_word_end<>159_word_end<>297_word_end<자는이 제한이없는 설정 회복 기능을 정의 할 수 있습니다. >71_word_end< 데이터가 디스크에 기록되기 >878_word_end<하는 지점은에 의해 제어됩니다.>386_word_end<>387_word_end<

>396_word_end<#

>402_word_end<>221_word_end<>510_word_end<. a를 >297_word_end<하려면>221_word_end<>406_word_end<>221_word_end<>239_word_end<이없는 것.

>410_word_end<

>417_word_end<#

aPL/PG>161_word_end<함수, 절차 >311_word_end<>426_word_end<블록을 >297_word_end<하여 절차를 호출 할 수 있습니다>428_word_end<>429_word_end<일반 >161_word_end<로 작동합니다. 각>432_word_end<>311_word_end<>682_word_end<>432_word_end<>435_word_end<>437_word_end<

절차 생성 트리플 (>682_word_end<>432_word_end< x >682_word_end878_word_end<하다
    x : = x * 3;
끝;
$$;

$$
myvar >682_word_end878_word_end<하다
  Triple (Myvar)에 전화;
  'myvar = %', myvar;  - 인쇄 15
끝;
$$;

출력 매개 변수에 해당하는 변수는 간단한 변수 >311_word_end< 복합 유형 변수의 필드 일 수 있습니다. >71_word_end< 배열의 요소가 될 수 없습니다.

>448_word_end<#

>454_word_end<>222_word_end<>456_word_end<>457_word_end<>159_word_end<>459_word_end<>454_word_end<:

  • >454_word_end< >585_word_end< 그런 >166_word_end< >585_word_end< end >454_word_end<

  • >454_word_end< >585_word_end< >509_word_end585_word_end< >543_word_end< >585_word_end< end >454_word_end<

  • >454_word_end< >585_word_end< 그런 >166_word_end< >585_word_end< Els>454_word_end< >585_word_end< 그런 >166_word_end< >585_word_end< End If

>479_word_end<>456_word_end<:

  • >456_word_end< >585_word_end< WHEN >585_word_end< WAND >585_word_end< ELSE >585_word_end< >863_word_end< >456_word_end<

  • >456_word_end< WHEN >585_word_end< THEN >585_word_end< ELSE >585_word_end< >863_word_end< >456_word_end<

>499_word_end< >454_word_end<->509_word_end #

>454_word_end<부울->239_word_end<>509_word_end<>510_word_end<>511_word_end<

>454_word_end<->509_word_end>510_word_end<은 가장 >676_word_end<입니다.>454_word_end<. 사이의 >510_word_end<>509_word_end<>222_word_end<종료 >454_word_end<>520_word_end<

>522_word_end<

>454_word_end< v_user_id < 0이면
    >297_word_end<자 >1102_word_end<는 이메일 = v_email user_id = v_user_id를 설정합니다.
끝 If;

>531_word_end< >454_word_end<->509_word_end543_word_end< #

>454_word_end<부울->239_word_end<>509_word_end<>510_word_end<>543_word_end<>510_word_end<>511_word_end<

>454_word_end<->509_word_end543_word_end<>510_word_end<이 추가>454_word_end<->509_word_end>550_word_end<

>522_word_end<

Parentid가 null >311_word_end< parentid = ''인 경우 = ''
그 >166_word_end<에
    풀 >996_word_end<을 >1108_word_end<하십시오.
또 다른
    hp_true_filename (parentid) ||를 >1108_word_end<합니다 '/'|| 풀 >996_word_end<;
끝 If;
>454_word_end< v_count 0이면
    user_count (count) 값 (v_count)에 >1100_word_end<;
    >1108_word_end< 't';
또 다른
    >1108_word_end< 'f';
끝 If;

>563_word_end< >454_word_end<->509_word_end454_word_end< #

>454_word_end<부울->239_word_end<>509_word_end<>510_word_end<[els>454_word_end<부울->239_word_end<>509_word_end<>510_word_end<[els>454_word_end<부울->239_word_end<>509_word_end<>510_word_end<
    >585_word_end<
]>587_word_end<>543_word_end<>510_word_end< >591_word_end<

>593_word_end<>454_word_end<->509_word_end454_word_end<>595_word_end<>454_word_end<>601_word_end< 참된 첫 번째 >1262_word_end<이 발견 될 때까지 연속적으로 테스트됩니다. 그런 >166_word_end< 관련 >510_word_end<이 실행되고 그 후 컨트롤이 >166_word_end< 문으로 전달됩니다.종료 >454_word_end<>599_word_end<>454_word_end<>601_word_end<>602_word_end<>603_word_end<>454_word_end<>601_word_end< 사실입니다.>543_word_end<>607_word_end<

예는 >166_word_end<과 같습니다.

>454_word_end< number = 0이면
    결과 : = 'Zero';
Els>454_word_end< >1189_word_end< 0
    결과 : = '긍정적';
Els>454_word_end< >1189_word_end< <0
    결과 : = '부정';
또 다른
    - 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다.
    결과 : = 'null';
끝 If;

>613_word_end<els>454_word_end<>615_word_end<>543_word_end<>454_word_end<.

>619_word_end<>454_word_end<->509_word_end543_word_end<>166_word_end< 예와 같이 >510_word_end< :

>623_word_end<

>625_word_end<종료 >454_word_end<>627_word_end<>454_word_end<, >297_word_end<하는 것보다 훨씬 번거 롭습니다els>454_word_end<>631_word_end<

>638_word_end<>456_word_end< #

>456_word_end<>647_word_end<>304_word_end<>239_word_end<[, >239_word_end<[ >585_word_end< ]] 그런 >166_word_end<>510_word_end<[>304_word_end<>239_word_end<[, >239_word_end<[ >585_word_end< ]] 그런 >166_word_end<>510_word_end<
    >585_word_end< >670_word_end<>543_word_end<>510_word_end< >674_word_end<

>676_word_end<>456_word_end<>678_word_end<>647_word_end<>680_word_end<>239_word_end<>682_word_end<>683_word_end<>684_word_end<>510_word_end<실행 된 >166_word_end< >166_word_end< 명령문으로 제어가 통제됩니다.>687_word_end<>688_word_end<>304_word_end<>239_word_end<이 평가되지 않습니다.) 일치가 없으면>543_word_end< >510_word_end<실행됩니다. 하지만 >454_word_end<>543_word_end<>696_word_end<case_>602_word_end<_found>698_word_end<

>700_word_end<

케이스 x
    그때 1, 2
        msg : = '하나 >311_word_end< 둘';
    또 다른
        MSG : = '하나 >311_word_end< 두 이외의 기타 값';
>687_word_end<;

>709_word_end<>456_word_end< #

케이스
    >304_word_end<부울->239_word_end<>509_word_end<>510_word_end<[>304_word_end<부울->239_word_end<>509_word_end<>510_word_end<
    >585_word_end< >670_word_end<>543_word_end<>510_word_end< >674_word_end<

>733_word_end<>456_word_end<부울 >239_word_end<의 진실을 기반으로 >1262_word_end<부 실행을 제공합니다. >627_word_end<>304_word_end<부울->239_word_end<>739_word_end<>740_word_end<>741_word_end<>510_word_end<실행 된 >166_word_end< 컨트롤이 >166_word_end< 명령문으로 전달됩니다>687_word_end<>688_word_end<>304_word_end<>239_word_end<이 평가되지 않습니다.) 진정한 결과가 없으면>543_word_end< >510_word_end<실행됩니다. 하지만 >454_word_end<>543_word_end<>753_word_end<case_>602_word_end<_found>698_word_end<

>757_word_end<

케이스
    x가 0에서 10 사이에있을 때
        msg : = '값은 0과 10 사이입니다.
    11에서 20 사이의 x
        MSG : = '값은 11 ~ 20 사이입니다.
>687_word_end<;

>761_word_end<>456_word_end<>763_word_end<>454_word_end<->509_word_end454_word_end<>765_word_end<>543_word_end<>767_word_end<

>775_word_end<#

>781_word_end<>782_word_end<, >784_word_end<, >786_word_end<, >788_word_end<, >790_word_end<>790_word_end>510_word_end<, 당신은 당신의 것을 준비 할 수 있습니다>159_word_end<>795_word_end<

>801_word_end< >782_word_end< #

[ >810_word_end<>811_word_end< >813_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

>821_word_end<AN에 의해 종료 될 때까지 무기한 반복되는 무>1262_word_end< >782_word_end<를 정의합니다.>784_word_end<>311_word_end<>221_word_end<>510_word_end<. 선택 사항>811_word_end<>784_word_end<>786_word_end<중첩 >782_word_end< 내의 >510_word_end<은 어떤 >782_word_end<를 지정하여 해당 >510_word_end<을 참조하십시오>1001_word_end<

>838_word_end< >784_word_end< #

>784_word_end< [ >811_word_end< >850_word_end<>304_word_end<부울->239_word_end< >302_word_end<

>856_word_end<>811_word_end<주어지면, 가장 안쪽 >782_word_end<가 종료되고 >166_word_end<은 >166_word_end<에엔드 >782_word_end<>166_word_end<에 실행됩니다. 만약에>811_word_end<주어지면 전류 >311_word_end< 일부 외부 레벨의 중첩 >782_word_end< >311_word_end< 블록의 >811_word_end<이어야합니다. 그런 >166_word_end< >782_word_end782_word_end< >311_word_end< 블록이 종료되고 제어가 >786_word_end<됩니다>863_word_end<.

>454_word_end<>304_word_end<지정되어 있습니다. >782_word_end< 종료는 만 발생합니다.부울->239_word_end<사실입니다. 그렇지 않으면 제어는 이후에 >510_word_end<로 전달됩니다.>784_word_end<.

>784_word_end<모든 유형의 >782_word_end<와 함께 >297_word_end<할 수 있습니다. 무>1262_word_end< >782_word_end<와 함께 >297_word_end<하는 것은 국한되지 않습니다.

a>878_word_end<>879_word_end<>784_word_end<블록 끝 이후 >166_word_end< 명령문에 제어를 전달합니다. 이 목적으로 라벨을 >297_word_end<해야합니다. 표지되지 않은>784_word_end<>883_word_end<>878_word_end<블록. (이것은 >115_word_end< >154_word_end< 릴리스에서의 변화입니다Postgre>161_word_end<.>784_word_end<a>878_word_end<>891_word_end<

>522_word_end<

>782_word_end<
    - 일부 계산
    count 0이면
        >784_word_end<;  - 종료 >782_word_end<
    끝 IF;
엔드 >782_word_end<;

고리
    - 일부 계산
    count 0 일 때 종료;  - >154_word_end< 예와 동일한 결과입니다
엔드 >782_word_end<;

>810_word_end< ablock 
>878_word_end<하다
    - 일부 계산
    주식이 100000이면
        자제 종료;  - >878_word_end< 블록에서 종료됩니다
    끝 IF;
    - 여기에 계산은 주식 100000시를 건너 뛸 것입니다.
끝;

>902_word_end< >786_word_end< #

>786_word_end< [ >811_word_end< >850_word_end<>683_word_end<부울->239_word_end< >302_word_end<

>454_word_end< no>811_word_end<가 주어지면, 가장 안쪽 >782_word_end<의 >166_word_end< 반복이 >878_word_end<됩니다. 즉, >782_word_end< 본체에 남아있는 모든 >510_word_end<은 건너 뜁니다. 다른 >782_word_end< 반복이 필요한지 여부를 결정하기 위해 >782_word_end< 제어 >239_word_end<식 (있는 경우)으로의 제어 리턴이 >1108_word_end<됩니다. 만약에>811_word_end<존재하고, 실행이 >786_word_end< 될 >782_word_end<의 >811_word_end<을 지정합니다.

>454_word_end<>304_word_end<지정되어 있습니다. >166_word_end< >782_word_end<의 반복은 만 >878_word_end<됩니다부울->239_word_end<사실입니다. 그렇지 않으면 제어는 이후에 >510_word_end<로 전달됩니다.>786_word_end<.

>786_word_end<모든 유형의 >782_word_end<와 함께 >297_word_end<할 수 있습니다. 무>1262_word_end< >782_word_end<와 함께 >297_word_end<하는 것은 국한되지 않습니다.

>522_word_end<

>782_word_end<
    - 일부 계산
    카운트 100의 경우 종료;
    카운트 <50을 >786_word_end<하면 >786_word_end<하십시오.
    - [50 >1001_word_end< 100]의 카운트 계산에 대한 일부 계산
엔드 >782_word_end<;

>946_word_end< >788_word_end< #

[ >810_word_end<>811_word_end< >958_word_end<부울->239_word_end<>821_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

>509_word_end<>788_word_end<>510_word_end<은만큼 일련의 >510_word_end<을 반복합니다.부울->239_word_end<true로 평가합니다. >239_word_end<식은 >782_word_end< 본체에 각 입력 직전에 확인됩니다.

>522_word_end<

>788_word_end< Voll_owed 0 및 G>454_word_end454_word_end782_word_end<
    - 여기에 일부 계산
엔드 >782_word_end<;

>782_word_end<가 완료되지 않은 동안
    - 여기에 일부 계산
엔드 >782_word_end<;

>983_word_end< >790_word_end<>985_word_end<#

[ >810_word_end<>811_word_end< >995_word_end<>996_word_end<>682_word_end< [>998_word_end<]>239_word_end< >1001_word_end< >239_word_end<[>1004_word_end<>239_word_end< ] >821_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

>761_word_end<>790_word_end<다양한 >1020_word_end< 값을 반복하는 >782_word_end<를 만듭니다. 변수>996_word_end<>1019_word_end<>1020_word_end<>782_word_end< 내부에만 존재합니다 (변수 >996_word_end<의 기존 정의는 >782_word_end< 내에서 무시됩니다). 범위의 하부 및 상한을 제공하는 두 >239_word_end<은 >782_word_end<에 들어갈 때 한 번 평가됩니다. 인 경우>1004_word_end<>1023_word_end<>1004_word_end<조항. >782_word_end< 항목에서 다시 한 번 평가됩니다. 만약에>998_word_end<지정된 >166_word_end< 각 반복 후에 추가하지 않고 단계 값을 빼냅니다.

>1020_word_end<의 일부 예>790_word_end<>782_word_end< :

I의 경우 1>1001_word_end<10 >782_word_end<
    - >782_word_end< 내에서 1,2,3,4,5,6,7,8,9,10 값을 취할 것입니다.
엔드 >782_word_end<;

반전 10>1001_word_end<1 >782_word_end<
    - >782_word_end< 내에서 10,9,8,7,6,5,4,3,2,1 값을 취할 것입니다.
엔드 >782_word_end<;

반전 10>1001_word_end<1 x 2 >782_word_end<
    - >782_word_end< 내에서 10,8,6,4,2 값을 맡을 것입니다.
엔드 >782_word_end<;

하한이 상한보다 큰 경우 (>311_word_end<>998_word_end<>456_word_end<), >782_word_end< 본체는 전혀 실행되지 않습니다. 오류가 발생하지 않습니다.

a>811_word_end<|>790_word_end<>782_word_end< 그러면 >1020_word_end< >782_word_end< 변수는 자격있는 >996_word_end<으로 참조 할 수 있습니다.>811_word_end<.

41.6.6. >293_word_end< 결과를 통한 루핑#

다른 유형의 >297_word_end<>790_word_end<>782_word_end<, >293_word_end< 결과를 반복하고 그 데이터를 조작 할 수 있습니다. 구문은 >166_word_end<과 같습니다.

[ >810_word_end<>811_word_end< >995_word_end<>1068_word_end<>682_word_end<>293_word_end<>821_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

>509_word_end<>1068_word_end<는 레코드 변수, 행 변수 >311_word_end< 쉼표로 분리 된 스칼라 변수 목록입니다>1207_word_end<>1068_word_end<|>293_word_end<및 >782_word_end< 본체는 각 행에 실행됩니다. 예는 >166_word_end<과 같습니다.

함수 생성 refresh_mviews ()는 >1020_word_end<를 $$로 >1108_word_end<합니다
>1256_word_end<하다
    mviews 레코드;
>878_word_end<하다
    '모든 구체화 된 견해를 상쾌하게하는 것';

    mviews >682_word_end<
       mv_schema로 n.nspname을 선택하고,
              c.relname as mv_name,
              PG_CATALOG.pg_GET_USERBYID (C.Relowner)는 소유자입니다
         pg_catalog.pg_class c
    왼쪽 가입 pg_catalog.pg_namespace n on (n.oid = c.relnamespace)
        여기서 c.relk>682_word_end585_word_end<',
                     quote_ident (mviews.mv_schema),
                     quote_ident (mviews.mv_name),
                     quote_ident (mviews.owner);
        형식 실행 ( '새로 고침 구체화 된보기 %I. %i', mviews.mv_schema, mviews.mv_name);
    엔드 >782_word_end<;

    '상쾌한 구체화 된 견해를 수행했습니다.';
    >1108_word_end< 1;
끝;
$$ 언어 plpgsql;

>782_word_end<가 an에 의해 종료 된 경우>784_word_end<명령문, 마지막 지정된 행 값은 >782_word_end< 후에도 여전히 액세스 할 수 있습니다.

>509_word_end<>293_word_end<이 유형에서 >297_word_end<>790_word_end<명령문은 발신자에게 행을 >1108_word_end<하는 >161_word_end< 명령이 될 수 있습니다 :>1098_word_end<가장 일반적인 경우이지만 >297_word_end<할 수도 있습니다>1100_word_end<, >1102_word_end<, >1104_word_end<>311_word_end<>1106_word_end<>781_word_end<>1108_word_end<>1109_word_end<>1110_word_end<>1111_word_end<

>159_word_end<변수는 >293_word_end< 매개 변수로 대체되며 >293_word_end< 계획은 가능한 재>297_word_end<을 위해 캐시됩니다.>1115_word_end<>1117_word_end<.

>509_word_end<>790_word_end<->682_word_end<->348_word_end<>510_word_end<은 행을 반복하는 또 다른 방법입니다 :

[ >810_word_end<>811_word_end< >995_word_end<>1068_word_end<>348_word_end<>1131_word_end<[>297_word_end<>239_word_end<[>300_word_end< ]] >821_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

이것은 소스 >293_word_end<가 문자열 >239_word_end<식으로 지정되며, 이는 각 항목에 대해 평가 및 대체 된 것을 제외하고는 >154_word_end< 형식과 같습니다.>790_word_end<>782_word_end<. 이를 통해 프로그래머는 사전 계획된 >293_word_end<의 속도 >311_word_end< 일반 >293_word_end<의 유연성을 선택할 수 있습니다.>348_word_end<>510_word_end<. 와 마찬가지로>348_word_end<, 매개 변수 값을 동적 명령에 >1100_word_end< 할 수 있습니다>297_word_end<.

결과를 반복 해야하는 >293_word_end<를 지정하는 또 다른 방법은 커서로 >1256_word_end<하는 것입니다. 이것은에 >1110_word_end<되어 있습니다.섹션 41.>125_word_end<.

>1165_word_end<#

>509_word_end<>790_word_end>782_word_end<는 A와 매우 흡사합니다>790_word_end<>782_word_end<이지만 >161_word_end< >293_word_end<에 의해 >1108_word_end< 된 행을 반복하는 대신 배열 값의 요소를 통해 반복됩니다. (일반적으로>790_word_end| 복합 값 >239_word_end<의 구성 요소를 통한 루핑을위한 것입니다. 배열 이외의 복합재를 통한 루핑의 변형은 향후에 추가 될 수 있습니다.)>790_word_end배열을 통해 >782_word_end<를위한 명령문은 >166_word_end<과 같습니다.

[ >810_word_end<>811_word_end< ]
>790_word_end>1068_word_end<[>1188_word_end<>1189_word_end< >1191_word_end<>239_word_end<>821_word_end<>510_word_end<엔드 >782_word_end< [ >811_word_end< >302_word_end<

>1201_word_end<>1188_word_end<>311_word_end< >454_word_end<>1188_word_end< 0지정되어 있으며, >782_word_end<는 평가하여 생성 된 배열의 개별 요소를 통해 반복됩니다>239_word_end<>1207_word_end<>1068_word_end<변수에는 각 요소 값이 순서대로 할당되며 각 요소에 대해 >782_word_end< 본체가 실행됩니다. >166_word_end<은 >1020_word_end< 배열의 요소를 통한 루핑의 예입니다.

함수 sum을 작성 (>682_word_end682_word_end1108_word_end<합니다
>1256_word_end<하다
  s >682_word_end682_word_end878_word_end<하다
  배열 $ 1의 Foreach X
  고리
    S : = S + X;
  엔드 >782_word_end<;
  >1108_word_end< s;
끝;
$$ 언어 plpgsql;

>1213_word_end<>1068_word_end<>1215_word_end<

>1217_word_end<>1188_word_end<>1219_word_end<>790_word_end단일 요소가 아닌 배열 조각을 통해 반복합니다>1207_word_end<>1188_word_end<값은 배열의 치수 수보다 크지 않은 >1020_word_end< 일정이어야합니다>1207_word_end<>1068_word_end<변수는 배열이어야하며 배열 값의 연속 >1188_word_end<를 수신해야합니다. 여기서 각 >1188_word_end<는에 의해 지정된 치수 수입니다.>1188_word_end<. >166_word_end<은 1 차원 >1188_word_end<를 통한 반복의 예입니다.

함수 만들기 scan_rows (>682_word_end256_word_end<를 $$로 >1108_word_end<합니다
>1256_word_end<하다
  x >682_word_end302_word_end<
>878_word_end<하다
  배열 $ 1의 Foreach X Slice 1
  고리
    통지 '행 = %', x;
  엔드 >782_word_end<;
끝;
$$ 언어 plpgsql;

Select Scan_rows (배열 [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]);

통지 : Row = 1,2,3

>1236_word_end<#

>1242_word_end<>159_word_end<함수는 함수 및 주변 트랜잭션의 실행을 중단합니다. a를 >297_word_end<하여 오류를 가두고 복구 할 수 있습니다.>878_word_end<>1246_word_end<>1247_word_end<>878_word_end<>1249_word_end<

[ >810_word_end<>811_word_end< >587_word_end<>1256_word_end<>1256_word_end< ]
>878_word_end<하다>510_word_end<>1246_word_end<
    >304_word_end<>1262_word_end<[>311_word_end<>1262_word_end< >585_word_end< ] 그런 >166_word_end<h>222_word_end[>304_word_end<>1262_word_end<[>311_word_end<>1262_word_end< >585_word_end< ] 그런 >166_word_end<h>222_word_end
      >585_word_end< >1279_word_end<

>1281_word_end<>510_word_end<, 그런 >166_word_end< 컨트롤이 >166_word_end< 문으로 전달됩니다.end. 그러나 내에서 토토 사이트가 발생하면>510_word_end<, 추가 처리>510_word_end<버려졌고 통제 통과가>1246_word_end<목록. 목록은 첫 번째를 검색합니다>1262_word_end<발생한 토토 사이트 일치. 일치가 발견되면 해당h>222_word_end실행 된 >166_word_end< 컨트롤이 >166_word_end< 명령문으로 전달됩니다>863_word_end<. 일치가 발견되지 않으면 토토 사이트가 마치처럼 전파됩니다.>1246_word_end<조항은 전혀 없었습니다.>1246_word_end<>311_word_end< 없으면 기능의 처리가 중단됩니다.

>509_word_end<>1262_word_end<>996_word_end<이 표시된 >996_word_end< 일 수 있습니다부록 A. 카테고리 >996_word_end<은 해당 범주 내에서 오류와 일치합니다. 특별 >1262_word_end< >996_word_end<기타을 제외한 모든 토토 사이트 유형과 일치합니다.query_canceledassert_failure. (이 두 가지 오류 유형을 >996_word_end<별로 붙잡는 것은 가능하지만 종종 현명하지 않습니다.) >1262_word_end< >996_word_end<은 대소 문자에 민감하지 않습니다. 또한 오류 >601_word_end<에 의해 지정할 수 있습니다.sqlstate코드; 예를 들어, 이것들은 동일합니다 :

say division_>1004_word_end<_zero 당시 >585_word_end<
sqlstate '22012'때 >585_word_end<

선택한 내에서 새 토토 사이트가 발생하면h>222_word_end, 이에 따라 잡을 수 없습니다>1246_word_end<조항이지만 전파됩니다. 주변>1246_word_end<조항을 잡을 수 있습니다.

토토 사이트가 발생할 때>1246_word_end<조항,의 로컬 변수>159_word_end<함수는 토토 사이트가 발생했을 때와 마찬가지로 유지되지만 블록 내의 영구 데이터베이스 상태로의 모든 변경 사항이 롤백됩니다. 예를 들어이 조각을 고려하십시오 :

mytab에 >1100_word_end< (FirstName, lastName) 값 ( 'Tom', 'Jones');
>878_word_end<하다
    mytab set firstName = 'joe'여기서 lastName = 'Jones';
    x : = x + 1;
    Y : = x / 0;
>1246_word_end<
    Division_>1004_word_end<_zero가있을 때
        'Caught Division_>1004_word_end<_Zero'를 통지하십시오.
        >1108_word_end< x;
끝;

제어가 할당에 도달하는 경우y56531_56555division_>1004_word_end<_zero토토 사이트. 이것은에 의해 잡힐 것입니다.>1246_word_end<절. >1108_word_end< 된 값>221_word_end<>510_word_end<은 증분 값이입니다.x그러나의 효과>1102_word_end<명령이 롤백됩니다>1207_word_end<>1100_word_end<앞의 명령은 블록 앞의 명령이 롤백되지 않으므로 최종 결과에는 데이터베이스에 포함되어 있습니다.Tom Jones>602_word_end<Joe Jones.

an을 포함하는 블록>1246_word_end<절은 하나가없는 블록보다 입력 및 종료하는 데 훨씬 비싸다. 따라서 >297_word_end<하지 마십시오>1246_word_end<필요없이.

예 41.2. >1246_word_end<>1102_word_end</>1100_word_end<

이 예제는 >1246_word_end< 처리를 >297_word_end<하여 하나를 수행합니다>1102_word_end<>311_word_end<>1100_word_end<, 적절하게. 응용 프로그램이 >297_word_end<하는 것이 좋습니다>1100_word_end<>781_word_end<충돌시 >1102_word_end<실제로이 패턴을 >297_word_end<하지 않고. 이 예는 주로의 >297_word_end<을 >1110_word_end<하는 역할을합니다.>159_word_end<제어 흐름 구조 :

>319_word_end< DB 생성 (>682_word_end682_word_end256_word_end<를 >1108_word_end<합니다
$$
>878_word_end<하다
    고리
        - 먼저 키를 >1102_word_end<하십시오
        DB SET B = 데이터를 >1102_word_end<합니다. 여기서 a = 키;
        그럼 발견된다면
            반품;
        끝 IF;
        - 거기에 있지 않으므로 키를 >1100_word_end<하십시오
        - 다른 사람이 동시에 같은 키를 동시에 >1100_word_end<하면
        -우리는 독특한 키 실패를 얻을 수 있습니다
        >878_word_end<하다
            db (a, b) 값 (키, 데이터)에 >1100_word_end<;
            반품;
        그때 고유 한 >1246_word_end<
            - 아무것도하지 않고 >1102_word_end<를 다시 시도하려면 >782_word_end<하십시오.
        끝;
    엔드 >782_word_end<;
끝;
$$
언어 plpgsql;

merge_db (1, 'david')를 선택하십시오.
merge_db (1, 'dennis')를 선택하십시오.

이 코딩은를 가정합니다.고유 한 _violation토토 사이트는에 의한 것입니다.>1100_word_end<>1100_word_end<>319_word_end<의 트리거 함수에서. >319_word_end<에 고유 한 인덱스가 둘 이상인 경우 오작동 할 수도 있습니다. 어떤 색인이 오류를 일으킨 지에 관계없이 작업을 재 시도하므로 오류가 발생할 수 있습니다. 갇힌 오류가 예상되는지 확인하기 위해 >166_word_end<에 논의 된 기능을 >297_word_end<하여 더 많은 안전을 가질 수 있습니다.


41.6.>121_word_end<. 오류에 대한 정보 얻기#

>1246_word_end< 처리기는 발생한 특정 오류를 식별해야합니다. >71_word_end< >1246_word_end<에 대한 정보를 얻는 두 가지 방법이 있습니다.PL/PG>161_word_end<: 특수 변수 및스택 진단 받기>349_word_end<

>1246_word_end< 핸들러 내에서 특수 변수sqlstate제기 된 >1246_word_end<에 해당하는 오류 코드를 포함합니다 (참조표 A.1가능한 토토 사이트 코드 목록의 경우). 특별 변수sqlerrm>1246_word_end<와 관련된 오류 메시지를 포함합니다. 이 변수는 외부 >1246_word_end< 처리기 외부의 정의되지 않았습니다.

>1246_word_end< 핸들러 내에서를 >297_word_end<하여 >71_word_end< >1246_word_end<에 대한 정보를 검색 할 수도 있습니다.스택 진단 받기명령, 양식이 있습니다.

스택 진단 받기변수= | : =항목[ >300_word_end< >302_word_end<

항목지정된 상태 값을 식별하는 핵심 단어variable(이를 수신하기에 적합한 데이터 유형이어야 함). >71_word_end< >297_word_end< 가능한 상태 항목은에 표시됩니다.표 41.2.

표 41.2. 오류 진단 항목

156_word_end<> 156_word_end<> <>509_word_end 509_word_end
>996_word_end< 타입 >1110_word_end<
>221_word_end 텍스트 >1246_word_end<의 sqlstate 오류 코드
column_name 텍스트 >1246_word_end<와 관련된 열의 >996_word_end<
제약 _name 텍스트 >1246_word_end<와 관련된 제약 >1262_word_end<의 >996_word_end<
PG_DATATYPE_NAME 텍스트 >1246_word_end<와 관련된 데이터 유형의 >996_word_end<
Message_Text 텍스트 >1246_word_end<의 기본 메시지의 텍스트
table_name 텍스트 >1246_word_end<와 관련된 >319_word_end<의 >996_word_end<
Schema_Name 텍스트 >1246_word_end<와 관련된 스키마의 >996_word_end<
pg_exception_detail 텍스트 >1246_word_end< 세부 메시지의 텍스트가있는 경우
pg_exception_h>682_word_end 텍스트 >1246_word_end< 힌트 메시지의 텍스트
pg_exception_context 텍스트 >1246_word_end<시 통화 스택을 >1110_word_end<하는 텍스트의 줄 (참조섹션 41.6.9)

>1246_word_end<가 항목의 값을 설정하지 않으면 빈 문자열이 >1108_word_end<됩니다.

>757_word_end<

>1256_word_end<
  text_var1 텍스트;
  text_var2 텍스트;
  text_var3 텍스트;
>878_word_end<하다
  - >1246_word_end<가 발생할 수있는 일부 처리
  >585_word_end<
다른 사람들이 >1246_word_end<
  스택 진단 받기 텍스트 _var1 = message_text,
                          text_var2 = pg_exception_detail,
                          text_var3 = pg_exception_h>682_word_end
    

41.6.9. 실행 위치 정보#

>509_word_end<진단 받기명령, >154_word_end<에 >1110_word_end< 된섹션 41.5.5는 >71_word_end< 실행 상태에 대한 정보를 검색합니다 (스택 진단 받기위에서 논의한 명령은 >154_word_end< 오류로 실행 상태에 대한 정보를보고합니다). 그것은PG_CONTEXT상태 항목은 >71_word_end< 실행 위치를 식별하는 데 유용합니다.PG_CONTEXT통화 스택을 >1110_word_end<하는 텍스트의 줄이있는 텍스트 문자열을 >1108_word_end<합니다. 첫 번째 줄은 >71_word_end< 함수와 >71_word_end< 실행 중입니다진단 받기>349_word_end< 두 번째 및 후속 선은 호출 함수를 통화 스택 위로 추가로 나타냅니다. 예를 들어:

함수 생성 >311_word_end< 교체 >432_word_end1020_word_end<를 $$로 >1108_word_end<합니다
>878_word_end<하다
  >221_word_end< >682_word_end682_word_end1020_word_end<를 $$로 >1108_word_end<합니다
>1256_word_end<하다
  스택 텍스트;
>878_word_end<하다
  진단 스택 = pg_context를 얻으십시오.
  통지 e '--- 전화 스택 --- \ n%', 스택;
  >1108_word_end< 1;
끝;
$$ 언어 plpgsql;

>1098_word_end< auter_func ();

주목 : --- 전화 스택 ---
>159_word_end< 함수 get 진단에서 5 번 라인 5
>159_word_end< 함수 >432_word_end159_word_end< 함수 >432_word_end1108_word_end<
 >432_word_end
    

스택 진단 받기 >585_word_end< pg_exception_context동일한 종류의 스택 추적을 >1108_word_end<하지만 >71_word_end< 위치가 아닌 오류가 감지 된 위치를 >1110_word_end<합니다.

수정 제출

올바른 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 >311_word_end< 추가 >1110_word_end<이 필요합니다. >297_word_end<이 양식문서 문제를보고하려면