9583_9622 | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 38.PL/PGSQL - SQLNgôn ngữ thủ tục | Chuyển tiếp nhanh | Tiếp theo |
Thay vì thực hiện toàn bộ truy vấn cùng kèo bóng đá c1 lúc, có thể Thiết lập Akèo bóng đá c1 trỏĐóng gói Truy vấn, và sau đó đọc kết quả truy vấn kèo bóng đá c1 vài hàng cùng kèo bóng đá c1 lúc. kèo bóng đá c1 lý do để làm điều này là để tránh ghi đè bộ nhớ khi kết quả chứa kèo bóng đá c1 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 kèo bóng đá c1 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 kèo bóng đá c1 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 kèo bóng đá c1 trỏ trongPL/PGSQLTrải qua các biến kèo bóng đá c1 trỏ, luôn luôn thuộc loại dữ liệu đặc biệtrefcursor. Một cách để tạo biến kèo bóng đá c1 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 kèo bóng đá c1 trỏ Syntax Tuyên bố, nói chung là:
tên[[Không] cuộn] kèo bóng đá c1 trỏ [(Đối số)] choTruy vấn;
(chocó thể được thay thế bằnglàchoOracleTương thích.) NếucuộnIS Được chỉ định, kèo bóng đá c1 trỏ sẽ có khả năng cuộn ngược; nếu nhưKhông có 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à kèo bóng đá c1 Danh sách các cặp được phân tách bằng dấu phẩytên Kiểu dữ liệuđị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 kèo bóng đá c1 trỏ được mở.
kèo bóng đá c1 số ví dụ:
Khai báo Curs1 refcursor; kèo bóng đá c1 trỏ curs2 cho chọn * từ tenk1; kèo bóng đá c1 trỏ curs3 (số nguyên khóa) được chọn * từ tenk1 trong đó độc đáo1 = phím;
Cả ba kèo bóng đá c1 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ó kèo bóng đá c1 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 kèo bóng đá c1 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.
Trước khi kèo bóng đá c1 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ố kèo bóng đá c1 trỏ.)PL/PGSQLcó ba dạng TheMởTuyên bố, hai trong số đó sử dụng Các biến kèo bóng đá c1 trỏ không liên kết trong khi bộ thứ ba sử dụng kèo bóng đá c1 trỏ bị ràng buộc Biến.
Lưu ý:Các biến kèo bóng đá c1 trỏ bị ràng buộc cũng có thể được sử dụng mà không cần mở rõ ràng kèo bóng đá c1 trỏ, thông quachoCâu lệnh được mô tả trongPhần 38.7.4.
MởUNBOUND_CURSORVAR[[không] cuộn] choTruy vấn;
Biến kèo bóng đá c1 trỏ được mở và đưa ra truy vấn để thực hiện. kèo bóng đá c1 trỏ không thể mở, và nó phải được tuyên bố là một biến kèo bóng đá c1 trỏ không liên kết (mà là, như một đơn giảnrefcursorkèo bóng đá c1). Truy vấn phải làChọn, hoặc kèo bóng đá c1 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 kèo bóng đá c1 cách như các lệnh SQL khác trongPL/PGSQL: PL/PGSQLTên kèo bóng đá c1 đượ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 kèo bóng đá c1 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 kèo bóng đá c1 trỏ. ThecuộnvàKhông có cuộnTùy chọn có ý nghĩa tương tự như đối với kèo bóng đá c1 trỏ bị ràng buộc.
kèo bóng đá c1 ví dụ:
Mở Curs1 để chọn * từ foo trong đó key = myKey;
MởUNBOUND_CURSORVAR[[không] cuộn] để thực thiquery_string;
Biến kèo bóng đá c1 trỏ được mở và đưa ra truy vấn để thực hiện. kèo bóng đá c1 trỏ không thể mở, và nó phải được tuyên bố là một biến kèo bóng đá c1 trỏ không liên kết (mà là, như một đơn giảnRefcursor16911_17010thự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ừ kèo bóng đá c1 lần chạy tiếp theo (xemPhần 38.10.2), và nó cũng có nghĩa là thay thế kèo bóng đá c1 là Không được thực hiện trên chuỗi lệnh. ThecuộnvàKhông có cuộnTùy chọn có ý nghĩa tương tự như đối với kèo bóng đá c1 trỏ bị ràng buộc.
kèo bóng đá c1 ví dụ:
Mở Curs1 để thực thi 'Chọn * từ' || quote_ident ($ 1);
MởBound_cursorvar[(argion_values)];
Hình thức nàyMở17977_18394thự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 kèo bóng đá c1 trỏ hành vi đã được xác định.
Lưu ý rằng vì thay thế biến được thực hiện trên Truy vấn của kèo bóng đá c1 trỏ ràng buộc, có hai cách để truyền các giá trị vào kèo bóng đá c1 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 kèo bóng đá c1 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 kèo bóng đá c1 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ở kèo bóng đá c1 trỏ để bắt đầu. Bạn có thể trả lại mộtRefcursorgiá trị từ một hàm và để cho Người gọi hoạt động trên kèo bóng đá c1 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 kèo bóng đá c1 trỏ. Tên này có thể được truyền xung quanh, được gán cho khácrefcursorkèo bóng đá c1, v.v., mà không làm phiền cổng thông tin.)
Tất cả các cổng được đóng hoàn toàn khi kết thúc giao dịch. Do đó ArefcursorGiá trị có thể sử dụng được tham chiếu chỉ một kèo bóng đá c1 trỏ mở cho đến khi kết thúc giao dịch.
tìm nạp [ Hướngtừ | TRONG]kèo bóng đá c1 trỏthànhTarget;
FetchLấy hàng tiếp theo từ kèo bóng đá c1 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, kèo bóng đá c1 đặc biệttìm thấyCó thể kiểm tra xem liệu có thể xem liệu kèo bóng đá c1 hàng đã được lấy hay không.
TheHướngmệnh đề có thể là bất kỳ kèo bóng đá c1 thể nào được phép trong SQLFetchLệnh ngoại trừ các lệnh có thể tìm nạp nhiều hơn kèo bóng đá c1 hàng; cụ thể là, nó có thể làTiếp theo, trước, Đầu tiên, Last, Tuyệt đối Đếm, tương đối Đếm, Chuyển tiếphoặcBackward. Bỏ quaHướng21828_21863Tiế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 kèo bóng đá c1 trỏ được khai báo hoặc đã mở vớicuộnTùy chọn.
kèo bóng đá c1 trỏphải là tên của kèo bóng đá c1refcursorBiến tham chiếu Mở cổng kèo bóng đá c1 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]kèo bóng đá c1 trỏ;
Di chuyểnĐịnh vị lại một kèo bóng đá c1 trỏ mà không có Lấy bất kỳ dữ liệu nào.Di chuyển22908_22940Fetchlệnh, ngoại trừ nó chỉ định vị lại kèo bóng đá c1 trỏ và không trả lại hàng chuyển đến. Như vớiChọn vào,, kèo bóng đá c1 đặc biệttìm thấycó thể đã kiểm tra xem liệu có hàng tiếp theo để di chuyển đến.
Các tùy chọn choHướngmệnh đề giống như đối vớitìm nạp, cụ thể làTiếp theo, trước, Đầu tiên, cuối cùng, Tuyệt đối Đếm, tương đối Đếm, Chuyển tiếphoặclùi. Bỏ quaHướnglà Giống như chỉ địnhNEXT. 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 kèo bóng đá c1 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ừ curs4;
Cập nhậtBảngĐặt ... trong đó hiện tại củakèo bóng đá c1 trỏ; Xóa khỏiBảngtrong đó hiện tại củakèo bóng đá c1 trỏ;
Khi kèo bóng đá c1 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 kèo bóng đá c1 trỏ để xác định hàng. Có những hạn chế về truy vấn của kèo bóng đá c1 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 kèo bóng đá c1 trỏ. Để bổ sung Thông tin xemkhai báotrang tham chiếu.
kèo bóng đá c1 ví dụ:
Cập nhật foo set dataval = myVal trong đó dòng điện của curs1;
PL/PGSQL25964_26481
Tên cổng thông tin được sử dụng cho kèo bóng đá c1 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 chorefcursorkèo bóng đá c1 trước khi mở nó. Chuỗi giá trị củarefcursorkèo bóng đá c1 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ếurefcursorkèo bóng đá c1 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ó chorefcursorkèo bóng đá c1.
Lưu ý:Biến kèo bóng đá c1 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 kèo bóng đá c1 trỏ, Trừ khi người lập trình ghi đè nó bằng cách gán trước mở kèo bóng đá c1 trỏ. Nhưng một biến kèo bóng đá c1 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 đè.
27738_27826
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 kèo bóng đá c1 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 -------------------- <kèo bóng đá c1 trỏ không tên 1 (1 hàng) Tìm nạp tất cả trong "<kèo bóng đá c1 trỏ không tên 1"; LÀM;
28592_28686
28723_29084
Có kèo bóng đá c1 biến thể củachoCâu lệnh cho phép lặp qua các hàng được trả về bởi a kèo bóng đá c1 trỏ. Cú pháp là:
[<<nhãn ] VÌRecordVarinBound_cursorvar[(argion_values)] vòng lặpCâuvòng lặp cuối [ nhãn ];
Biến kèo bóng đá c1 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ở kèo bóng đá c1 trỏ, và nó đóng kèo bóng đá c1 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 kèo bóng đá c1 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ở. kèo bóng đá c1RecordVarđượ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 kèo bóng đá c1 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.