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

37.6. 스포츠 토토 사이트 진술

이 섹션과 다음 섹션에서 우리는 명시적으로 이해되는 명령문 유형PL/pgSQL. 다음 중 하나로 인식되지 않는 것 이러한 명령문 유형은 SQL 명령으로 추정되며 설명된 대로 실행을 위해 기본 데이터베이스 엔진으로 전송됩니다.섹션 37.6.2그리고섹션 37.6.3.

37.6.1. 과제

a에 대한 값 할당PL/pgSQL변수 또는 행/레코드 필드는 다음과 같습니다. 다음과 같이 작성되었습니다:

식별자 := 표현;

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

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

예:

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

37.6.2. 쿼리 실행 결과 없음

예를 들어 행을 반환하지 않는 SQL 쿼리의 경우삽입없이돌아오는 중절, 쿼리를 실행할 수 있습니다 a 이내PL/pgSQL함수 쿼리를 작성하면 됩니다.

모두PL/pgSQL변수 이름 쿼리 텍스트에 나타나는 것은 매개변수 기호로 대체됩니다. 그런 다음 변수의 현재 값이 다음과 같이 제공됩니다. 런타임 시 매개변수 값. 이는 동일한 텍스트 쿼리를 허용합니다. 함수의 다른 호출에서 다른 작업을 수행합니다.

참고:이 2단계 프로세스를 통해 다음을 수행할 수 있습니다.PL/pgSQL쿼리를 한 번만 계획하려면 후속 실행 시 계획을 재사용합니다. 로서 예를 들어, 다음과 같이 쓴다면

선언하다
    키 텍스트;
    델타 INTEGER;
시작
    ...
    업데이트 mytab SET val = val + delta WHERE id = 키;

주 SQL 엔진에서 본 쿼리 텍스트는 다음과 같습니다. 좋아요

UPDATE mytab SET val = val + $1 WHERE id = $2;

보통은 이에 대해 생각할 필요가 없지만, 이해가 필요할 때 알아두면 도움이 됩니다. 구문 오류 메시지.

주의

PL/pgSQL할 것이다 다음 중 하나와 일치하는 식별자로 대체합니다. 함수의 선언된 변수; 충분히 밝지 않아 그게 당신이 의미한 것인지 알기 위해서요! 따라서 그것은 다른 변수와 동일한 변수 이름을 사용하는 것은 좋지 않습니다. 참조해야 하는 테이블 또는 열 이름 함수 내에서 쿼리합니다. 가끔은 일할 수도 있지 쿼리에 정규화된 이름을 사용하여 이 문제를 해결하세요.PL/pgSQL하지 않을 것입니다 정규화된 이름으로 대체foo., 비록foo또는은 선언된 변수입니다. 이름.

때때로 표현식을 평가하는 것이 유용하거나선택질의하지만 결과를 폐기합니다. 예를 들어 부작용이 있는 함수를 호출할 때 유용한 결과 값이 없습니다. 이를 수행하려면PL/pgSQL, 다음을 사용하세요.수행성명:

수행질의;

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

참고:누군가는 그런 글을 기대할 수도 있습니다선택직접적으로 이 일을 성취할 것입니다 그러나 현재 이를 수행하는 유일한 방법은 다음과 같습니다.수행. 다음을 수행할 수 있는 SQL 명령 다음과 같은 행을 반환합니다.선택, 그럴 거예요 다음이 없으면 오류로 거부됩니다.INTO다음에 논의된 절 섹션.

예:

create_mv('cs_session_page_requests_mv', my_query) 수행;

37.6.3. 다음을 사용하여 쿼리 실행 단일 행 결과

단일 행을 생성하는 SQL 명령의 결과(아마도 여러 열)을 레코드 변수에 할당할 수 있습니다. 행 유형 변수 또는 스칼라 변수 목록. 이는 다음에 의해 수행됩니다. 기본 SQL 명령을 작성하고INTO절. 예를 들어,

선택select_expressionsINTO [STRICT] 대상발신 ...;
삽입... 반환 중표현INTO [STRICT] 대상;
업데이트 ... 복귀 중표현INTO [STRICT] 대상;
삭제 ... 복귀 중표현INTO [STRICT] 대상;

