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

35.6. 메이저 토토 사이트 진술

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

35.6.1. 과제

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

식별자 := 표현;

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

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

예:

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

35.6.2. 선택 INTO

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

선택대상 select_expressions발신 ...;

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

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

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

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

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

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

특집을 확인하실 수 있습니다발견변수(참조섹션 35.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://';
    종료하면;
끝;

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

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

수행질의;

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

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

예:

create_mv('cs_session_page_requests_mv', my_query) 수행;

35.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허용합니다 대신 아무것도 쓰지 마세요.

35.6.5. 동적 실행 중 메이저 토토 사이트

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

실행메이저 토토 사이트어-문자열;

어디에서메이저 토토 사이트어-문자열은 문자열을 생성하는 표현식(유형)텍스트) 실행할 명령이 포함되어 있습니다. 이 문자열은 문자 그대로 SQL 엔진에 공급됩니다.

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

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

다음의 결과선택명령 에 의해 삭제되었습니다.실행선택현재 지원되지 않습니다 이내실행. 그러니 방법이 없지 동적으로 생성된 결과를 추출합니다.선택평야 사용실행메이저 토토 사이트. 다른 두 가지 방법이 있습니다 그러나 하나는를 사용하는 것입니다.실행 중에 설명된 루프 형식섹션 35.7.4, 다른 하나는 커서를실행 가능, 설명된 대로섹션 35.8.2.

동적 명령을 사용할 때 종종 다음을 수행해야 합니다. 작은따옴표의 이스케이프를 처리합니다. 권장되는 방법 함수 본문에서 고정 텍스트를 인용하는 것은 달러 인용입니다. (만약 달러 인용을 사용하지 않는 레거시 코드가 있습니다. 개요를 참조하세요.섹션 35.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.

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

35.6.6. 결과 얻기 상태

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

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

이 메이저 토토 사이트은 시스템 상태 표시기를 검색할 수 있습니다. 각각항목키워드입니다 지정된 상태에 할당될 상태 값을 식별합니다. 변수(수신할 올바른 데이터 유형이어야 함) 그것). 현재 사용 가능한 상태 항목은 다음과 같습니다.ROW_COUNT, 처리된 행 수 마지막SQL메이저 토토 사이트이 내려졌습니다 에SQL엔진 및RESULT_OID, 마지막 행의 OID 가장 최근에 삽입됨SQL메이저 토토 사이트. 참고하세요RESULT_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함수; 그러니 어쨌든 변경 사항은 현재 기능에만 영향을 미칩니다.