Postgresql 9.0.23 Tài liệu | ||||
---|---|---|---|---|
prev | UP | Chương 39.PL/PGSQL - SQLNgôn ngữ thủ tục | NEXT |
Thay vì thực hiện toàn bộ truy vấn cùng soi kèo bóng đá truoctran lúc, có thể Thiết lập Asoi kèo bóng đá truoctran trỏĐóng gói Truy vấn, và sau đó đọc kết quả truy vấn soi kèo bóng đá truoctran vài hàng cùng soi kèo bóng đá truoctran lúc. soi kèo bóng đá truoctran lý do để làm điều này là để tránh ghi đè bộ nhớ khi kết quả chứa soi kèo bóng đá truoctran số lượng lớn các hàng. (Tuy nhiên,PL/PGSQLNgười dùng thường không cần phải lo lắng về điều đó, kể từchoVòng lặp Tự động sử dụng soi kèo bóng đá truoctran trỏ bên trong để tránh các vấn đề về bộ nhớ.) Cách sử dụng thú vị hơn là trả về một tham chiếu đến soi kèo bóng đá truoctran trỏ rằng một hàm đã được tạo, cho phép người gọi đọc hàng. Điều này cung cấp một cách hiệu quả để trả lại các bộ hàng lớn từ các chức năng.
Tất cả quyền truy cập vào soi kèo bóng đá truoctran trỏ trongPL/PGSQLTrải qua các biến soi kèo bóng đá truoctran trỏ, luôn luôn thuộc loại dữ liệu đặc biệtRefcursor. Một cách để tạo biến soi kèo bóng đá truoctran trỏ là Chỉ để khai báo nó là một biến của loạiRefcursor. Một cách khác là sử dụng soi kèo bóng đá truoctran trỏ Syntax Tuyên bố, nói chung là:
tên[[không] cuộn] soi kèo bóng đá truoctran trỏ [(Đối số)] choTruy vấn;
(chocó thể được thay thế bằnglàchoOracleKhả năng tương thích.) NếucuộnIS Được chỉ định, soi kèo bóng đá truoctran trỏ sẽ có khả năng cuộn ngược; nếu nhưKhông cuộnđược chỉ định, ngược Fetches sẽ bị từ chối; Nếu không có đặc điểm kỹ thuật nào xuất hiện, nó Là phụ thuộc truy vấn liệu có được phép tìm nạp ngược không.Đối số, nếu được chỉ định, là soi kèo bóng đá truoctran Danh sách các cặp được phân tách bằng dấu phẩytên DataTypeđịnh nghĩa tên được thay thế bằng các giá trị tham số trong truy vấn đã cho. Thực tế Các giá trị để thay thế cho các tên này sẽ được chỉ định sau, Khi soi kèo bóng đá truoctran trỏ được mở.
soi kèo bóng đá truoctran số ví dụ:
12954_13103
13116_13166Refcursor, nhưng lần đầu tiên có thể được sử dụng với bất kỳ Truy vấn, trong khi thứ hai có truy vấn được chỉ định đầy đủBoundđối với nó và cái cuối cùng có soi kèo bóng đá truoctran Truy vấn tham số hóa ràng buộc với nó. (Keysẽ được thay thế bằng giá trị tham số số nguyên khi soi kèo bóng đá truoctran trỏ được mở.) Biếncurs1được nói trở thànhkhông bị ràng buộcvì nó không bị ràng buộc với bất kỳ truy vấn cụ thể nào.
13823_13886Mở. (Đây là hành động tương đương đến lệnh sqlTuyên bố soi kèo bóng đá truoctran trỏ.)14043_14053có ba dạng TheMởCâu lệnh, hai trong số đó sử dụng Các biến soi kèo bóng đá truoctran trỏ không liên kết trong khi bộ thứ ba sử dụng soi kèo bóng đá truoctran trỏ bị ràng buộc Biến.
Lưu ý:Các biến soi kèo bóng đá truoctran trỏ bị ràng buộc cũng có thể được sử dụng mà không cần mở rõ ràng soi kèo bóng đá truoctran trỏ, thông quachoCâu lệnh được mô tả trongPhần 39.7.4.
MởUNBOUND_CURSORVAR[[không] cuộn] choTruy vấn;
Biến soi kèo bóng đá truoctran trỏ được mở và đưa ra truy vấn để thực hiện. soi kèo bóng đá truoctran trỏ không thể mở, và nó phải được tuyên bố là một biến soi kèo bóng đá truoctran trỏ không liên kết (mà là, như một đơn giảnrefcursorsoi kèo bóng đá truoctran). Truy vấn phải làChọn, hoặc soi kèo bóng đá truoctran cái gì đó khác trả về hàng (chẳng hạn nhưGiải thích). Truy vấn được xử lý theo cùng soi kèo bóng đá truoctran cách như các lệnh SQL khác trongPL/PGSQL: PL/PGSQLTên soi kèo bóng đá truoctran được thay thế, và kế hoạch truy vấn được lưu trữ để tái sử dụng có thể. Khi APL/PGSQLbiến là được thay thế vào truy vấn soi kèo bóng đá truoctran trỏ, giá trị là được thay thế là cái nó có vào thời điểmMở; những thay đổi tiếp theo đối với biến sẽ không ảnh hưởng đến hành vi của soi kèo bóng đá truoctran trỏ. ThecuộnvàKhông có cuộnTùy chọn có ý nghĩa tương tự như đối với soi kèo bóng đá truoctran trỏ bị ràng buộc.
soi kèo bóng đá truoctran ví dụ:
16161_16216
MởUNBOUND_CURSORVAR[[không] cuộn] để thực thiQuery_String[Sử dụngBiểu thức[, ...]];
Biến soi kèo bóng đá truoctran trỏ được mở và đưa ra truy vấn để thực hiện. soi kèo bóng đá truoctran trỏ không thể mở, và nó phải được tuyên bố là một biến soi kèo bóng đá truoctran trỏ không liên kết (mà là, như một đơn giảnRefcursorBiến). Truy vấn được chỉ định làm biểu thức chuỗi, trong cùng soi kèo bóng đá truoctran Cách như trongthực thilệnh. BẰNG Thông thường, điều này mang lại sự linh hoạt để kế hoạch truy vấn có thể thay đổi từ soi kèo bóng đá truoctran lần chạy tiếp theo (xemPhần 39.10.2), và nó cũng có nghĩa là thay thế soi kèo bóng đá truoctran là Không được thực hiện trên chuỗi lệnh. Như vớithực thi, giá trị tham số có thể được chèn vào Lệnh động thông quaSử dụng. Thecuộnvàkhông CuộnTùy chọn có ý nghĩa tương tự như đối với ràng buộc soi kèo bóng đá truoctran trỏ.
soi kèo bóng đá truoctran ví dụ:
Mở Curs1 để thực thi 'Chọn * từ' || QUOTE_IDENT (TabName) || 'WHERE COL1 = $ 1' bằng cách sử dụng KeyValue;
Trong ví dụ này, tên bảng được chèn vào truy vấn
Về mặt văn bản, vì vậy sử dụngQUOTE_IDENT ()
được khuyến nghị bảo vệ
chống lại SQL tiêm. Giá trị so sánh chocol1được chèn qua Asử dụngtham số, vì vậy nó không cần trích dẫn.
MởBound_cursorvar[(arging_values)];
Hình thức này củaMởđược sử dụng để mở một biến soi kèo bóng đá truoctran trỏ mà truy vấn bị ràng buộc với nó khi nó tuyên bố. soi kèo bóng đá truoctran trỏ không thể mở. Một danh sách thực tế Biểu thức giá trị đối số phải xuất hiện khi và chỉ khi soi kèo bóng đá truoctran trỏ đã được tuyên bố là có lập luận. Những giá trị này sẽ là thay thế trong truy vấn. Kế hoạch truy vấn cho một soi kèo bóng đá truoctran trỏ ràng buộc luôn luôn được coi là có thể lưu trữ được; không có tương đươngthực thiTrong trường hợp này. Lưu ý rằngcuộnvàkhông CuộnKhông thể được chỉ định, vì việc cuộn soi kèo bóng đá truoctran trỏ hành vi đã được xác định.
Lưu ý rằng vì sự thay thế biến được thực hiện trên Truy vấn của soi kèo bóng đá truoctran trỏ ràng buộc, có hai cách để truyền các giá trị vào soi kèo bóng đá truoctran trỏ: với một đối số rõ ràng vớiMởhoặc ngầm bằng cách tham khảo APL/PGSQLBiến trong truy vấn. Tuy nhiên, chỉ các biến được khai báo trước khi bị ràng buộc soi kèo bóng đá truoctran trỏ được tuyên bố sẽ được thay thế vào nó. Trong một trong hai trường hợp giá trị được thông qua được xác định tại thời điểmMở.
ví dụ:
Mở Call2; Mở Curs3 (42);
Một khi soi kèo bóng đá truoctran trỏ đã được mở, nó có thể được thao tác với các tuyên bố được mô tả ở đây.
20247_20364Refcursorgiá trị từ một hàm và để Người gọi hoạt động trên soi kèo bóng đá truoctran trỏ. (Bên trong, ArefcursorGiá trị chỉ đơn giản là tên chuỗi của A Cái gọi là cổng thông tin chứa truy vấn hoạt động cho soi kèo bóng đá truoctran trỏ. Tên này có thể được truyền xung quanh, được gán cho khácrefcursorsoi kèo bóng đá truoctran, v.v. cổng thông tin.)
Tất cả các cổng được đóng hoàn toàn ở cuối giao dịch. Do đó ArefcursorGiá trị có thể sử dụng được đối với tham chiếu chỉ một soi kèo bóng đá truoctran trỏ mở cho đến khi kết thúc giao dịch.
Fetch [ Hướngtừ | TRONG]soi kèo bóng đá truoctran trỏthànhTarget;
FetchLấy hàng tiếp theo từ soi kèo bóng đá truoctran trỏ vào một mục tiêu, có thể là một biến hàng Ghi lại biến hoặc danh sách đơn giản được phân tách bằng dấu phẩy các biến, giống nhưChọn vào. Nếu như Không có hàng tiếp theo, mục tiêu được đặt thành NULL (S). Như vớiChọn vào, soi kèo bóng đá truoctran đặc biệttìm thấyCó thể kiểm tra xem liệu soi kèo bóng đá truoctran hàng đã được lấy hay không.
TheHướng21889_21951FetchLệnh ngoại trừ các lệnh có thể tìm nạp nhiều hơn soi kèo bóng đá truoctran hàng; cụ thể là, nó có thể làNEXT, trước, Đầu tiên, cuối cùng, Tuyệt đối Đếm, tương đối Đếm, Chuyển tiếphoặcBackward. Bỏ quaHướnglà Giống như chỉ địnhTiếp theo. HướngCác giá trị yêu cầu di chuyển lạc hậu có khả năng thất bại trừ khi soi kèo bóng đá truoctran trỏ được khai báo hoặc đã mở vớicuộnTùy chọn.
soi kèo bóng đá truoctran trỏphải là tên của soi kèo bóng đá truoctranrefcursorBiến tham chiếu Mở cổng soi kèo bóng đá truoctran trỏ.
Ví dụ:
Tìm nạp curs1 vào rowvar; Tìm nạp curs2 vào foo, bar, baz; Lấy cuối cùng từ Curs3 vào X, Y; Tìm nạp tương đối -2 từ call4 vào x;
Di chuyển [ Hướngtừ | TRONG]soi kèo bóng đá truoctran trỏ;
Di chuyểnĐịnh vị lại một soi kèo bóng đá truoctran trỏ mà không có Lấy bất kỳ dữ liệu nào.Di chuyểnhoạt động giống hệtFetchLệnh, ngoại trừ nó chỉ định vị lại soi kèo bóng đá truoctran trỏ và không trả lại hàng chuyển đến. Như vớiChọn vào,, soi kèo bóng đá truoctran đặc biệttìm thấycó thể đã kiểm tra xem liệu có hàng tiếp theo để di chuyển đến.
TheHướngmệnh đề có thể là bất kỳ soi kèo bóng đá truoctran thể nào được phép trong SQLFetchlệnh, cụ thể làTiếp theo, trước, Đầu tiên, cuối cùng, Tuyệt đối Đếm, 24360_24370 Đếm, tất cả, Chuyển tiếp[Đếm | tất cả] hoặcBackward[Đếm | tất cả]. Bỏ quaHướnggiống như chỉ địnhTiếp theo. HướngCác giá trị yêu cầu di chuyển lạc hậu có khả năng thất bại trừ khi soi kèo bóng đá truoctran trỏ được khai báo hoặc đã mở vớicuộnTùy chọn.
ví dụ:
di chuyển call1; Di chuyển cuối cùng từ curs3; Di chuyển tương đối -2 từ call4; Di chuyển về phía trước 2 từ CULS4;
Cập nhậtBảngĐặt ... trong đó hiện tại củasoi kèo bóng đá truoctran trỏ; Xóa khỏiBảngtrong đó hiện tại củasoi kèo bóng đá truoctran trỏ;
Khi soi kèo bóng đá truoctran trỏ được định vị trên hàng bảng, hàng đó có thể được cập nhật hoặc xóa bằng cách sử dụng soi kèo bóng đá truoctran trỏ để xác định hàng. Có những hạn chế về truy vấn của soi kèo bóng đá truoctran trỏ có thể là gì (trong đặc biệt, không có nhóm) và tốt nhất là sử dụngđể cập nhậtTrong soi kèo bóng đá truoctran trỏ. Để biết thêm thông tin Xemkhai báoTham chiếu trang.
soi kèo bóng đá truoctran ví dụ:
Cập nhật foo set dataval = myVal trong đó dòng điện của curs1;
Đóngsoi kèo bóng đá truoctran trỏ;
ĐóngĐóng cổng bên dưới một soi kèo bóng đá truoctran trỏ mở. Điều này có thể được sử dụng để phát hành tài nguyên sớm hơn kết thúc giao dịch hoặc để giải phóng Biến soi kèo bóng đá truoctran trỏ sẽ được mở lại.
soi kèo bóng đá truoctran ví dụ:
26750_26766
PL/PGSQLCác chức năng có thể trả lại soi kèo bóng đá truoctran trỏ cho người gọi. Điều này rất hữu ích để trở lại nhiều hàng hoặc cột, đặc biệt là với kết quả rất lớn bộ. Để làm điều này, chức năng mở soi kèo bóng đá truoctran trỏ và trả về Tên soi kèo bóng đá truoctran trỏ cho người gọi (hoặc đơn giản là mở soi kèo bóng đá truoctran trỏ sử dụng tên cổng thông tin được chỉ định bởi hoặc được biết đến người gọi). Người gọi sau đó có thể lấy hàng từ soi kèo bóng đá truoctran trỏ. Các soi kèo bóng đá truoctran trỏ có thể được đóng bởi người gọi, hoặc nó sẽ bị đóng tự động khi giao dịch đóng.
Tên cổng thông tin được sử dụng cho soi kèo bóng đá truoctran trỏ có thể được chỉ định bởi lập trình viên hoặc tự động được tạo. Để chỉ định một cổng thông tin Tên, chỉ cần gán một chuỗi chorefcursorsoi kèo bóng đá truoctran trước khi mở nó. Chuỗi giá trị củarefcursorsoi kèo bóng đá truoctran sẽ có Được sử dụng bởiMởlà tên của Cổng thông tin cơ bản. Tuy nhiên, nếurefcursorsoi kèo bóng đá truoctran là NULL,Mởtự động tạo tên không xung đột với bất kỳ cổng thông tin hiện có nào và gán nó chorefcursor28142_28154
Lưu ý:28242_28684
Ví dụ sau đây cho thấy một cách một tên soi kèo bóng đá truoctran trỏ có thể được cung cấp bởi người gọi:
28857_29137
Ví dụ sau sử dụng tên soi kèo bóng đá truoctran trỏ tự động thế hệ:
Tạo hàm reffunc2 () trả về refcursor là ' TUYÊN BỐ ref refcursor; BẮT ĐẦU Mở REF cho chọn Col từ thử nghiệm; Trả lại ref; KẾT THÚC; 'Ngôn ngữ plpgsql; - Cần phải trong một giao dịch để sử dụng soi kèo bóng đá truoctran trỏ. BẮT ĐẦU; Chọn reffunc2 (); Reffunc2 -------------------- <soi kèo bóng đá truoctran trỏ không tên 1 (1 hàng) Tìm nạp tất cả trong "<soi kèo bóng đá truoctran trỏ không tên 1"; LÀM;
Ví dụ sau đây hiển thị một cách để trả về nhiều soi kèo bóng đá truoctran trỏ từ một hàm duy nhất:
Tạo chức năng myfunc (refcursor, refcursor) Trả về setof refcur BẮT ĐẦU Mở $ 1 cho chọn * từ TABLE_1; Trả lại tiếp theo $ 1; Mở $ 2 cho chọn * từ bảng_2; Trả lại tiếp theo $ 2; KẾT THÚC; $$ Ngôn ngữ plpgsql; - Cần phải trong một giao dịch để sử dụng soi kèo bóng đá truoctran trỏ. BẮT ĐẦU; Chọn * từ myfunc ('a', 'b'); Tìm nạp tất cả từ a; Tìm nạp tất cả từ b; LÀM;
Có soi kèo bóng đá truoctran biến thể củachocâu lệnh cho phép lặp qua các hàng được trả về bởi a soi kèo bóng đá truoctran trỏ. Cú pháp là:
[<<nhãn ] VÌRecordVarinBound_cursorvar[(argarm_values)] vòng lặpCâuvòng lặp cuối [ nhãn 30913_30918
Biến soi kèo bóng đá truoctran trỏ phải bị ràng buộc với một số truy vấn khi nó đã được khai báo và nókhông thểĐã mở. ThechoCâu lệnh tự động mở soi kèo bóng đá truoctran trỏ, và nó đóng soi kèo bóng đá truoctran trỏ một lần nữa khi vòng lặp ra. MỘT Danh sách các biểu thức giá trị đối số thực tế phải xuất hiện nếu và Chỉ khi soi kèo bóng đá truoctran trỏ được tuyên bố lấy lập luận. Những giá trị này sẽ được thay thế trong truy vấn, theo cách tương tự như Trong mộtMở. soi kèo bóng đá truoctranRecordVarđược tự động được định nghĩa là loạiRecordvà chỉ tồn tại Bên trong vòng lặp (bất kỳ định nghĩa hiện có của tên biến được bỏ qua trong vòng lặp). Mỗi hàng được trả về bởi soi kèo bóng đá truoctran trỏ là liên tiếp được gán cho biến hồ sơ này và thân vòng lặp được thực thi.