어디에서대상기록이 될 수 있습니다 변수, 행 변수 또는 쉼표로 구분된 단순 목록 변수 및 레코드/행 필드.PL/pgSQL변수가 대체됩니다 평소와 같이 나머지 쿼리에 들어갑니다. 이것은 작동합니다.선택, 삽입/업데이트/삭제함께돌아오는 중및 유틸리티 명령 행 집합 결과를 반환합니다(예:설명). 제외하고INTO절, SQL 명령은 그것과 동일합니다 외부에 기록될 것입니다PL/pgSQL.

팁:이 해석은선택함께INTO입니다 와는 아주 다릅니다포스트그레SQL의 단골선택스포츠 토토 사이트, 여기서INTO대상은 새로 생성된 테이블입니다. 당신이 a에서 테이블을 만들고 싶습니다.선택a 내부 결과PL/pgSQL함수, 구문을 사용하세요선택으로 테이블 생성 ....

행 또는 변수 목록이 대상으로 사용되는 경우 쿼리의 결과 열은 대상의 구조와 정확하게 일치해야 합니다. 숫자 및 데이터 유형에 관한 정보가 없거나 런타임 오류가 발생합니다. 언제 레코드 변수가 대상이며 자동으로 구성됩니다. 쿼리 결과 열의 행 유형으로 자체 변경됩니다.

INTO절이 거의 나타날 수 있음 SQL 명령의 어느 곳에서나. 관례적으로 다음 중 하나를 작성합니다. 목록 바로 앞 또는 바로 뒤select_expressions선택명령 또는 명령 끝에 다른 명령 유형. 이것을 따르는 것이 좋습니다 경우에 대한 규칙PL/pgSQL파서는 앞으로 더 엄격해질 것입니다 버전.

만약STRICT지정되지 않은 경우대상첫 번째로 설정됩니다 쿼리에서 반환된 행 또는 쿼리에서 반환된 값이 없는 경우 null로 반환됨 행. (참고하세요"첫 번째 행"입니다 사용하지 않는 한 잘 정의되지 않음주문 으로.) 첫 번째 행 이후의 모든 결과 행은 삭제됩니다. 특집을 확인하실 수 있습니다발견변수(참조섹션 37.6.6) 행이 반환되었는지 확인하려면 다음을 수행하세요.

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

만약엄격옵션이 지정되었습니다. 쿼리는 정확히 하나의 행을 반환해야 합니다. 그렇지 않으면 런타임 오류가 발생합니다. 다음 중 하나를 보고해야 합니다.NO_DATA_FOUND(아니요 행) 또는TOO_MANY_ROWS(하나 이상 행). 다음을 포착하려면 예외 블록을 사용할 수 있습니다. 오류입니다. 예를 들면 다음과 같습니다.

시작
    SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;
    예외
        NO_DATA_발견된 시점
            RAISE EXEPTION '직원 %를 찾을 수 없음', myname;
        다음에는 TOO_MANY_ROWS개일 때
            RAISE EXEPTION '직원 %가 고유하지 않음', myname;
끝;

다음 명령어를 성공적으로 실행했습니다.STRICT항상 설정발견참으로.

삽입/업데이트/삭제돌아오는 중, PL/pgSQL다음 이상의 오류를 보고합니다. 1개의 행이 반환된 경우에도 마찬가지입니다.STRICT이다 지정되지 않았습니다. 와 같은 옵션이 없기 때문입니다.주문 기준그것으로 무엇을 결정할 것인가 영향을 받은 행이 반환됩니다.

참고:STRICT옵션 Oracle PL/SQL의 동작과 일치합니다.선택및 관련 스포츠 토토 사이트.

여러 결과를 처리해야 하는 경우를 처리하려면 SQL 쿼리의 행은 다음을 참조하세요.섹션 37.7.4.

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

37.6.5. 동적 실행 중 스포츠 토토 사이트

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

실행스포츠 토토 사이트어-문자열 [INTO [엄격] 대상 ];

어디에서스포츠 토토 사이트어-문자열은 문자열을 생성하는 표현식(유형)텍스트25400_25450대상은 레코드 변수입니다. 행 변수 또는 쉼표로 구분된 단순 변수 목록 및 레코드/행 필드.

특히 다음을 대체할 수 없다는 점에 유의하세요.PL/pgSQL변수는 계산된 값에서 수행됩니다. 명령 문자열. 변수의 값은 생성된 명령 문자열입니다.

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

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

만약에STRICT옵션이 주어지면 쿼리가 정확히 하나를 생성하지 않는 한 오류가 보고됩니다. 행.

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

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

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

37.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함수; 어떤 변경 사항은 현재 기능에만 영향을 미칩니다.