이 문서는 지원되지 않는 버전의 토토 핫을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 커뮤니티 PostgreSQL : 문서 : 17 : 41.5. 기본버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

36.6. 토토 핫 진술

이 섹션과 다음 섹션에서는 모든 것을 설명합니다. 명시 적으로 이해되는 진술 유형pl/pgsql. 하나로 인식되지 않은 것 이 진술 유형은 SQL 명령으로 추정되며 기본 데이터베이스 엔진으로 전송하여 실행 (대체 후 어떤pl/pgsql사용 된 변수 성명서에서). 예를 들어, SQL 명령삽입, 업데이트삭제로 간주 될 수 있습니다 진술pl/pgsql, 그러나 그들은 여기에 구체적으로 나열되어 있지 않습니다.

36.6.1. 과제

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

식별자: =표현;

위에서 설명한 바와 같이, 그러한 진술의 표현은 다음과 같습니다. SQL을 통해 평가select기본 데이터베이스 엔진으로 전송 된 명령. 표현은해야합니다 단일 값을 산출하십시오.

표현식의 결과 데이터 유형이 일치하지 않으면 변수의 데이터 유형이거나 변수는 특정입니다 크기/정밀도 (예 :char (20)), The 결과 값은에 의해 암시 적으로 변환됩니다.pl/pgsql결과를 사용한 통역사 유형의 출력 기능 및 변수 유형의 입력 기능. 이로 인해 런타임 오류가 발생할 수 있습니다 문자열 형태의 입력 함수에 의해 생성 된 결과 값은 입력 기능에 허용되지 않습니다.

예 :

user_id : = 20;
세금 : = 하위 토탈 * 0.06;

36.6.2. 선택 안으로

A의 결과select토토 핫 여러 열 (단 하나의 행만)을 할당 할 수 있습니다. 레코드 변수, 행 형 변수 또는 스칼라 목록 변수. 이것은 :에 의해 수행됩니다.

선택대상 select_expressionsFrom ...;

여기서대상레코드가 될 수 있습니다 변수, 행 변수 또는 쉼표로 구분 된 간단한 목록 변수 및 레코드/행 필드. 그만큼select_expressions그리고 나머지 명령은 일반 SQL과 동일합니다.

이것은와는 상당히 다릅니다.PostgreSQL의 정상적인 해석선택, 여기서in대상은 새로 생성 된 테이블입니다. 당신이 A에서 테이블을 만들고 싶습니다.select내부의 결과pl/pgsql함수, 구문 사용테이블 생성 ... at select.

행 또는 가변 목록이 대상으로 사용되는 경우 선택한 값은 대상의 구조와 정확히 일치해야합니다. 런타임 오류가 발생합니다. 레코드 변수가 대상 인 경우 쿼리의 행 유형에 자동으로 구성됩니다. 결과 열.

제외in조항,select명령문은 a와 동일합니다 일반 SQLselect토토 핫 및 사용할 수 있습니다 완전한 힘.

theinto조항이 거의 나타날 수 있습니다 어디서나select진술. 관습 적으로 그것은 바로 후에 작성되었습니다.select위에 표시된대로 또는 바로From- 즉, 바로 직전이나 바로 그 자리입니다 목록select_expressions.

쿼리가 0 행을 반환하면 NULL 값이 할당됩니다. 대상. 쿼리가 여러 행을 반환하면 첫 번째 행은 대상에 할당되고 나머지는 폐기됩니다. ("첫 번째 줄"그렇지 않습니다 사용하지 않는 한 잘 정의 됨주문 에 의해.)

스페셜을 확인할 수 있습니다발견변수 (참조섹션 36.6.6) A 이후선택과제가 성공했는지 여부를 결정하기위한 진술, 즉, 적어도 하나의 행이 쿼리에 의해 반환되었습니다. 을 위한 예:

empname = myname에서 emp에서 myrec *로 선택하십시오.
찾을 수없는 경우
    예외 '직원 % 찾을 수 없음', MyName;
끝 If;

레코드/행 결과가 null인지 테스트하려면 사용할 수 있습니다. 그만큼is null조건부. , 그러나 추가 행이있을 수 있는지 알 수있는 방법은 없습니다. 버려졌습니다. 다음은 사건을 처리하는 예입니다 줄이 반환되지 않았습니다 :

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

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

