Postgresql 9.1.24 문서화 | ||||
---|---|---|---|---|
토토 결과 : 문서 : 9.1 : pl/perl의 데이터 값 | up | 41 장. pl/perl -Perl Prossural Language | 사설 토토 사이트 : 문서 : 9.1 : 사설 토토 사이트/perl의 글로벌 값 |
Perl 토토 꽁 머니에서 데이터베이스 자체에 대한 액세스 다음 토토 꽁 머니을 통해 수행 :
SPI_EXEC_QUERY
(쿼리[,Max-Rows])SPI_EXEC_QUERYSQL 명령 및 전체 행 세트를 참조로 토토 꽁 머니합니다. 해시 참조 배열에.이 명령 만 사용해야합니다 결과 세트가 비교적 작은.다음은 쿼리의 예입니다 (select명령) 옵션 최대 값 행 수 :
$ rv = spi_exec_query ( 'select * from my_table', 5);
테이블에서 최대 5 행을 토토 꽁 머니my_table. 만약에my_table열이 있습니다my_column, 당신은 그 값을 행에서 얻을 수 있습니다$ i다음과 같은 결과의 :
$ foo = $ rv- rows [$ i]- my_column;
a에서 토토 꽁 머니 된 총 행 수select쿼리에 액세스 할 수 있습니다 이것:
$ nrows = $ rv- processed
다음은 다른 명령 유형을 사용하는 예입니다.
$ query = "my_table 값에 삽입 (1, 'test')"; $ rv = spi_exec_query ($ query);
그런 다음 명령 상태에 액세스 할 수 있습니다 (예 :SPI_OK_INSERT) :
$ res = $ rv- status;
영향을받는 행의 수를 얻으려면 :
$ nrows = $ rv- processed;
여기에 완전한 예가 있습니다 :
테이블 테스트 생성 ( 나는 int, v varchar ); 테스트에 삽입 (i, v) 값 (1, 'First Line'); 테스트에 삽입 (i, v) 값 (2, '두 번째 줄'); 테스트에 삽입 (i, v) 값 (3, '세 번째 줄'); 테스트에 삽입 (i, v) 값 (4, '불멸'); 함수 생성 또는 교체 test_munge () setof test를 $$로 토토 꽁 머니합니다. my $ rv = spi_exec_query ( 'select i, v test;'); 내 $ 상태 = $ rv- status; my $ nrows = $ rv- proceded; foreach my $ rn (0 .. $ nrows -1) 내 $ row = $ rv- rows [$ rn]; 정의 된 경우 $ row- i += 200 ($ row- i); $ row- v = ~ tr/a-za-z/a-za-z/if (정의 ($ row- v)); return_next ($ 행); Undef를 토토 꽁 머니하십시오. $$ 언어 plperl; 선택 *에서 test_munge ();에서 선택하십시오.
SPI_QUERY (명령)
spi_fetchrow (커서)
SPI_CURSOR_CLOSE (커서)
SPI_QUERY및spi_fetchrow쌍으로 함께 일하십시오 큰 행 세트 또는 큰 경우 그들이 도착하면서 줄을 돌려주고 싶다.spi_fetchrowWorks전용withSPI_QUERY. 다음 예 함께 사용하는 방법을 설명합니다.
foo_type 유형 생성 (the_num integer, the_text 텍스트); 함수 생성 또는 교체 lota_md5 (정수) foo_type를 $$로 설정합니다. 다이제스트 사용 :: MD5 QW (MD5_HEX); 내 $ file = '/usr/share/dict/words'; 내 $ t = localtime; elog (통지, "$ t에서 $ 파일 열기"); 내 $ fh, '<', $ 파일 # ooh, 파일 액세스 권한입니다! 또는 elog (오류, "읽기를 위해 $ 파일을 열 수 없습니다 : $!"); 내 @words = <$ fh; 닫기 $ FH; $ t = LocalTime; elog (통지, "닫힌 파일 $ 파일 at $ t"); chomp (@words); 내 $ 행; my $ sh = spi_query ( "select * from generate_series (1, $ _ [0])로 b (a)"); while (정의 ($ row = spi_fetchrow ($ sth))) return_next ( the_num = $ row- a, the_text = md5_Hex ($ word [rand @words]) ); 반품; $$ 언어 plperlu; lota_md5 (500)에서 *를 선택하십시오.
정상적으로,spi_fetchrow
토토 꽁 머니 될 때까지 반복해야합니다undef, 더 이상 없음을 나타냅니다
읽을 행. 커서는SPI_QUERYspi_fetchrow
토토 꽁 머니undef. 원하지 않는다면
모든 행을 읽고 대신 전화SPI_CURSOR_CLOSE
커서를 제거합니다.
그렇게하지 않으면 메모리 누출이 발생합니다.
SPI_PREPARE (명령, 인수 유형)
SPI_QUERY_PREPARED (plan, 인수)
spi_exec_prepared (plan[,속성],인수)
SPI_FreePlan (plan)
SPI_PREPARE, SPI_QUERY_PREPARED, spi_exec_prepared및SPI_FreePlan동일하게 구현하십시오 기능이지만 준비된 쿼리의 경우SPI_PREPARE쿼리 문자열을 수락합니다 번호가 매겨진 인수 장소 보유자 ($ 1, $ 2 등) 및 문자열 인수 유형 목록 :
$ plan = spi_prepare ( '선택 *에서 id $ 1 및 name = $ 2', '정수', '텍스트');
일단 쿼리 계획이 전화로 준비되면SPI_PREPARE, 대신 계획을 사용할 수 있습니다 문자열 쿼리의spi_exec_prepared, 여기서 결과는 토토 꽁 머니 된 것과 동일SPI_EXEC_QUERY또는 inSPI_QUERY_PREPARED커서를 토토 꽁 머니합니다 정확히SPI_QUERY나중에 전달 될 수 있습니다spi_fetchrow. 선택적 두 번째 매개 변수spi_exec_prepared속성의 해시 참조입니다. 유일한 속성 현재 지원되는 것은Limit, 다음으로 토토 꽁 머니 한 최대 행 수를 설정합니다. 질문.
준비된 쿼리의 장점은 바로 그 것입니다 하나 이상의 쿼리에 하나의 준비된 계획을 사용할 수 있습니다. 실행. 계획이 더 이상 필요하지 않은 후에는 가능합니다 와 함께 해방SPI_FreePlan:
함수 생성 또는 교체 init ()는 void를 $$로 토토 꽁 머니합니다 $ _shared my_plan = spi_prepare ( 'select (now (now () + $ 1) :: 날짜와 같이 날짜', '간격'); $$ 언어 plperl; 함수 생성 또는 교체 add_time (간격) 텍스트를 $$로 토토 꽁 머니합니다. 토토 꽁 머니 spi_exec_prepared ( $ _shared my_plan, $ _ [0] )- rows- [0]- now; $$ 언어 plperl; function doid ()를 작성하거나 바꾸십시오 spi_freeplan ($ _shared my_plan); undef $ _shared my_plan; $$ 언어 plperl; init (); add_time ( '1 일'), add_time ( '2 일'), add_time ( '3 일')을 선택하십시오. select done (); add_time | add_time | add_time ------------+------------+------------ 2005-12-10 | 2005-12-11 | 2005-12-12
매개 변수 첨자SPI_PREPARE$ 1, $ 2, $ 3을 통해 정의됩니다. 등, 쿼리 문자열을 이중 인용문으로 선언하지 마십시오 그것은 쉽게 캐치하기 어려운 버그로 이어질 수 있습니다.
다른 예제는 선택 사항의 사용법을 보여줍니다 매개 변수spi_exec_prepared:
선택 ID로 테이블 호스트를 작성하십시오. ( '192.168.1.'|| id) :: inet Generate_Series (1,3)에서 ID로; function init_hosts_query () 함수를 만들거나 바꾸십시오 $ _shared plan = spi_prepare ( 'select * from hosts 여기서 주소 << $ 1 ','inet '); $$ 언어 plperl; 함수 생성 또는 교체 토토 꽁 머니 spi_exec_prepared ( $ _shared plan, limit = 2, $ _ [0] )- rows; $$ 언어 plperl; 함수 release_hosts_query ()를 만들거나 바꾸십시오 spi_freeplan ($ _ shared plan); undef $ _shared plan; $$ 언어 plperl; init_hosts_query ()를 선택하십시오. select query_hosts ( '192.168.1.0/30'); 릴리스 릴리 _hosts_query (); query_hosts ------------------ (1,192.168.1.1) (2,192.168.1.2) (2 줄)
elog (레벨,
MSG)
로그 또는 오류 메시지를 방출합니다. 가능한 레벨은디버그, log, info, 통지, 경고및오류. 오류오류 조건을 제기합니다. 이것이 갇히지 않으면 주변 Perl 코드, 오류가 전파됩니다 쿼리 호출, 현재 트랜잭션을 유발합니다 삭제되는 차트 조정. 이것은 사실상입니다 perl과 동일다이명령. 다른 수준은 다른 메시지 만 생성합니다 우선 순위 수준. 특정 메시지 여부 우선 순위는 고객에게보고됩니다 서버 로그 또는 둘 다에 의해 제어됩니다.log_min_messagesandclient_min_messages구성 변수. 보다18 장더 많은 정보.
quote_literal (String)
주어진 문자열을 토토 꽁 머니하여
SQL 문 문자열의 문자열 문자. 내장
단일 크기와 백 슬래시가 제대로 두 배가됩니다. 메모
저것quote_literal
토토 꽁 머니
undef 입력에 대한 undef; 논쟁이 undef 일 수 있다면QUOTE_NULLABLE
종종입니다
더 적합합니다.
QUOTE_NULLABLE (String)
주어진 문자열을 토토 꽁 머니하여 SQL 문 문자열의 문자열 문자; 또는 만약 인수는 undef입니다. 인용되지 않은 문자열 "null"을 토토 꽁 머니하십시오. 내장 단일 크기와 백 슬래시가 올바르게 있습니다 두 배
quote_ident (String)
주어진 문자열을 토토 꽁 머니하여 SQL 문 문자열의 식별자. 인용문은입니다 필요한 경우에만 추가하십시오 (즉, 문자열에 포함 된 경우 비 식별 자 문자 또는 사례 전달). 임베디드 따옴표가 제대로 두 배가되었습니다.
decode_bytea (String)
주어진 문자열의 내용.BYTEA인코딩.
encode_bytea (String)
토토 꽁 머니BYTEA인코딩 된 형태 주어진 문자열의 이진 데이터 내용.
encode_array_literal (배열)
encode_array_literal (배열, Delimiter)
참조 배열의 내용을 a로 토토 꽁 머니합니다 배열 문자 문자 문자열 문자형 형식 (참조섹션 8.14.2). 보고 인수 값은 변경되지 않은 경우 배열. 원소들 사이에 사용 된 구분 기 배열 문자 기본 불이행 "," 구분 기자가 지정되지 않았거나 undef.
encode_typed_literal (value, typename)
Perl 변수를 데이터 유형 값으로 변환합니다. 두 번째 인수로 통과하고 문자열을 토토 꽁 머니합니다 이 값의 표현. 중첩 된 것을 올바르게 처리합니다 복합 유형의 배열 및 값.
encode_array_constructor (배열)
참조 배열의 내용을 a로 토토 꽁 머니합니다
배열 생성자 형식의 문자열 (참조섹션
4.2.12). 개별 값은를 사용하여 인용합니다.QUOTE_NULLABLE
. 토토 꽁 머니합니다
인용 값, 사용QUOTE_NULLABLE
, 참조가 아닌 경우
배열로.
Look_Ike_Number (String)
주어진 내용이있는 경우 진정한 값을 토토 꽁 머니합니다. Perl에 따르면 문자열은 숫자처럼 보입니다 그렇지 않으면 거짓. 인수가 undef 인 경우 undef를 토토 꽁 머니합니다. 선도 및 후행 공간은 무시됩니다.inf및Infinity숫자로 간주됩니다.
is_array_ref (인수)
주어진 인수가있을 경우 진정한 값을 토토 꽁 머니합니다. 배열 참조로 취급, 즉, 즉 인수는배열또는토토 꽁 머니 :: inserver :: array. 거짓을 토토 꽁 머니합니다 그렇지 않으면.