이 섹션과 다음 섹션에서 우리는 명시적으로 이해되는 명령문 유형PL/pgSQL. 다음 중 하나로 인식되지 않는 것 이러한 명령문 유형은 SQL 명령으로 추정되며 실행을 위해 기본 데이터베이스 엔진으로 전송됨(대체 후) 어느 것 하나라도PL/pgSQL변수 사용됨 성명서에서). 따라서 예를 들어 SQL 명령은 다음과 같습니다.삽입, 업데이트및삭제다음으로 간주될 수 있습니다. 의 진술PL/pgSQL하지만 그들은 여기에는 구체적으로 나열되어 있지 않습니다.
변수 또는 행/레코드 필드에 값 할당 다음과 같이 작성됩니다:
식별자 := 표현;
위에서 설명했듯이, 그러한 진술의 표현은 다음과 같습니다 SQL을 통해 평가됨선택명령이 주 데이터베이스 엔진으로 전송되었습니다. 표현은 반드시 단일 값을 생성합니다.
식의 결과 데이터 유형이 일치하지 않는 경우 변수의 데이터 유형이거나 변수에 특정 유형이 있습니다. 크기/정밀도(예:문자(20)), 결과 값은에 의해 암시적으로 변환됩니다.PL/pgSQL결과를 사용하는 해석기 유형의 출력 기능과 변수 유형의 입력 기능. 이로 인해 잠재적으로 런타임 오류가 발생할 수 있습니다. 입력 함수에 의해 생성된 문자열 형식인 경우 결과 값이 입력 함수에 허용되지 않습니다.
예:
사용자_ID := 20; 세금 := 소계 * 0.06;
a의 결과선택명령 여러 열(단 하나의 행만)을 생성하는 데 할당할 수 있습니다. 레코드 변수, 행 유형 변수 또는 스칼라 목록 변수. 이는 다음에 의해 수행됩니다:
선택대상 select_expressions발신 ...;
어디에서대상기록이 될 수 있습니다 변수, 행 변수 또는 쉼표로 구분된 단순 목록 변수 및 레코드/행 필드.select_expressions그리고 나머지 명령은 일반 SQL과 동일합니다.
이것은 다음과 상당히 다르다는 점에 유의하세요.PostgreSQL의 일반적인 해석선택, 여기서INTO대상은 새로 생성된 테이블입니다. 당신이 a에서 테이블을 만들고 싶습니다.선택a 내부의 결과PL/pgSQL함수, 구문을 사용하세요테이블 생성 ... 선택으로.
행 또는 변수 목록이 대상으로 사용되는 경우 선택된 값은 대상의 구조와 정확하게 일치해야 합니다. 런타임 오류가 발생합니다. 레코드 변수가 대상인 경우 쿼리의 행 유형으로 자동 구성됩니다. 결과 열입니다.
다음을 제외하고INTO절, 그선택문은 다음과 같습니다. 일반 SQL선택토토 사이트 순위을 내리고 사용할 수 있습니다 전력을 다해.
쿼리가 0행을 반환하는 경우 null 값이 다음에 할당됩니다. 목표(들). 쿼리가 여러 행을 반환하는 경우 첫 번째 행은 대상에 할당되고 나머지는 삭제됩니다. (참고하세요"첫 번째 행"아님 사용하지 않은 한 잘 정의됨주문 으로.)
현재,INTO절은 가능 거의 모든 곳에 나타납니다.선택문 뒤에 바로 배치하는 것이 좋습니다.선택위 그림과 같은 키워드입니다. 향후 버전PL/pgSQL배치에 대해 덜 관대할 수도 있습니다INTO절.
당신은 사용할 수 있습니다발견직후 에선택결정할 진술 할당이 성공했는지 여부(즉, 적어도 행이 쿼리에 의해 반환되었습니다.) 예를 들면:
myrec * FROM emp WHERE empname = myname으로 선택;
발견되지 않은 경우
RAISE EXEPTION ''직원 %를 찾을 수 없습니다'', myname;
종료하면;
레코드/행 결과가 null인지 테스트하려면 다음을 사용할 수 있습니다.NULL임조건부. 있다, 그러나 추가 행이 있는지 여부를 알 수 있는 방법은 없습니다. 폐기되었습니다. 다음은 다음과 같은 경우를 처리하는 예입니다. 반환된 행이 없습니다.
선언
users_rec 기록;
전체 이름 varchar;
시작
SELECT INTO users_rec * FROM 사용자 WHERE user_id=3;
users_rec.homepage가 NULL인 경우
-- 사용자가 홈페이지를 입력하지 않은 경우 "http://"를 반환합니다.
반환 ''http://'';
종료하면;
끝;
때때로 표현식이나 쿼리를 평가하고 싶지만 결과를 폐기합니다(일반적으로 함수를 호출하기 때문에 유용한 부작용이 있지만 유용한 결과 값은 없습니다). 해야 할 일 이 안에PL/pgSQL, 다음을 사용하세요.수행성명:
수행질의;
이것은 실행됩니다질의, 이어야 합니다.선택문장 및 결과를 삭제합니다.PL/pgSQL변수는 평소와 같이 쿼리에서 대체됩니다. 또한, 특수 변수발견참으로 설정되었습니다 쿼리가 하나 이상의 행을 생성한 경우, 생성된 경우 false 행이 없습니다.
참고:그렇게 예상할 수도 있습니다.선택아니요INTO절은 이 결과를 달성하지만 현재는 허용되는 유일한 방법은 다음과 같습니다.수행.
예:
create_mv(''cs_session_page_requests_mv'', my_query) 수행;
종종 내부에서 동적 토토 사이트 순위을 생성하고 싶을 때가 있습니다 당신의PL/pgSQL함수, 그 즉, 다른 테이블이나 다른 테이블을 포함하는 토토 사이트 순위입니다. 실행될 때마다 데이터 유형이 표시됩니다.PL/pgSQL의 정상적인 캐시 계획 시도 이러한 시나리오에서는 토토 사이트 순위이 작동하지 않습니다. 이를 처리하려면 일종의 문제입니다.실행문장 제공됩니다:
실행토토 사이트 순위어-문자열;
어디에서토토 사이트 순위어-문자열은 문자열을 생성하는 표현식(유형)텍스트) 실행할 명령이 포함되어 있습니다. 이 문자열은 문자 그대로 SQL 엔진에 공급됩니다.
특히 다음을 대체할 수 없다는 점에 유의하세요.PL/pgSQL변수가 명령에서 수행되었습니다. 문자열. 변수 값은 명령에 삽입되어야 합니다. 생성된 문자열입니다.
동적 명령을 사용할 때 직면해야 할 문제는 다음과 같습니다. 작은따옴표 이스케이프 처리PL/pgSQL. 의 개요를 참조하세요.섹션 37.2.1, 그러면 노력을 덜 수 있습니다.
다른 모든 토토 사이트 순위과 달리PL/pgSQL,에 의해 실행되는 명령실행문이 준비되지 않았으며 방금 저장되었습니다. 세션 기간 동안 한 번. 대신 명령은 다음과 같습니다. 명령문이 실행될 때마다 준비됩니다. 명령 문자열은 작업을 수행하기 위해 함수 내에서 동적으로 생성됩니다. 변수 테이블과 열에.
다음의 결과선택명령 에 의해 삭제되었습니다.실행및선택현재 지원되지 않습니다 이내실행. 두 가지 방법이 있습니다. 동적으로 생성된 결과를 추출합니다.선택: 하나는를 사용하는 것입니다.실행 중에 설명된 루프 형식섹션 37.7.4, 다른 하나는 커서를실행 가능, 설명된 대로섹션 37.8.2.
예:
''UPDATE tbl SET'' 실행
|| quote_ident(열이름)
|| '' = ''
|| quote_literal(새 값)
|| '' 어디에서 ...'';
이 예는 함수 사용을 보여줍니다.quote_ident(텍스트)그리고quote_literal(텍스트).용
안전, 열 및 테이블 식별자가 포함된 변수
함수에 전달되어야 합니다.quote_ident. 다음 값을 포함하는 변수
생성된 명령의 리터럴 문자열이어야 합니다.
전달됨quote_literal. 둘 다
다음에 포함된 입력 텍스트를 반환하려면 적절한 단계를 수행하십시오.
특수 문자가 포함된 큰 따옴표 또는 작은 따옴표
문자가 올바르게 이스케이프되었습니다.
여기에 동적 토토 사이트 순위의 훨씬 더 큰 예가 있습니다.실행:
CREATE FUNCTION cs_update_referrer_type_proc() 정수 AS '를 반환합니다.
선언
Referrer_keys 기록; -- FOR에서 사용할 일반 레코드를 선언합니다.
a_output varchar(4000);
시작
a_output := ''기능 생성 cs_find_referrer_type(varchar, varchar, varchar)
varchar AS ''''를 반환합니다.
선언
$1에 대한 v_host 별칭;
$2에 대한 v_domain 별칭;
$3에 대한 v_url 별칭;
시작하다 '';
-- FOR 루프에서 쿼리 결과를 검색하는 방법에 주목하세요.
-- FOR <record 구문을 사용합니다.
FOR Referrer_keys IN SELECT * FROM cs_referrer_keys ORDER BY try_order LOOP
a_output := a_output || '' IF v_'' || Referrer_keys.kind || ''좋아요''''''''''
|| Referrer_keys.key_string || '''''''''' 그런 다음 ''''''를 반환합니다.
|| referrer_keys.referrer_type || ''''''; 종료 IF;'';
엔드 루프;
a_output := a_output || '' NULL을 반환합니다. 끝; '''' 언어 plpgsql;'';
a_output을 실행합니다.
끝;
' 언어 plpgsql;
토토 사이트 순위의 효과를 결정하는 방법에는 여러 가지가 있습니다. 첫 번째 방법은GET 진단명령, 형식은 다음과 같습니다.
진단 받기변수 = 항목 [ , ... ] ;
이 토토 사이트 순위은 시스템 상태 표시기를 검색할 수 있습니다. 각각항목키워드입니다 지정된 상태에 할당될 상태 값을 식별합니다. 변수(수신할 올바른 데이터 유형이어야 함) 그것). 현재 사용 가능한 상태 항목은 다음과 같습니다.ROW_COUNT, 처리된 행 수 마지막SQL토토 사이트 순위이 내려졌습니다 에SQL엔진 및RESULT_OID, 마지막 행의 OID 가장 최근에 삽입됨SQL토토 사이트 순위. 참고하세요RESULT_OID다음에만 유용합니다.삽입토토 사이트 순위.
예:
진단 받기 정수_var = ROW_COUNT;
명령의 효과를 결정하는 두 번째 방법은 이름이 지정된 특수 변수를 확인하려면발견, 유형은부울. 발견시작하다 각각 거짓PL/pgSQL함수 호출. 다음 각 유형에 의해 설정됩니다. 진술:
A 선택문 세트발견행을 반환하면 true, 행이 반환되지 않으면 false입니다.
A 수행문 세트발견만약 생산한다면 참입니다(그리고 삭제) 행, 생성된 행이 없으면 false입니다.
업데이트, 삽입및삭제문 세트발견다음인 경우 true 최소한 하나의 행이 영향을 받습니다. 행이 영향을 받지 않으면 false입니다.
A 가져오기문 세트발견행을 반환하면 true, 행이 반환되지 않으면 false입니다.
A for문 세트발견한 번 이상 반복되면 true, 그렇지 않으면 거짓입니다. 이는의 세 가지 변형 모두에 적용됩니다.for문장(정수for루프, 레코드 세트for루프 및 동적 레코드 세트for루프).발견다음의 경우에만 설정됩니다.for루프 종료: 루프 실행 내부에서,발견다음에 의해 수정되지 않습니다.for문은 다음에 의해 변경될 수 있지만 루프 본문 내에서 다른 문을 실행합니다.
발견는 지역 변수입니다. 어떤 변경 사항은 현재에만 영향을 미칩니다.PL/pgSQL함수.