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