2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.토토 커뮤니티 PostgreSQL : 문서 : 17 : 41.5. 기본 진술버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

36.6. 토토 핫 진술

이 섹션과 다음 섹션에서 우리는 명시적으로 이해되는 명령문 유형PL/pgSQL. 다음 중 하나로 인식되지 않는 것 이러한 명령문 유형은 SQL 명령으로 추정되며 실행을 위해 기본 데이터베이스 엔진으로 전송됨(대체 후) 어느 것 하나라도PL/pgSQL변수 사용됨 성명서에서). 따라서 예를 들어 SQL 명령은 다음과 같습니다.삽입, 업데이트삭제다음으로 간주될 수 있습니다. 의 진술PL/pgSQL하지만 그들은 여기에는 구체적으로 나열되어 있지 않습니다.

36.6.1. 과제

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

식별자 := 표현;

위에서 설명했듯이, 그러한 진술의 표현은 다음과 같습니다 SQL을 통해 평가됨선택명령이 주 데이터베이스 엔진으로 전송되었습니다. 표현은 반드시 단일 값을 생성합니다.

식의 결과 데이터 유형이 일치하지 않는 경우 변수의 데이터 유형이거나 변수에 특정 유형이 있습니다. 크기/정밀도(예:문자(20)), 결과 값은에 의해 암시적으로 변환됩니다.PL/pgSQL결과를 사용하는 해석기 유형의 출력 기능과 변수 유형의 입력 기능. 이로 인해 잠재적으로 런타임 오류가 발생할 수 있습니다. 입력 함수에 의해 생성된 문자열 형식인 경우 결과 값이 입력 함수에 허용되지 않습니다.

예:

사용자_ID := 20;
세금 := 소계 * 0.06;

36.6.2. 선택 INTO

a의 결과선택명령 여러 열(단 하나의 행만)을 생성하는 데 할당할 수 있습니다. 레코드 변수, 행 유형 변수 또는 스칼라 목록 변수. 이는 다음에 의해 수행됩니다:

선택대상 select_expressions발신 ...;

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

이것은 다음과 상당히 다르다는 점에 유의하세요.PostgreSQL의 일반적인 해석선택, 여기서INTO대상은 새로 생성된 테이블입니다. 당신이 a에서 테이블을 만들고 싶습니다.선택a 내부의 결과PL/pgSQL함수, 구문을 사용하세요테이블 생성 ... 선택으로.

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

다음을 제외하고INTO절, 그선택문은 다음과 같습니다. 일반 SQL선택토토 핫을 내리고 사용할 수 있습니다 전력을 다해.

INTO절은 거의 나타날 수 있습니다. 의 어느 곳에서나선택성명. 관례적으로 그것은 바로 뒤에 쓰여집니다.선택위 또는 직전에 표시된 대로발신—즉, 직전 또는 직후 목록select_expressions.

쿼리가 0행을 반환하는 경우 null 값이 다음에 할당됩니다. 목표(들). 쿼리가 여러 행을 반환하는 경우 첫 번째 행은 대상에 할당되고 나머지는 삭제됩니다. (참고하세요"첫 번째 행"아님 사용하지 않은 한 잘 정의됨주문 으로.)

특집을 확인하실 수 있습니다발견변수(참조섹션 36.6.6) a 이후선택할당이 성공했는지 확인하는 명령문, 즉, 쿼리에서 하나 이상의 행이 반환되었습니다. 에 대한 예:

myrec * FROM emp WHERE empname = myname으로 선택;
발견되지 않은 경우
    RAISE EXEPTION '직원 %를 찾을 수 없음', myname;
종료하면;

레코드/행 결과가 null인지 테스트하려면 다음을 사용할 수 있습니다.NULL임조건부. 있다, 그러나 추가 행이 있는지 여부를 알 수 있는 방법은 없습니다. 폐기되었습니다. 다음은 다음과 같은 경우를 처리하는 예입니다. 반환된 행이 없습니다.

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

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

36.6.3. 표현식 실행 또는 결과가 없는 쿼리

때때로 표현식이나 쿼리를 평가하고 싶지만 결과를 폐기합니다(일반적으로 함수를 호출하기 때문에 유용한 부작용이 있지만 유용한 결과 값은 없습니다). 해야 할 일 이 안에PL/pgSQL, 다음을 사용하세요.수행성명:

수행질의;