36.6.3. 표현을 실행하거나 결과가없는 쿼리

때로는 표현식이나 쿼리를 평가하고 싶지만 결과를 버립니다 (일반적으로 함수를 호출하기 때문에 유용한 부작용은 있지만 유용한 결과 값은 없습니다). 할 일 이건pl/pgsql, 사용공연진술 :

공연쿼리;

이것은 실행쿼리및 결과를 버립니다. 쓰기쿼리SQL과 같은 방식select토토 핫이지만 교체하십시오 초기 키워드selectwith공연. pl/pgsql변수가 대체됩니다 평소와 같이 쿼리로. 또한 특수 변수발견17452_17545

참고 :하나는 기대할 수 있습니다selectNOin절은이 결과를 달성하지만 현재는이 결과를 달성 할 것입니다 그것을 받아들이는 방법 만공연.

예 :

create_mv를 수행합니다 ( 'CS_SESSION_PAGE_REQUESTS_MV', MY_QUERY);

36.6.4. 전혀 아무것도하지 않는다

때때로 아무것도하지 않는 자리 표시 자 성명서 유용한. 예를 들어, 하나의 팔이 /then/else 체인이 의도적으로 비어 있습니다. 이를 위해 사용하십시오 그만큼NULL진술 :

null;

예를 들어, 다음 두 조각의 코드는입니다 동등한:

시작
        Y : = x / 0;
    예외
        Division_by_zero가있을 때
            널;  - 오류를 무시하십시오
    끝;
시작
        Y : = x / 0;
    예외
        Division_By_Zero 일 때 - 오류를 무시하십시오
    끝;

바람직한 맛의 문제입니다.

참고 :Oracle의 PL/SQL에서 빈 명령문 목록 허용되지 않습니다.null진술은필수그러한 상황 이로.pl/pgsql허용 당신은 그냥 아무것도 쓰지 않고 대신.

36.6.5. 동적 실행 토토 핫

종종 내부에서 동적 토토 핫을 생성하고 싶을 것입니다 당신의pl/pgsql기능, 그 기능 다른 테이블이나 다른 토토 핫 데이터 유형이 실행 될 때마다.pl/pgsql의 정상적인 계획을 캐시하려는 시도 그러한 시나리오에서 토토 핫이 작동하지 않습니다. 이것을 처리합니다 일종의 문제,execute진술 제공됩니다 :

executeCommand-string[into대상];

여기서Command-stringis 문자열을 산출하는 표현 (유형텍스트) 실행 할 토토 핫을 포함하고대상레코드 변수입니다. 행 변수 또는 간단한 변수의 쉼표로 구분 된 목록 및 레코드/행 필드.

특히 대체가 없음pl/pgsql변수는 명령에서 수행됩니다 끈. 변수 값은 명령에 삽입되어야합니다. 구축 된 문자열.

다른 모든 토토 핫과 달리pl/pgsql, A가 실행하는 토토 핫execute진술은 준비되고 저장되지 않았습니다 세션의 삶에 한 번. 대신, 명령은입니다 진술이 실행될 때마다 준비됩니다. 명령 문자열은 할 수 있습니다 작업을 수행하기 위해 함수 내에서 동적으로 생성됩니다 다른 테이블과 열에.

thein조항은 위치를 지정합니다 A의 결과select토토 핫이 있어야합니다 할당된. 행 또는 가변 목록이 제공되면 에 의해 생성 된 결과의 구조와 정확히 일치합니다.select(레코드 변수가있을 때 중고, 결과 구조와 일치하도록 자체적으로 구성됩니다. 자동으로). 여러 행이 반환되면 첫 번째 행만이 반환됩니다 에 할당됩니다.into변수. 행이 반환되지 않으면 NULL이에 할당됩니다.into변수. 그렇지 않은 경우into조항이 지정되어 있습니다.select토토 핫은 폐기됩니다.

선택현재는 아닙니다 지원execute.

동적 명령으로 작업 할 때 종종 단일 따옴표의 탈출을 처리합니다. 권장 방법 기능 본문에서 고정 텍스트를 인용하는 것은 달러 인용입니다. (만약에 달러 인용문을 사용하지 않는 레거시 코드가 있습니다. 개요를 참조하십시오.섹션 36.2.1, 번역 할 때 약간의 노력을 절약 할 수 있습니다 더 합리적인 체계에 대한 코드.)

