Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng soi kèo bóng đá truoctran trang chohiện tạiPhiên bản hoặc soi kèo bóng đá truoctran trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

37.8. soi kèo bóng đá truoctran trỏ

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.

37.8.1. Tuyên bố soi kèo bóng đá truoctran trỏ Biến

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ênsoi kèo bóng đá truoctran trỏ [(Đối số)] choTruy vấn;

(chocó thể được thay thế bằngchoOracleKhả năng tương thích.)Đối số, nếu được chỉ định, là 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ụ:

Khai báo
    Curs1 refcursor;
    soi kèo bóng đá truoctran trỏ curs2 cho chọn * từ tenk1;
    soi kèo bóng đá truoctran trỏ curs3 (số nguyên khóa) được chọn * từ tenk1 trong đó độc đáo1 = phím;

Cả ba biến này đều có kiểu dữ liệuRefcursor, 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.

37.8.2. Mở soi kèo bóng đá truoctran trỏ

Trước khi soi kèo bóng đá truoctran trỏ có thể được sử dụng để lấy hàng, nó phải làđã mở. (Đây là hành động tương đương đến lệnh sqlTuyên bố soi kèo bóng đá truoctran trỏ.)PL/PGSQLcó ba dạng của TheMởTuyên bố, 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.

37.8.2.1.Mở để chọn

MởUNBOUND-CURSORcho chọ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 soi kèo bóng đá truoctran trỏ không liên kết (nghĩa là, như một đơn giảnrefcursorBiến). TheChọn​​Truy vấn được đối xử giống nhau cách khácChọnCâu trongPL/PGSQL: PL/PGSQLTên biến được thay thế, và kế hoạch truy vấn được lưu trong bộ nhớ cache để tái sử dụng.

soi kèo bóng đá truoctran ví dụ:

Mở Curs1 để chọn * từ foo WHERE key = myKey;

37.8.2.2.Mở để thực thi

Mởkhông liên kếtcho thực thiTruy vấn chuỗi;

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 soi kèo bóng đá truoctran trỏ không liên kết (nghĩa là, như một đơn giảnrefcursorBiến). Truy vấn được chỉ định làm biểu thức chuỗi theo cùng soi kèo bóng đá truoctran cách như trongthực thilệnh. Như thường lệ, cái này mang lại sự linh hoạt để truy vấn có thể thay đổi từ soi kèo bóng đá truoctran lần chạy đến Kế tiếp.

soi kèo bóng đá truoctran ví dụ:

Mở Curs1 để thực thi '' Chọn * từ '' || quote_ident ($ 1);

37.8.2.3. Mở một soi kèo bóng đá truoctran trỏ ràng buộc

MởBound-Cursor[(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.

ví dụ:

Mở Call2;
Mở Curs3 (42);

37.8.3. Sử dụng soi kèo bóng đá truoctran trỏ

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.

Những thao tác này không cần phải xảy ra trong cùng một chức năng mà mở soi kèo bóng đá truoctran trỏ để bắt đầu. Bạn có thể trả lại mộtrefcursorgiá 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ácrefcursorBiến, 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 tham chiếu chỉ một soi kèo bóng đá truoctran trỏ mở cho đến khi kết thúc giao dịch.

37.8.3.1.Fetch

Fetchsoi 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. BẰNG vớiChọn vào, Đặc biệt biếntìm thấyCó thể được kiểm tra để xem có được soi kèo bóng đá truoctran hàng hay không.

soi kèo bóng đá truoctran ví dụ:

Tìm nạp curs1 vào rowvar;
Lấy curs2 vào foo, bar, baz;

37.8.3.2.Đóng

Đó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ụ:

Đóng Call1;

37.8.3.3. Trở lại soi kèo bóng đá truoctran trỏ

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 chorefcursorBiến trước khi mở nó. Chuỗi giá trị củarefcursorBiến 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ếurefcursorBiến 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ó chorefcursorBiến.

Lưu ý:Biến soi kèo bóng đá truoctran trỏ bị ràng buộc được khởi tạo thành giá trị chuỗi đại diện cho tên của nó, để Tên cổng thông tin giống như tên biến soi kèo bóng đá truoctran trỏ, Trừ khi người lập trình ghi đè nó bằng cách gán trước mở soi kèo bóng đá truoctran trỏ. Nhưng một biến soi kèo bóng đá truoctran trỏ không liên kết mặc định ban đầu với giá trị null, vì vậy nó sẽ nhận được một tên duy nhất được tạo tự động, trừ khi ghi đè.

Ví dụ sau đây hiển thị 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:

Tạo thử nghiệm bảng (văn bản col);
Chèn vào các giá trị kiểm tra ('123');

Tạo chức năng Reffunc (refcursor) Trả về refcursor là '
BẮT ĐẦU
    Mở $ 1 cho chọn col từ bài kiểm tra;
    Trả lại $ 1;
KẾT THÚC;
'Ngôn ngữ plpgsql;

BẮT ĐẦU;
Chọn reffunc ('funccursor');
Tìm nạp tất cả trong funccursor;
LÀM;

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;

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;