이 섹션과 다음 섹션에서는 모든 것을 설명합니다. 명시 적으로 이해되는 진술 유형pl/pgsql. 하나로 인식되지 않은 것 이 진술 유형은 SQL 명령으로 추정되며 기본 데이터베이스 엔진으로 전송하여 실행 (대체 후 어떤pl/pgsql사용 된 변수 성명서에서). 예를 들어, SQL 명령삽입, 업데이트및삭제로 간주 될 수 있습니다 토토 사이트 순위pl/pgsql, 그러나 그들은 여기에 구체적으로 나열되어 있지 않습니다.
변수 또는 행/레코드 필드에 값을 할당 다음과 같이 작성되었습니다 :
식별자: =표현;
위에서 설명한 바와 같이, 그러한 진술의 표현은 다음과 같습니다. SQL을 통해 평가select기본 데이터베이스 엔진으로 전송 된 명령. 표현은해야합니다 단일 값을 산출하십시오.
표현식의 결과 데이터 유형이 일치하지 않으면 변수의 데이터 유형이거나 변수는 특정입니다 크기/정밀도 (예 :char (20)), The 결과 값은에 의해 암시 적으로 변환됩니다.pl/pgsql결과를 사용한 통역사 유형의 출력 기능 및 변수 유형의 입력 기능. 이로 인해 런타임 오류가 발생할 수 있습니다 문자열 형태의 입력 함수에 의해 생성 된 결과 값은 입력 기능에 허용되지 않습니다.
예 :
user_id : = 20; 세금 : = 하위 토탈 * 0.06;
A의 결과select명령 여러 열 (단 하나의 행만)을 할당 할 수 있습니다. 레코드 변수, 행 형 변수 또는 스칼라 목록 변수. 이것은 :에 의해 수행됩니다.
선택대상 select_expressionsFrom ...;
여기서대상레코드가 될 수 있습니다 변수, 행 변수 또는 쉼표로 구분 된 간단한 목록 변수 및 레코드/행 필드. 그만큼select_expressions그리고 나머지 명령은 일반 SQL과 동일합니다.
이것은와는 상당히 다릅니다.PostgreSQL의 정상적인 해석선택, 여기서in대상은 새로 생성 된 테이블입니다. 당신이 A에서 테이블을 만들고 싶습니다.select내부의 결과pl/pgsql함수, 구문 사용테이블 생성 ... at select.
행 또는 가변 목록이 대상으로 사용되는 경우 선택한 값은 대상의 구조와 정확히 일치해야합니다. 런타임 오류가 발생합니다. 레코드 변수가 대상 인 경우 쿼리의 행 유형에 자동으로 구성됩니다. 결과 열.
제외in조항,select명령문은 a와 동일합니다 일반 SQLselect명령 및 사용할 수 있습니다 완전한 힘.
쿼리가 0 행을 반환하면 NULL 값이 할당됩니다. 대상. 쿼리가 여러 행을 반환하면 첫 번째 행은 대상에 할당되고 나머지는 폐기됩니다. ("첫 번째 줄"그렇지 않습니다 사용하지 않는 한 잘 정의 됨주문 에 의해.)
현재,in절의 캔 거의 거의 어디에나 나타납니다.selectstatement이지만 즉시 배치하는 것이 좋습니다. 그만큼select위에서 묘사 된 주요 단어. 미래 버전의pl/pgsql배치에 대해 덜 용서할 수 있습니다in절.
사용할 수 있습니다발견직후 에이선택결정할 문 과제가 성공했는지 여부 (즉, 적어도 하나는 쿼리에 의해 행이 반환되었습니다). 예를 들어:
Empname = myName; 찾을 수없는 경우 ``Employee % found '', myName 예외를 높이십시오. 끝 If;
레코드/행 결과가 null인지 테스트하려면 사용할 수 있습니다. 그만큼is null조건부. , 그러나 추가 행이있을 수 있는지 알 수있는 방법은 없습니다. 버려졌습니다. 다음은 사건을 처리하는 예입니다 줄이 반환되지 않았습니다 :
선언 user_rec 레코드; full_name varchar; 시작하다 user_id = 3 인 사용자에서 user_rec *로 선택하십시오. users_rec.homepage가 null이면 - 사용자는 홈페이지를 입력하지 않고 "http : //"를 반환합니다. ``http : // ''; 끝 IF; 끝;
때로는 표현식이나 쿼리를 평가하고 싶지만 결과를 버립니다 (일반적으로 함수를 호출하기 때문에 유용한 부작용은 있지만 유용한 결과 값은 없습니다). 할 일 이건pl/pgsql, 사용공연토토 사이트 순위 :
공연쿼리;
이것은 실행쿼리select토토 사이트 순위 및 결과를 버립니다.pl/pgsql변수는 평소와 같이 쿼리에 대체됩니다. 또한, 특별 변수발견는 true로 설정되었습니다 쿼리가 생성 된 경우 적어도 하나의 행 또는 거짓을 생성 한 경우 줄 없음.
참고 :하나는 기대할 수 있습니다selectin절은이 결과를 달성하지만 현재는이 결과를 달성 할 것입니다 그것을 받아들이는 방법 만공연.
예 :
create_mv ( ''cs_session_page_requests_mv ', my_query); 수행
종종 내부에서 동적 명령을 생성하고 싶을 것입니다 당신의pl/pgsql기능, 그 기능 다른 테이블이나 다른 명령 데이터 유형이 실행 될 때마다.pl/pgsql의 정상적인 계획을 캐시하려는 시도 그러한 시나리오에서 명령이 작동하지 않습니다. 이것을 처리합니다 일종의 문제,execute토토 사이트 순위 제공됩니다 :
executeCommand-string;
여기서Command-stringis 문자열을 산출하는 표현 (유형텍스트) 실행하라는 명령을 포함합니다. 이것 문자열은 문자 그대로 SQL 엔진에 공급됩니다.
특히 대체가 없음pl/pgsql변수는 명령에서 수행됩니다 끈. 변수 값은 명령에 삽입되어야합니다. 구축 된 문자열.
동적 명령으로 작업 할 때는 직면해야합니다. 단일 따옴표의 탈출pl/pgsql. 개요를 참조하십시오섹션 37.2.1, 당신에게 약간의 노력을 절약 할 수 있습니다.
다른 모든 명령과 달리pl/pgsql, A가 실행하는 명령execute토토 사이트 순위은 준비되고 저장되지 않았습니다 세션의 삶에 한 번. 대신, 명령은입니다 토토 사이트 순위이 실행될 때마다 준비됩니다. 명령 문자열은 할 수 있습니다 작업을 수행하기 위해 함수 내에서 동적으로 생성됩니다 가변 테이블 및 열에서.
결과의 결과select명령 에 의해 폐기됩니다.execute및선택현재 지원되지 않습니다 이내에execute. 두 가지 방법이 있습니다 동적으로 만들어진 결과에서 결과를 추출하십시오select: 하나는를 사용하는 것입니다.for-in-execute루프 양식에 설명 된섹션 37.7.4, 다른 하나는와 함께 커서를 사용하는 것입니다.Open-for-Execute, 설명대로섹션 37.8.2.
예 :
execute ''update tbl set '' ' || quote_ident (colname) || ''= '' ' || quote_literal (newValue) || '' 어디 ...'';
이 예제는 함수 사용을 보여줍니다quote_ident (텍스트)
andquote_literal (텍스트)
.안전, 열 및 테이블 식별자를 포함하는 변수
기능으로 전달되어야합니다QUOTE_INDEN
. 값을 포함하는 변수
구성된 명령의 문자 그대로의 문자열이어야합니다.
전달quote_literal
. 둘 다
동봉 된 입력 텍스트를 반환하기 위해 적절한 단계를 수행하십시오.
임의의 임베드 된 스페셜과 함께 이중 또는 단일 따옴표
캐릭터가 제대로 탈출했습니다.
동적 명령의 훨씬 더 큰 예가 있습니다.execute:
함수 생성 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이후에만 유용합니다삽입명령.
예 :
진단 받기 integer_var = row_count;
명령의 효과를 결정하는 두 번째 방법은 이름이 지정된 특수 변수를 확인하려면발견, 유형의부울. 발견시작합니다 각각의 거짓pl/pgsql함수 호출. 다음 유형의 각 유형에 의해 설정됩니다. 토토 사이트 순위 :
a선택명령문 세트발견행을 반환하는 경우 True 행이 반환되지 않으면 false.
a공연명령문 세트발견그것이 생산하는 경우 (및 소실) 행, 행이 생성되지 않으면 거짓.
업데이트, 삽입및삭제토토 사이트 순위 세트발견true if at 최소 한 행에 영향을 받고 행이 영향을받지 않으면 거짓입니다.
aFetch토토 사이트 순위 세트발견행을 반환하는 경우 True 행이 반환되지 않으면 false.
afor토토 사이트 순위 세트발견하나 이상을 반복하면 참이되면, 그렇지 않으면 거짓. 이것은의 세 가지 변형에 모두 적용됩니다.forStatement (Integerfor루프, 레코드 세트for루프 및 동적 레코드 세트for루프).발견|for루프 종료 : 루프 실행 내부,발견for토토 사이트 순위은 변경 될 수 있지만 루프 본체 내에서 다른 토토 사이트 순위의 실행.
발견는 로컬 변수입니다. 어느 그것에 대한 변경은 현재에만 영향을 미칩니다PL/PGSQL기능.