이 섹션과 다음 섹션에서는 모든 것을 설명합니다. 명시 적으로 이해되는 진술 유형pl/pgsql. 하나로 인식되지 않은 것 이 명령문 유형은 SQL 쿼리로 추정되며 전송됩니다. 실행할 기본 데이터베이스 엔진에 (대체 후 어느pl/pgsql사용 된 변수 진술). 예를 들어, SQL삽입, 업데이트및삭제명령은로 간주 될 수 있습니다 진술pl/pgsql. 그러나 그들은 여기에 구체적으로 나열되어 있지 않습니다.
변수 또는 행/레코드 필드에 값을 할당 다음과 같이 작성되었습니다 :
식별자: =표현;
위에서 설명한 바와 같이, 그러한 진술의 표현은 다음과 같습니다. SQL을 통해 평가select기본 데이터베이스 엔진으로 전송 된 명령. 표현은해야합니다 단일 값을 산출하십시오.
표현식의 결과 데이터 유형이 일치하지 않으면 변수의 데이터 유형이거나 변수는 특정입니다 크기/정밀도 (forchar (20)), The 범퍼카 토토 값은에 의해 암시 적으로 변환됩니다.pl/pgsql범퍼카 토토를 사용한 통역사 유형의 출력 기능 및 변수 유형의 입력 기능. 이로 인해 런타임 오류가 발생할 수 있습니다 문자열 형태의 입력 함수에 의해 생성 된 범퍼카 토토 값은 입력 기능에 허용되지 않습니다.
예 :
user_id : = 20; 세금 : = 하위 토탈 * 0.06;
여러 열을 산출하는 선택 명령의 범퍼카 토토 (그러나 한 행만) 레코드 변수에 할당 할 수 있습니다. RowType 변수 또는 스칼라 변수 목록. 이것은 완료되었습니다 에 의해:
선택대상 표현From ...;
여기서대상레코드가 될 수 있습니다 변수, 행 변수 또는 쉼표로 구분 된 간단한 목록 변수 및 레코드/행 필드. 이것은 꽤 있습니다 와 다릅니다범퍼카 토토's 선택의 정상적인 해석, 즉 대상은 새로 생성 된 테이블입니다. (테이블을 만들려면 a 내부의 선택 결과에서pl/pgsql함수, 구문 사용테이블 작성 ... 선택.)
행 또는 변수 목록이 대상으로 사용되는 경우 선택한 값은 대상의 구조와 정확히 일치해야합니다. 런타임 오류가 발생합니다. 레코드 변수가 대상 인 경우 쿼리의 RowType에 자동으로 구성됩니다 결과 열.
into 절을 제외하고, select 문은 동일합니다. 정상적인 SQL 선택 쿼리로 선택하다.
선택 쿼리가 0 행을 반환하면 NULLS가 할당됩니다. 대상. 선택 쿼리가 여러 행을 반환하는 경우 첫 번째 행은 대상에 할당되고 나머지는 폐기. ("첫 번째 열"주문을 사용하지 않으면 잘 정의되지 않았습니다 에 의해.)
현재, 내 절은 거의 어디서나 나타날 수 있습니다. 선택 쿼리이지만 즉시 배치하는 것이 좋습니다. 위에서 설명한 선택 키워드 후. 미래 버전의pl/pgsql덜 용서할 수 있습니다 절편의 배치에 대해.
found of type이라는 특수 변수가 있습니다부울선택 직후에 사용할 수 있습니다 과제가 성공했는지 확인하기 위해 SELECT에 의해 하나의 행이 반환되었습니다). 예를 들어,
empname = myname에서 emp에서 myrec *로 선택하십시오. 찾을 수없는 경우 ``Employee % found '', myName 예외를 높이십시오. 끝 If;
또는 IS NULL (또는 ISNULL)을 사용할 수 있습니다. 레코드/행 범퍼카 토토의 무효를 테스트하는 조건부. 메모 추가 행이 있을지 알 수있는 방법이 없다고 버려졌습니다.
선언 user_rec 레코드; full_name varchar; 시작하다 user_id = 3 인 사용자에서 user_rec *로 선택하십시오. users_rec.homepage가 null이면 - 사용자는 홈페이지를 입력하지 않고 "http : //"를 반환합니다. ``http : // ''; 끝 IF; 끝;
때로는 표현식이나 쿼리를 평가하고 싶지만 결과를 버립니다 (일반적으로 함수를 호출하기 때문에 유용한 부작용은 있지만 유용한 결과 값은 없습니다). 할 일 이건pl/pgsql, 사용 성명서 :
공연쿼리;
이것은 a를 실행합니다.select 쿼리범퍼카 토토를 폐기합니다.pl/pgsql변수입니다 평소와 같이 쿼리로 대체되었습니다.
참고 :하나는 선택하지 않은 것을 기대할 수 있습니다 절은이 결과를 달성하지만 현재는이 결과를 달성 할 것입니다 수행 할 수있는 방법 만 수행됩니다.
예 :
create_mv ( ''cs_session_page_requests_mv ',' ' SELECT SENTER SENCED_ID, PAGE_ID, COUNT (*) AS N_HITS, sum (dwell_time)은 dwell_time으로, count (dwell_time)를 dwell_count로 카운트합니다 cs_fact_table에서 session_id, page_id '')에 의해 그룹 그룹
종종 내부에서 동적 쿼리를 생성하려고합니다 당신의pl/pgsql기능, 그 기능 다른 테이블이나 다른 쿼리입니다 실행할 때마다 데이터 유형.pl/pgsql의 정상적인 계획을 캐시하려는 시도 이러한 시나리오에서는 쿼리가 작동하지 않습니다. 이것을 처리합니다 일종의 문제, 실행 진술이 제공됩니다.
executeQuery-String;
여기서Query-Stringis 문자열을 산출하는 표현 (유형텍스트) 포함쿼리실행됩니다. 이 문자열은 공급됩니다 말 그대로 SQL 엔진에.
특히 대체가 없음pl/pgsql변수는 쿼리에서 수행됩니다 끈. 변수 값은 쿼리에 삽입되어야합니다. 구축 된 문자열.
동적 쿼리로 작업 할 때는 직면해야합니다. 단일 따옴표의 탈출pl/pgsql. 표를 참조하십시오.PostgreSQL : 문서 : 7.2 : Oracle 토토 꽁 머니/SQL에서 포팅자세한 당신에게 약간의 노력을 절약 할 수있는 설명.
다른 모든 쿼리와 달리pl/pgsql, a쿼리실행 명령문에 의해 실행되는 것은 아닙니다 서버 수명 동안 한 번만 준비하고 저장했습니다. 대신,쿼리준비되었습니다 명세서가 실행될 때마다. 그만큼Query-String동적으로 만들 수 있습니다 가변 테이블에서 작업을 수행하는 절차 내에서 전지.
Select Queries의 결과는 Execute에 의해 폐기됩니다. 그리고 Select Into는 현재 Execute 내에서 지원되지 않습니다. 그래서, 동적으로 만들어진 결과를 추출하는 유일한 방법 Select는 나중에 설명 된 execute for-execute 양식을 사용하는 것입니다.
예 :
실행 ''TBL SET 업데이트 '' || QUOTE_INDEN (FieldName) || ''= '' ' || quote_literal (newValue) || '' 어디 ...'';
이 예제는 기능의 사용을 보여줍니다QUOTE_INDEN
(텍스트) 및QUOTE_LITERAL
(텍스트). 필드 및 테이블을 포함하는 변수
식별자를 기능으로 전달해야합니다quote_ident ()
. 리터럴을 포함하는 변수
동적 쿼리 문자열의 요소를 전달해야합니다quote_literal ()
. 둘 다
단일로 동봉 된 입력 텍스트를 반환하기위한 적절한 단계
또는 이중 인용문 및 임베디드 특수 문자가 포함되어 있습니다
제대로 탈출.
동적 쿼리의 훨씬 더 큰 예가 있습니다. 실행하다:
함수 생성 CS_UPDATE_REFERRER_TYPE_PROC () 정수를 반환합니다. 선언하다 참조 _keys 레코드; - a에 사용할 일반 레코드를 선언하십시오. a_output varchar (4000); 시작하다 a_output : = ''기능 생성 CS_FIND_REFERRER_TYPE (Varchar, Varchar, Varchar) varchar를`` '' '로 반환합니다. 선언하다 $ 1의 V_host 별칭; V_Domain 별칭 $ 2; 3 달러에 대한 v_url 별칭; 시작하다 ''; - - 루프 용 쿼리 결과를 스캔하는 방법에 주목하십시오. - for <crecor 구성을 사용합니다. - select * in select * from cs_referrer_keys writ_order loop의 referrer_keys 용. a_output : = a_output || ''v_ ''|| referrer_keys.kind || '' 좋다 '''''''''' || referrer_keys.key_string || `` '' '' '' '' ''그런 다음‘ '' '' ' || referrer_keys.referrer_type || '' '' '';; 끝 If; ''; 엔드 루프; a_output : = a_output || ``return null; 끝; '' ''언어 '' 'PLPGSQL' '' ';' '; - 변수를 대체하지 않기 때문에 작동합니다. - 그렇지 않으면 실패합니다. 기능을 실행하는 다른 방법으로 수행하십시오 a_output를 실행하십시오. 끝; '언어'plpgsql ';
진단 받기변수=항목[ , ... ];
이 명령은 시스템 상태 표시기를 검색 할 수 있습니다.
각항목는 키워드입니다
지정된 상태에 할당 할 상태 값 식별
변수 (수신하기에 적합한 데이터 유형이어야합니다.
그것). 현재 사용 가능한 상태 항목은row_count
,
마지막SQL쿼리가 전송됩니다
그만큼SQL엔진; 그리고result_oid
, 마지막의 OID
가장 최근에 삽입 된 행SQL쿼리. 참고result_oid
삽입 후에 만 유용합니다
질문.