이 섹션과 다음 섹션에서는 모든 것을 설명합니다. 명시 적으로 이해되는 진술 유형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토토 핫 및 사용할 수 있습니다 완전한 힘.
theinto조항이 거의 나타날 수 있습니다 어디서나select진술. 관습 적으로 그것은 바로 후에 작성되었습니다.select위에 표시된대로 또는 바로From- 즉, 바로 직전이나 바로 그 자리입니다 목록select_expressions.
쿼리가 0 행을 반환하면 NULL 값이 할당됩니다. 대상. 쿼리가 여러 행을 반환하면 첫 번째 행은 대상에 할당되고 나머지는 폐기됩니다. ("첫 번째 줄"그렇지 않습니다 사용하지 않는 한 잘 정의 됨주문 에 의해.)
스페셜을 확인할 수 있습니다발견변수 (참조섹션 36.6.6) A 이후선택과제가 성공했는지 여부를 결정하기위한 진술, 즉, 적어도 하나의 행이 쿼리에 의해 반환되었습니다. 을 위한 예:
empname = myname에서 emp에서 myrec *로 선택하십시오. 찾을 수없는 경우 예외 '직원 % 찾을 수 없음', MyName; 끝 If;
레코드/행 결과가 null인지 테스트하려면 사용할 수 있습니다. 그만큼is null조건부. , 그러나 추가 행이있을 수 있는지 알 수있는 방법은 없습니다. 버려졌습니다. 다음은 사건을 처리하는 예입니다 줄이 반환되지 않았습니다 :
선언 user_rec 레코드; 시작하다 user_id = 3 인 사용자에서 user_rec *로 선택하십시오. users_rec.homepage가 null이면 - 사용자는 홈페이지를 입력하지 않고 "http : //"를 반환합니다. 반환 'http : //'; 끝 IF; 끝;
때로는 표현식이나 쿼리를 평가하고 싶지만 결과를 버립니다 (일반적으로 함수를 호출하기 때문에 유용한 부작용은 있지만 유용한 결과 값은 없습니다). 할 일 이건pl/pgsql, 사용공연진술 :
공연쿼리;
이것은 실행쿼리및 결과를 버립니다. 쓰기쿼리SQL과 같은 방식select토토 핫이지만 교체하십시오 초기 키워드selectwith공연. pl/pgsql변수가 대체됩니다 평소와 같이 쿼리로. 또한 특수 변수발견17452_17545
참고 :하나는 기대할 수 있습니다selectNOin절은이 결과를 달성하지만 현재는이 결과를 달성 할 것입니다 그것을 받아들이는 방법 만공연.
예 :
create_mv를 수행합니다 ( 'CS_SESSION_PAGE_REQUESTS_MV', MY_QUERY);
때때로 아무것도하지 않는 자리 표시 자 성명서 유용한. 예를 들어, 하나의 팔이 /then/else 체인이 의도적으로 비어 있습니다. 이를 위해 사용하십시오 그만큼NULL진술 :
null;
예를 들어, 다음 두 조각의 코드는입니다 동등한:
시작 Y : = x / 0; 예외 Division_by_zero가있을 때 널; - 오류를 무시하십시오 끝;
시작 Y : = x / 0; 예외 Division_By_Zero 일 때 - 오류를 무시하십시오 끝;
바람직한 맛의 문제입니다.
참고 :Oracle의 PL/SQL에서 빈 명령문 목록 허용되지 않습니다.null진술은필수그러한 상황 이로.pl/pgsql허용 당신은 그냥 아무것도 쓰지 않고 대신.
종종 내부에서 동적 토토 핫을 생성하고 싶을 것입니다 당신의pl/pgsql기능, 그 기능 다른 테이블이나 다른 토토 핫 데이터 유형이 실행 될 때마다.pl/pgsql의 정상적인 계획을 캐시하려는 시도 그러한 시나리오에서 토토 핫이 작동하지 않습니다. 이것을 처리합니다 일종의 문제,execute진술 제공됩니다 :
executeCommand-string[into대상];
여기서Command-stringis 문자열을 산출하는 표현 (유형텍스트) 실행 할 토토 핫을 포함하고대상레코드 변수입니다. 행 변수 또는 간단한 변수의 쉼표로 구분 된 목록 및 레코드/행 필드.
특히 대체가 없음pl/pgsql변수는 명령에서 수행됩니다 끈. 변수 값은 명령에 삽입되어야합니다. 구축 된 문자열.
다른 모든 토토 핫과 달리pl/pgsql, A가 실행하는 토토 핫execute진술은 준비되고 저장되지 않았습니다 세션의 삶에 한 번. 대신, 명령은입니다 진술이 실행될 때마다 준비됩니다. 명령 문자열은 할 수 있습니다 작업을 수행하기 위해 함수 내에서 동적으로 생성됩니다 다른 테이블과 열에.
thein조항은 위치를 지정합니다 A의 결과select토토 핫이 있어야합니다 할당된. 행 또는 가변 목록이 제공되면 에 의해 생성 된 결과의 구조와 정확히 일치합니다.select(레코드 변수가있을 때 중고, 결과 구조와 일치하도록 자체적으로 구성됩니다. 자동으로). 여러 행이 반환되면 첫 번째 행만이 반환됩니다 에 할당됩니다.into변수. 행이 반환되지 않으면 NULL이에 할당됩니다.into변수. 그렇지 않은 경우into조항이 지정되어 있습니다.select토토 핫은 폐기됩니다.
선택현재는 아닙니다 지원execute.
동적 명령으로 작업 할 때 종종 단일 따옴표의 탈출을 처리합니다. 권장 방법 기능 본문에서 고정 텍스트를 인용하는 것은 달러 인용입니다. (만약에 달러 인용문을 사용하지 않는 레거시 코드가 있습니다. 개요를 참조하십시오.섹션 36.2.1, 번역 할 때 약간의 노력을 절약 할 수 있습니다 더 합리적인 체계에 대한 코드.)
구성에 삽입 할 동적 값 쿼리는 스스로 할 수 있기 때문에 특별한 취급이 필요합니다 인용 문자를 포함합니다. 예제 (이것은 당신이 생각합니다 기능 전체에 대한 달러 인용 사용이므로 인용문 마크는 두 배가 될 필요가 없습니다) :
실행 'TBL 세트 업데이트' || quote_ident (colname) || '=' || quote_literal (newValue) || 'key =' || quote_literal (keyvalue);
이 예제는의 사용을 보여줍니다.QUOTE_INDEN
andquote_literal
함수. 안전을 위해
열 및 테이블 식별자를 포함하는 표현식이 있어야합니다
전달QUOTE_INDEN
.
문자 그대로 문자열이어야하는 값을 포함하는 표현
구성 명령은로 전달되어야합니다.quote_literal
. 둘 다 적절한 것을 취합니다
이중 또는 단일로 둘러싸인 입력 텍스트를 반환하는 단계
내장 된 특수 문자와 함께 각각 인용합니다
제대로 탈출.
달러 견적은 고정 인용에만 유용합니다. 텍스트. 위의 일을 시도하는 것은 매우 나쁜 생각입니다. 예제 as
실행 'TBL 세트 업데이트' || quote_ident (colname) || '= $$' || NewValue || '$$ key =' || quote_literal (keyvalue);
의 내용이 끊어지기 때문에NewValue$$. 같은 반대는 다른 반대에 적용됩니다
당신이 선택할 수있는 달러 인용 분리기. 따라서 안전하게 인용합니다
미리 알려지지 않은 텍스트, 당신은필수useQUOTE_LITERAL
.
동적 토토 핫의 훨씬 더 큰 예와execute예 36-6, a를 구축하고 실행합니다.생성 기능새 함수를 정의하려는 토토 핫.
토토 핫의 효과를 결정하는 몇 가지 방법이 있습니다. 첫 번째 방법은를 사용하는 것입니다.진단COMMAND, 여기에는 양식이 있습니다.
진단 받기변수=항목[ , ... ];
이 토토 핫은 시스템 상태 표시기를 검색 할 수 있습니다. 각항목는 핵심 단어입니다 지정된 상태에 할당 할 상태 값 식별 변수 (수신하기에 적합한 데이터 유형이어야합니다. 그것). 현재 사용 가능한 상태 항목은row_count, 마지막SQL토토 핫이 다운되었습니다SQL엔진 및result_oid, 마지막 행의 OID 가장 최근에 삽입SQL토토 핫. 참고result_oid이후에만 유용합니다삽입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함수; 어느 그것에 대한 변경은 현재 함수에만 영향을 미칩니다.