Postgresql 8.4.22 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 40. 롤 토토/Perl - Ngôn ngữ thủ tục Perl | Chuyển tiếp nhanh | NEXT |
Truy cập vào cơ sở dữ liệu từ chức năng Perl của bạn có thể thực hiện thông qua các chức năng sau:
spi_exec_query
(Truy vấn[,Max-Rows])spi_exec_queryThực hiện SQL lệnh và trả về toàn bộ hàng được đặt làm tham chiếu đến một Mảng tham chiếu băm.Bạn chỉ nên sử dụng lệnh này Khi bạn biết rằng tập kết quả sẽ tương đối bé nhỏ.Đây là một ví dụ về truy vấn (ChọnLệnh) với mức tối đa tùy chọn Số lượng hàng:
$ rv = spi_exec_query ('select * from my_table', 5);
Điều này trả về tối đa 5 hàng từ bảngmy_table. Nếu nhưmy_tablecó cộtmy_column, bạn có thể nhận được giá trị đó từ hàng$ icủa kết quả như thế này:
$ foo = $ rv- hàng [$ i]- my_column;
Tổng số hàng được trả về từ AChọnTruy vấn có thể được truy cập như thế này:
$ NROWS = $ RV- đã xử lý
Đây là một ví dụ sử dụng loại lệnh khác:
$ query = "chèn vào các giá trị my_table (1, 'test')"; $ rv = spi_exec_query ($ query);
Sau đó, bạn có thể truy cập trạng thái lệnh (ví dụ:spi_ok_insert) Như thế này:
$ res = $ rv- status;
Để có số lượng hàng bị ảnh hưởng, làm:
$ NROWS = $ RV- đã xử lý;
Đây là một ví dụ hoàn chỉnh:
Tạo bài kiểm tra bảng ( Tôi int, v varchar ); Chèn vào các giá trị kiểm tra (i, v) (1, 'dòng đầu tiên'); Chèn vào các giá trị kiểm tra (i, v) (2, 'dòng thứ hai'); Chèn vào các giá trị kiểm tra (i, v) (3, 'dòng thứ ba'); Chèn vào các giá trị kiểm tra (i, v) (4, 'bất tử'); Tạo hoặc thay thế chức năng test_munge () trả về kiểm tra setof dưới dạng $$ $ rv của tôi = spi_exec_query ('chọn i, v từ thử nghiệm;'); $ status của tôi = $ rv- status; $ nROWS = $ RV- đã xử lý; foreach của tôi $ rn (0 .. $ nROWS - 1) $ row của tôi = $ rv- hàng [$ rn]; $ row- i += 200 nếu được xác định (hàng $- i); $ row- v = ~ tr/a-za-z/a-za-z/if (xác định ($ row- v)); return_next ($ hàng); trả lại Undef; $$ Ngôn ngữ plperl; Chọn * từ test_munge ();
spi_query
(lệnh)spi_fetchrow
(con trỏ)spi_cursor_close
(con trỏ)spi_queryvàspi_fetchrowLàm việc cùng nhau như một cặp cho hàng các bộ có thể lớn hoặc cho các trường hợp bạn muốn trả lại hàng khi chúng đến.spi_fetchrowWorkschỉvớispi_query. Ví dụ sau minh họa Cách bạn sử dụng chúng cùng nhau:
Tạo loại foo_type as (The_num Integer, The_Text Text); Tạo hoặc thay thế chức năng Lô_MD5 (Số nguyên) Trả về setof foo_type dưới dạng $$ Sử dụng Digest :: MD5 QW (MD5_HEX); $ file của tôi = '/usr/share/dict/words'; $ T = địa phương của tôi; ELOG (Thông báo, "Mở tệp $ Tệp tại $ T"); Mở $ fh của tôi, '<', $ file # ooh, đó là một truy cập tệp! hoặc elog (lỗi, "không thể mở tệp $ để đọc: $!"); my @words = <$ fh; đóng $ fh; $ t = địa phương; ELOG (Thông báo, "Tệp đóng $ Tệp tại $ T"); Chomp (@words); hàng $ của tôi; $ STH = spi_Query của tôi ("Chọn * từ Generate_Series (1, $ _ [0]) là B (a)"); while (được xác định ($ row = spi_fetchrow ($ sth))) return_next ( The_num = $ $ Row- A, The_Text = md5_hex ($ words [rand @words]) ); trở lại; $$ plperlu ngôn ngữ; Chọn * từ LOTEA_MD5 (500);
Thông thường,spi_fetchrow
nên được lặp lại cho đến khi nó trả vềUndef, chỉ ra rằng không còn
Hàng để đọc. Con trỏ được trả về bởiSPI_Queryđược tự động giải phóng khispi_fetchrow
returnUndef. Nếu bạn không muốn đọc
tất cả các hàng, thay vào đó gọispi_cursor_close
Để giải phóng con trỏ.
Không làm như vậy sẽ dẫn đến rò rỉ bộ nhớ.
spi_prepare
(lệnh, Các loại đối số)spi_query_prepared
(롤 토토an, Đối số)SPI_EXEC_PREPARED
(kế hoạch[,thuộc tính],Đối số)SPI_Free롤 토토an
(롤 토토an)spi_prepare, spi_query_prepared, SPI_EXEC_PREPAREDvàSPI_Free롤 토토anThực hiện tương tự chức năng nhưng đối với các truy vấn đã chuẩn bị.spi_prepareChấp nhận chuỗi truy vấn với Người giữ chỗ đối số được đánh số ($ 1, $ 2, v.v.) và một chuỗi Danh sách các loại đối số:
13346_13442
Một khi kế hoạch truy vấn được chuẩn bị bằng cách gọi đếnspi_prepare, kế hoạch có thể được sử dụng thay vì Truy vấn chuỗi, trongSPI_EXEC_PREPARED, trong đó kết quả là Giống như được trả về bởiSPI_EXEC_Queryhoặc trongspi_query_preparedtrả về con trỏ Chính xác nhưspi_querykhông, trong đó sau đó có thể được chuyển chospi_fetchrow. Tham số thứ hai tùy chọn ĐẾNSPI_EXEC_PREPAREDlà một hàm băm tham chiếu của các thuộc tính; thuộc tính duy nhất hiện tại được hỗ trợ làgiới hạn, đặt Số lượng hàng tối đa được trả về bởi một truy vấn.
Ưu điểm của các truy vấn đã chuẩn bị là có thể Để sử dụng một kế hoạch đã chuẩn bị cho nhiều hơn một thực thi truy vấn. Sau khi kế hoạch không cần thiết nữa, nó có thể được giải phóng bằngSPI_Free롤 토토an:
Tạo hoặc thay thế hàm init () trả về void dưới dạng $$ $ _Shared my_plan = spi_prepare ('select (now () + $ 1) :: date as now', 'intercal'); $$ Ngôn ngữ plperl; Tạo hoặc thay thế hàm add_time (khoảng) trả về văn bản dưới dạng $$ trả về spi_exec_prepared ( $ _Shared my_plan, $ _ [0] )- hàng- [0]- bây giờ; $$ Ngôn ngữ plperl; Tạo hoặc thay thế chức năng đã hoàn thành () trả về void dưới dạng $$ spi_freeplan ($ _shared my_plan); Undef $ _Shared my_plan; $$ Ngôn ngữ plperl; Chọn init (); Chọn add_time ('1 ngày'), add_time ('2 ngày'), add_time ('3 ngày'); Chọn xong (); add_time | add_time | add_time ------------+------------+------------ 2005-12-10 | 2005-12-11 | 2005-12-12
Lưu ý rằng chỉ số tham số trongspi_prepaređược xác định qua $ 1, $ 2, $ 3, v.v. Vì vậy, tránh tuyên bố các chuỗi truy vấn trong các trích dẫn kép có thể dễ dàng dẫn đến các lỗi khó bắt.
Một ví dụ khác minh họa việc sử dụng một tùy chọn tham số trongSPI_EXEC_PREPARED:
Tạo máy chủ bảng làm ID chọn, ('192.168.1.' | Tạo hoặc thay thế chức năng init_hosts_query () trả về void dưới dạng $$ $ _Shared splan = spi_prepare ('chọn * từ máy chủ nơi địa chỉ << $ 1', 'inet'); $$ Ngôn ngữ plperl; Tạo hoặc thay thế chức năng Query_hosts (INET) Trả về máy chủ Setof dưới dạng $$ trả về spi_exec_prepared ( $ _Shared plan, giới hạn = 2, $ _ [0] )- hàng; $$ Ngôn ngữ plperl; Tạo hoặc thay thế chức năng release_hosts_query () trả về void dưới dạng $$ spi_freeplan ($ _ chia sẻ span); Undef $ _Shared plan; $$ Ngôn ngữ plperl; Chọn init_hosts_query (); Chọn query_hosts ('192.168.1.0/30'); Chọn release_hosts_query (); Query_hosts ----------------- (1.192.168.1.1) (2.192.168.1.2) (2 hàng)
ELOG
(cấp,
msg)phát ra thông báo nhật ký hoặc lỗi. Các cấp độ có thể làDebug, log, INFO, Thông báo, Cảnh báovàERROR. ERRORlàm tăng tình trạng lỗi; Nếu điều này không bị mắc kẹt bởi mã Perl xung quanh, thì Lỗi tuyên truyền ra truy vấn gọi, gây ra giao dịch hiện tại hoặc trừ đi bị hủy bỏ. Cái này thực sự giống như perlDieLệnh. Các cấp độ khác chỉ tạo ra thông điệp của các cấp độ ưu tiên khác nhau. Cho dù tin nhắn của Một ưu tiên cụ thể được báo cáo cho khách hàng, được viết đến nhật ký máy chủ hoặc cả hai đều được điều khiển bởilog_min_messagesvàclient_min_messagesBiến cấu hình. Nhìn thấyChương 18Để biết thêm thông tin.