이것은 실행됩니다질의그리고 결과를 폐기합니다. 를 쓰세요질의SQL에서와 같은 방식선택명령을 사용하되 다음을 바꾸세요. 초기 키워드선택수행. PL/pgSQL변수가 대체됩니다 평소처럼 쿼리에 들어갑니다. 또한 특수 변수발견쿼리가 생성된 경우 true로 설정됩니다. 행이 하나 이상 있거나 행이 생성되지 않은 경우 false입니다.

참고:그렇게 예상할 수도 있습니다.선택아니요INTO절은 이 결과를 달성하지만 현재는 허용되는 유일한 방법은 다음과 같습니다.수행.

예:

create_mv('cs_session_page_requests_mv', my_query) 수행;

36.6.4. 전혀 아무것도 하지 않음

가끔 아무 작업도 수행하지 않는 자리 표시자 문은 유용합니다. 예를 들어, 이는 다음 팔 중 하나를 나타낼 수 있습니다. if/then/else 체인이 의도적으로 비어 있습니다. 이를 위해 다음을 사용하십시오.NULL성명:

NULL;

예를 들어, 다음 두 코드 조각은 다음과 같습니다. 이에 상응하는 것:

시작
        y := x / 0;
    예외
        WHEN Division_by_zero THEN
            NULL;  -- 오류를 무시하세요
    끝;
시작
        y := x / 0;
    예외
        WHEN Division_by_zero THEN -- 오류를 무시합니다.
    끝;

어느 것이 더 좋은지는 취향의 문제입니다.

참고:오라클의 PL/SQL에서 빈 명령문 목록 허용되지 않으므로NULL문장은필수이러한 상황의 경우 이것으로.PL/pgSQL허용합니다 대신 아무것도 쓰지 마세요.

36.6.5. 동적 실행 중 토토 핫

종종 내부에서 동적 토토 핫을 생성하고 싶을 때가 있습니다 당신의PL/pgSQL함수, 그 즉, 다른 테이블이나 다른 테이블을 포함하는 토토 핫입니다. 실행될 때마다 데이터 유형이 표시됩니다.PL/pgSQL의 정상적인 캐시 계획 시도 이러한 시나리오에서는 토토 핫이 작동하지 않습니다. 이를 처리하려면 일종의 문제입니다.실행성명 제공됩니다:

실행토토 핫어-문자열[ INTO목표 ];

어디에서토토 핫어-문자열은 문자열을 생성하는 표현식(유형)텍스트) 실행할 명령이 포함되어 있으며대상은 레코드 변수입니다. 행 변수 또는 쉼표로 구분된 단순 변수 목록 및 레코드/행 필드.

특히 다음을 대체할 수 없다는 점에 유의하세요.PL/pgSQL명령에서 변수가 완료되었습니다. 문자열. 변수 값은 명령에 삽입되어야 합니다. 생성된 문자열입니다.

다른 모든 토토 핫과 달리PL/pgSQL,에 의해 실행되는 명령실행문이 준비되지 않았으며 방금 저장되었습니다. 세션 기간 동안 한 번. 대신 명령은 다음과 같습니다. 명령문이 실행될 때마다 준비됩니다. 명령 문자열은 작업을 수행하기 위해 함수 내에서 동적으로 생성됩니다. 다른 테이블과 열에.

INTO절은 a의 결과선택명령은 다음과 같아야 합니다. 할당됨. 행 또는 변수 목록이 제공되는 경우 에 의해 생성된 결과의 구조와 정확히 일치합니다.선택(레코드 변수가 사용되면 결과의 구조와 일치하도록 자체 구성됩니다. 자동으로). 여러 행이 반환되는 경우 첫 번째 행만 에 할당됩니다.INTO변수. 반환된 행이 없으면 NULL이에 할당됩니다.INTO변수. 그렇지 않은 경우INTO절이 지정되었습니다. a의 결과선택토토 핫은 폐기됩니다.

선택현재는 아님 이내 지원됨실행.

동적 명령으로 작업할 때 종종 다음을 수행해야 합니다. 작은따옴표의 이스케이프를 처리합니다. 권장되는 방법 함수 본문에서 고정 텍스트를 인용하는 것은 달러 인용입니다. (만약 달러 인용을 사용하지 않는 레거시 코드가 있습니다. 개요를 참조하세요.섹션 36.2.1, 번역할 때 수고를 덜 수 있습니다. 더 합리적인 방식으로 코드를 작성했습니다.)