구성에 삽입 할 동적 값 쿼리는 스스로 할 수 있기 때문에 특별한 취급이 필요합니다 인용 문자를 포함합니다. 예제 (이것은 당신이 생각합니다 기능 전체에 대한 달러 인용 사용이므로 인용문 마크는 두 배가 될 필요가 없습니다) :

실행 'TBL 세트 업데이트'
        || quote_ident (colname)
        || '='
        || quote_literal (newValue)
        || 'key ='
        || quote_literal (keyvalue);

이 예제는의 사용을 보여줍니다.QUOTE_INDENandquote_literal함수. 안전을 위해 열 및 테이블 식별자를 포함하는 표현식이 있어야합니다 전달QUOTE_INDEN. 문자 그대로 문자열이어야하는 값을 포함하는 표현 구성 명령은로 전달되어야합니다.quote_literal. 둘 다 적절한 것을 취합니다 이중 또는 단일로 둘러싸인 입력 텍스트를 반환하는 단계 내장 된 특수 문자와 함께 각각 인용합니다 제대로 탈출.

달러 견적은 고정 인용에만 유용합니다. 텍스트. 위의 일을 시도하는 것은 매우 나쁜 생각입니다. 예제 as

실행 'TBL 세트 업데이트'
        || quote_ident (colname)
        || '= $$'
        || NewValue
        || '$$ key ='
        || quote_literal (keyvalue);

의 내용이 끊어지기 때문에NewValue$$. 같은 반대는 다른 반대에 적용됩니다 당신이 선택할 수있는 달러 인용 분리기. 따라서 안전하게 인용합니다 미리 알려지지 않은 텍스트, 당신은필수useQUOTE_LITERAL.

동적 토토 핫의 훨씬 더 큰 예와execute예 36-6, a를 구축하고 실행합니다.생성 기능새 함수를 정의하려는 토토 핫.

36.6.6. 결과를 얻습니다 상태

토토 핫의 효과를 결정하는 몇 가지 방법이 있습니다. 첫 번째 방법은를 사용하는 것입니다.진단COMMAND, 여기에는 양식이 있습니다.

진단 받기변수=항목[ , ... ];

이 토토 핫은 시스템 상태 표시기를 검색 할 수 있습니다. 각항목는 핵심 단어입니다 지정된 상태에 할당 할 상태 값 식별 변수 (수신하기에 적합한 데이터 유형이어야합니다. 그것). 현재 사용 가능한 상태 항목은row_count, 마지막SQL토토 핫이 다운되었습니다SQL엔진 및result_oid, 마지막 행의 OID 가장 최근에 삽입SQL토토 핫. 참고result_oid이후에만 유용합니다삽입OID를 포함하는 테이블에 토토 핫.

예 :

진단 받기 integer_var = row_count;

명령의 효과를 결정하는 두 번째 방법은 다음과 같습니다. 이름이 지정된 특수 변수를 확인하려면발견, 유형의부울. 발견시작합니다 각각의 거짓pl/pgsql함수 호출. 다음 유형의 각 유형에 의해 설정됩니다. 진술 :

  • a선택성명서 세트발견행을 반환하는 경우 True 행이 반환되지 않으면 false.

  • a공연성명서 세트발견그것이 생산하는 경우 (및 소실) 행, 행이 생성되지 않으면 거짓.

  • 업데이트, 삽입삭제진술 세트발견true if at 최소 한 행에 영향을 받고 행이 영향을받지 않으면 거짓입니다.

  • afetch토토 핫문 세트발견행을 반환하는 경우 True 행이 반환되지 않으면 false.

  • afor성명서 세트발견한 번 이상 반복하면 참이되면, 그렇지 않으면 거짓. 이것은의 세 가지 변형에 모두 적용됩니다.forStatement (Integerfor루프, 레코드 세트for루프 및 동적 레코드 세트for루프).발견이런 식으로 설정됩니다.for루프 출구; 루프 실행 내부에서발견for진술은 변경 될 수 있지만 루프 본체 내에서 다른 진술의 실행.

발견는 내부의 로컬 변수입니다 각PL/PGSQL함수; 어느 그것에 대한 변경은 현재 함수에만 영향을 미칩니다.