Postgresql 9.2.24 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 cách đọc kèo bóng đá lúc, có thể Thiết lập Acách đọc kèo bóng đá trỏĐóng gói Truy vấn, và sau đó đọc kết quả truy vấn cách đọc kèo bóng đá vài hàng cùng cách đọc kèo bóng đá lúc. cách đọc kèo bóng đá lý do để làm điều này là để tránh ghi đè bộ nhớ khi kết quả chứa cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ trongPL/PGSQLTrải qua các biến cách đọc kèo bóng đá trỏ, luôn luôn thuộc loại dữ liệu đặc biệtRefcursor. Một cách để tạo biến cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ Syntax Tuyên bố, nói chung là:
tên[[không] cuộn] cách đọc kèo bóng đá 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, cách đọc kèo bóng đá 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à cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ được mở.
cách đọc kèo bóng đá số ví dụ:
Khai báo Curs1 refcursor; cách đọc kèo bóng đá trỏ curs2 cho chọn * từ tenk1; cách đọc kèo bóng đá trỏ curs3 (số nguyên khóa) cho chọn * từ tenk1 trong đó độc đáo1 = key;
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, cách đọc kèo bóng đá khi thứ hai có truy vấn được chỉ định đầy đủBoundđối với nó và cái cuối cùng có cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 bất kỳ truy vấn cụ thể nào.
Trước khi cách đọc kèo bóng đá 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ố cách đọc kèo bóng đá trỏ.)PL/PGSQLcó ba dạng TheMởCâu lệnh, hai trong số đó sử dụng Các biến cách đọc kèo bóng đá trỏ không liên kết trong khi bộ thứ ba sử dụng cách đọc kèo bóng đá trỏ bị ràng buộc Biến.
Lưu ý:Các biến cách đọc kèo bóng đá trỏ bị ràng buộc cũng có thể được sử dụng mà không cần mở rõ ràng cách đọc kèo bóng đá trỏ, thông quachoCâu lệnh được mô tả cách đọc kèo bóng đáPhần 39.7.4.
MởUNBOUND_CURSORVAR[[không] cuộn] choTruy vấn;
Biến cách đọc kèo bóng đá trỏ được mở và đưa ra truy vấn để thực hiện. cách đọc kèo bóng đá trỏ không thể mở, và nó phải được tuyên bố là một biến cách đọc kèo bóng đá trỏ không liên kết (mà là, như một đơn giảnrefcursorBiến). Truy vấn phải làChọn, hoặc cách đọc kèo bóng đá 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 cách đọc kèo bóng đá cách như các lệnh SQL khác trongPL/PGSQL: PL/PGSQLTên biến đượ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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ. ThecuộnvàKhông có cuộnTùy chọn có ý nghĩa tương tự như đối với cách đọc kèo bóng đá trỏ bị ràng buộc.
cách đọc kèo bóng đá ví dụ:
Mở Curs1 để chọn * từ foo cách đọc kèo bóng đá đó key = myKey;
MởUNBOUND_CURSORVAR[[Không] cuộn] để thực thiQuery_String[Sử dụngBiểu thức[, ...]];
Biến cách đọc kèo bóng đá trỏ được mở và đưa ra được chỉ định truy vấn để thực hiện. cách đọc kèo bóng đá trỏ không thể mở, và nó phải được tuyên bố là một biến cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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ừ cách đọc kèo bóng đá lần chạy tiếp theo (xemPhần 39.10.2), và nó cũng có nghĩa là thay thế biến 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 cách đọc kèo bóng đá trỏ.
cách đọc kèo bóng đá ví dụ:
Mở Curs1 để thực thi 'Chọn * từ' || QUOTE_IDENT (TabName) || 'WHERE COL1 = $ 1' bằng cách sử dụng KeyValue;
cách đọc kèo bóng đá 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[([ argion_name: =]arging_value[, ...])];
Hình thức này củaMởđược sử dụng để mở một biến cách đọc kèo bóng đá trỏ mà truy vấn bị ràng buộc với nó khi nó tuyên bố. cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ đã được tuyên bố là có lập luận. Những giá trị này sẽ là được thay thế trong truy vấn.
Kế hoạch truy vấn cho một cách đọc kèo bóng đá trỏ ràng buộc luôn được xem xét có thể nhớ được; không có tương đươngthực thicách đọc kèo bóng đá trường hợp này. Lưu ý rằngcuộnvàkhông có cuộnKhông thể được chỉ định cách đọc kèo bóng đáMở, như Hành vi cuộn của cách đọc kèo bóng đá trỏ đã được xác định.
Giá trị đối số có thể được truyền bằng cách sử dụngvị tríhoặcđược đặt tênKý hiệu. cách đọc kèo bóng đá ký hiệu vị trí, tất cả các đối số được chỉ định theo thứ tự. cách đọc kèo bóng đá ký hiệu được đặt tên, tên của mỗi đối số là được chỉ định bằng: =Để tách nó ra từ biểu thức đối số. Tương tự như các chức năng gọi, được mô tả cách đọc kèo bóng đátỷ lệ kèo bóng, Nó cũng được phép trộn đúng vị trí và được đặt tên ký hiệu.
Ví dụ (những ví dụ này sử dụng các ví dụ khai báo cách đọc kèo bóng đá trỏ bên trên):
Mở Curs2; Mở Curs3 (42); Mở Curs3 (khóa: = 42);
Vì sự thay thế biến được thực hiện trên cách đọc kèo bóng đá trỏ bị ràng buộc truy vấn, thực sự có hai cách để truyền giá trị vào cách đọc kèo bóng đá trỏ: với một đối số rõ ràng vớiMởhoặc ngầm bằng cách tham chiếu 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 cách đọc kèo bóng đá 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ụ, cách đọc kèo bóng đá cách khác để Nhận hiệu ứng tương tự nhưcurs3Ví dụ ở trên là
Khai báo số nguyên chính; cách đọc kèo bóng đá trỏ curs4 cho chọn * từ tenk1 trong đó duy nhất1 = phím; BẮT ĐẦU khóa: = 42; Mở curs4;
Một khi cách đọc kèo bóng đá 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ở cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ mở cho đến khi kết thúc giao dịch.
tìm nạp [ Hướngtừ | cách đọc kèo bóng đá]cách đọc kèo bóng đá trỏthànhTarget;
FetchLấy hàng tiếp theo từ cách đọc kèo bóng đá 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, Biến đặc biệttìm thấyCó thể kiểm tra xem liệu cách đọc kèo bóng đá hàng đã được lấy hay không.
TheHướngmệnh đề có thể là bất kỳ biến thể nào được phép cách đọc kèo bóng đá SQLFetchLệnh ngoại trừ các lệnh có thể tìm nạp nhiều hơn cách đọc kèo bóng đá hàng; cụ thể là, nó 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ỉ đị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 cách đọc kèo bóng đá trỏ được khai báo hoặc đã mở vớicuộnTùy chọn.
cách đọc kèo bóng đá trỏphải là tên của cách đọc kèo bóng đárefcursorBiến tham chiếu Mở cổng cách đọc kèo bóng đá 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ừ | cách đọc kèo bóng đá]cách đọc kèo bóng đá trỏ;
Di chuyểnĐịnh vị lại một cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ và không trả lại hàng chuyển đến. Như vớiChọn vào,, Biến đặ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ỳ biến thể nào được phép cách đọc kèo bóng đá SQLFetchlệnh, cụ thể làTiếp theo, trước, Đầu tiên, cuối cùng, Tuyệt đối Đếm, tương đối Đế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 cách đọc kèo bóng đá 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 ... cách đọc kèo bóng đá đó hiện tại củacách đọc kèo bóng đá trỏ; Xóa khỏiBảngcách đọc kèo bóng đá đó hiện tại củacách đọc kèo bóng đá trỏ;
Khi cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ để xác định hàng. Có những hạn chế về truy vấn của cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ. Để biết thêm thông tin Xemkhai báoTài liệu tham khảo trang.
cách đọc kèo bóng đá ví dụ:
Cập nhật foo set dataval = myVal cách đọc kèo bóng đá đó dòng điện của curs1;
Đóngcách đọc kèo bóng đá trỏ27552_27556
ĐóngĐóng cổng bên dưới một cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ sẽ được mở lại.
cách đọc kèo bóng đá ví dụ:
Đóng Call1;
PL/PGSQLchức năng có thể trả lại cách đọc kèo bóng đá 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ở cách đọc kèo bóng đá trỏ và trả về Tên cách đọc kèo bóng đá trỏ cho người gọi (hoặc đơn giản là mở cách đọc kèo bóng đá 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ừ cách đọc kèo bóng đá trỏ. Các cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ, Trừ khi người lập trình ghi đè nó bằng cách gán trước mở cách đọc kèo bóng đá trỏ. Nhưng một biến cách đọc kèo bóng đá 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 cho thấy một cách một tên cách đọc kèo bóng đá 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ả cách đọc kèo bóng đá funccursor; LÀM;
Ví dụ sau sử dụng tên cách đọc kèo bóng đá 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 cách đọc kèo bóng đá trỏ. BẮT ĐẦU; Chọn reffunc2 (); Reffunc2 -------------------- <cách đọc kèo bóng đá trỏ không tên 1 (1 hàng) Tìm nạp tất cả trong "<cách đọc kèo bóng đá trỏ không tên 1"; LÀM;
Ví dụ sau đây hiển thị một cách để trả về nhiều cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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ó cách đọc kèo bóng đá biến thể củachoCâu lệnh cho phép lặp qua các hàng được trả về bởi a cách đọc kèo bóng đá trỏ. Cú pháp là:
[<<nhãn ] VÌRecordVarinBound_cursorvar[([ argion_name: =]arging_value[, ...])] vòng lặpCâuvòng lặp cuối [ nhãn ];
Biến cách đọc kèo bóng đá 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ở cách đọc kèo bóng đá trỏ, và nó đóng cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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ở(xemPhần 39.7.2.3).
BiếnRecordVarIS 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ó nào của Tên biến bị bỏ qua trong vòng lặp). Mỗi hàng được trả lại bởi cách đọc kèo bóng đá trỏ được gán liên tiếp cho biến hồ sơ này và cơ thể vòng lặp được thực thi.