구성된 항목에 삽입될 동적 값 쿼리는 그 자체로 발생할 수 있으므로 특별한 처리가 필요합니다. 따옴표 문자를 포함합니다. 예(이것은 귀하가 다음과 같다고 가정합니다. 함수 전체에 달러 인용을 사용하므로 인용문은 점수를 두 배로 늘릴 필요는 없습니다):

'UPDATE TBL SET' 실행
        || quote_ident(열이름)
        || ' = '
        || quote_literal(새 값)
        || ' WHERE 키 = '
        || quote_literal(키값);

이 예는 다음의 사용을 보여줍니다.quote_ident그리고quote_literal함수. 안전을 위해, 열 및 테이블 식별자를 포함하는 표현식은 다음과 같아야 합니다. 전달됨quote_ident. 리터럴 문자열이어야 하는 값을 포함하는 표현식 생성된 명령은 다음으로 전달되어야 합니다.quote_literal. 둘 다 적절한 것을 취합니다. 이중 또는 단일로 묶인 입력 텍스트를 반환하는 단계 특수 문자가 포함된 각각의 따옴표 제대로 이스케이프되었습니다.

달러 인용은 고정 인용에만 유용하다는 점에 유의하십시오. 텍스트. 위의 방법을 시도하는 것은 매우 나쁜 생각입니다. 예를 들어

'UPDATE TBL SET' 실행
        || quote_ident(열이름)
        || ' = $$'
        || 새로운 값
        || '$$ WHERE 키 = '
        || quote_literal(키값);

다음의 내용이 있으면 깨질 수 있기 때문입니다.새값우연히 포함된$$. 다른 어떤 경우에도 동일한 반대 의견이 적용됩니다. 달러 인용 구분 기호를 선택할 수 있습니다. 그래서 안전하게 인용하자면 사전에 알 수 없는 문자, 당신반드시사용quote_literal.

동적 토토 핫의 훨씬 더 큰 예와실행다음에서 볼 수 있음예 36-6, 다음을 빌드하고 실행합니다.만들기 기능새 기능을 정의하는 토토 핫입니다.

36.6.6. 결과 얻기 상태

토토 핫의 효과를 결정하는 방법에는 여러 가지가 있습니다. 첫 번째 방법은GET 진단명령, 형식은 다음과 같습니다.

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

이 토토 핫은 시스템 상태 표시기를 검색할 수 있습니다. 각각항목키워드입니다 지정된 상태에 할당될 상태 값을 식별합니다. 변수(수신할 올바른 데이터 유형이어야 함) 그것). 현재 사용 가능한 상태 항목은 다음과 같습니다.ROW_COUNT, 처리된 행 수 마지막SQL토토 핫이 내려졌습니다 에SQL엔진 및RESULT_OID, 마지막 행의 OID 가장 최근에 삽입됨SQL토토 핫. 참고하세요RESULT_OID다음에만 유용합니다.삽입OID가 포함된 테이블에 토토 핫을 입력합니다.

예:

진단 받기 정수_var = ROW_COUNT;

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

  • A 선택문 세트발견행을 반환하면 true, 행이 반환되지 않으면 false입니다.

  • A 수행문 세트발견생성하면 true(그리고 삭제) 행, 생성된 행이 없으면 false입니다.

  • 업데이트, 삽입삭제문 세트발견다음에 있는 경우 true 최소한 하나의 행이 영향을 받습니다. 행이 영향을 받지 않으면 false입니다.

  • A 가져오기문 세트발견행을 반환하면 true, 행이 반환되지 않으면 false입니다.

  • A for문 세트발견한 번 이상 반복되면 true, 그렇지 않으면 거짓입니다. 이는의 세 가지 변형 모두에 적용됩니다.for문장(정수for루프, 레코드 세트for루프 및 동적 레코드 세트for루프).발견다음과 같은 경우에 이 방법으로 설정됩니다.for루프 종료; 루프 실행 내부에서,발견다음에 의해 수정되지 않습니다.for문은 다음에 의해 변경될 수 있지만 루프 본문 내에서 다른 문을 실행합니다.

발견은(는) 다음의 지역 변수입니다. 각각PL/pgSQL함수; 어떤 변경 사항은 현재 기능에만 영향을 미칩니다.