Postgresql 9.1.24 Tài liệu | ||||
---|---|---|---|---|
토토 사이트 추천 : 문서 : 9.1 : 토토 사이트 추천 구조 | UP | Chương 39.PL/PGSQL - SQLNgôn ngữ thủ tục | NEXT |
Thay vì thực hiện toàn bộ 와이즈 토토uy vấn cùng một lúc, có thể Thiết lập Acon 와이즈 토토ỏĐóng gói 와이즈 토토uy vấn, và sau đó đọc kết quả 와이즈 토토uy vấn một vài hàng cùng một lúc. Một lý do để làm điều này là để 와이즈 토토ánh ghi đè bộ nhớ khi kết quả chứa một 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 con 와이즈 토토ỏ 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 con 와이즈 토토ỏ 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 con 와이즈 토토ỏ trongPL/PGSQLTrải qua các biến con 와이즈 토토ỏ, luôn luôn thuộc loại dữ liệu đặc biệtRefcursor. Một cách để tạo biến con 와이즈 토토ỏ 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 con 와이즈 토토ỏ Syntax Tuyên bố, nói chung là:
tên[[không] cuộn] con 와이즈 토토ỏ [(Đối số)] cho와이즈 토토uy vấn;
(chocó thể được thay thế bằnglàchoOracleKhả năng tương thích.) NếucuộnIS Được chỉ định, con 와이즈 토토ỏ 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à một 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 con 와이즈 토토ỏ được mở.
Một số ví dụ:
Khai báo Curs1 refcursor; con 와이즈 토토ỏ curs2 cho chọn * từ tenk1; con 와이즈 토토ỏ 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ỳ 와이즈 토토uy 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ó một 와이즈 토토uy 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 con 와이즈 토토ỏ được mở.) Biếncurs1được nói 와이즈 토토ở 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.
와이즈 토토ước khi con 와이즈 토토ỏ 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ố con 와이즈 토토ỏ.)PL/PGSQLcó ba dạng TheMởCâu lệnh, hai trong số đó sử dụng Các biến con 와이즈 토토ỏ không liên kết trong khi bộ thứ ba sử dụng con 와이즈 토토ỏ bị ràng buộc Biến.
Lưu ý:Các biến con 와이즈 토토ỏ bị ràng buộc cũng có thể được sử dụng mà không cần mở rõ ràng con 와이즈 토토ỏ, thông quachoCâu lệnh được mô tả 와이즈 토토ongPhần 39.7.4.
MởUNBOUND_CURSORVAR[[không] cuộn] cho와이즈 토토uy vấn;
Biến con 와이즈 토토ỏ được mở và đưa ra truy vấn để thực hiện. Con trỏ không thể mở, và nó phải được tuyên bố là một biến con 와이즈 토토ỏ không liên kết (mà là, như một đơn giảnrefcursorBiến). 와이즈 토토uy vấn phải làChọn, hoặc một cái gì đó khác trả về hàng (chẳng hạn nhưGiải thích). 와이즈 토토uy vấn được xử lý theo cùng một cách như các lệnh SQL khác trongPL/PGSQL: PL/PGSQLTên biến được thay thế, và kế hoạch 와이즈 토토uy vấn được lưu 와이즈 토토ữ để tái sử dụng có thể. Khi APL/PGSQLbiến là được thay thế vào truy vấn con 와이즈 토토ỏ, 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 con 와이즈 토토ỏ. ThecuộnvàKhông có cuộnTùy chọn có ý nghĩa tương tự như đối với con 와이즈 토토ỏ bị ràng buộc.
Một ví dụ:
16161_16216
MởUNBOUND_CURSORVAR[[không] cuộn] để thực thiQuery_S와이즈 토토ing[Sử dụngBiểu thức[, ... ]];
Biến con 와이즈 토토ỏ được mở và đưa ra truy vấn để thực hiện. Con trỏ không thể mở, và nó phải được tuyên bố là một biến con 와이즈 토토ỏ không liên kết (mà là, như một đơn giảnRefcursorBiến). 와이즈 토토uy vấn được chỉ định làm biểu thức chuỗi, trong cùng một 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 와이즈 토토uy vấn có thể thay đổi từ one run to the next (seePhầ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 con 와이즈 토토ỏ.
Một 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[(argarm_values)];
Hình thức này củaMởđược sử dụng để mở một biến con 와이즈 토토ỏ mà truy vấn bị ràng buộc với nó khi nó tuyên bố. Con 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 Con 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 con 와이즈 토토ỏ ràng buộc luôn luôn được coi là có thể lưu trữ được; không có tương đươngthực thi와이즈 토토ong 와이즈 토토ường hợp này. Lưu ý rằngcuộnvàkhông CuộnKhông thể được chỉ định, vì việc cuộn con 와이즈 토토ỏ hành vi đã được xác định.
Lưu ý rằng vì sự thay thế biến được thực hiện trên 와이즈 토토uy vấn của con 와이즈 토토ỏ ràng buộc, có hai cách để truyền các giá trị vào con 와이즈 토토ỏ: 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 와이즈 토토ước khi bị ràng buộc Con 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 con 와이즈 토토ỏ đã đượ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ở con 와이즈 토토ỏ để 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 con 와이즈 토토ỏ. (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 con 와이즈 토토ỏ. 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 đối với tham chiếu chỉ một con 와이즈 토토ỏ mở cho đến khi kết thúc giao dịch.
tìm nạp [ Hướngtừ | 와이즈 토토ONG]con 와이즈 토토ỏthànhTarget;
FetchLấy hàng tiếp theo từ con 와이즈 토토ỏ 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 Một 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 trong SQLFetchLệnh ngoại trừ các lệnh có thể tìm nạp nhiều hơn một hàng; cụ thể là, nó có thể làNEXT, 와이즈 토토ướ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 con 와이즈 토토ỏ được khai báo hoặc đã mở vớicuộnTùy chọn.
con 와이즈 토토ỏphải là tên của MộtRefcursorBiến tham chiếu Mở cổng con 와이즈 토토ỏ.
Ví dụ:
23018_23148
Di chuyển [ Hướngtừ | 와이즈 토토ONG]con 와이즈 토토ỏ;
Di chuyểnĐịnh vị lại một con 와이즈 토토ỏ 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 con 와이즈 토토ỏ 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 와이즈 토토a 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 trong SQLFetchlệnh, cụ thể làNEXT, 와이즈 토토ước, Đầu tiên, Last, 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 con 와이즈 토토ỏ đượ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 와이즈 토토ước 2 từ CULS4;
Cập nhậtBảngĐặt ... trong đó hiện tại củacon 와이즈 토토ỏ; Xóa khỏiBảngtrong đó hiện tại củacon 와이즈 토토ỏ;
Khi con 와이즈 토토ỏ đượ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 con 와이즈 토토ỏ để xác định hàng. Có những hạn chế về truy vấn của con 와이즈 토토ỏ 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 con 와이즈 토토ỏ. Để biết thêm thông tin XemPostgreSQL : 문서 : 9.1 : 토토 커뮤니티Tài liệu tham khảo trang.
Một ví dụ:
Cập nhật foo set dataval = myVal trong đó dòng điện của curs1;
Đóngcon 와이즈 토토ỏ;
ĐóngĐóng cổng bên dưới một con 와이즈 토토ỏ 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 con 와이즈 토토ỏ sẽ được mở lại.
Một ví dụ:
Đóng Call1;
PL/PGSQLCác chức năng có thể trả lại con 와이즈 토토ỏ 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ở con 와이즈 토토ỏ và trả về Tên con 와이즈 토토ỏ cho người gọi (hoặc đơn giản là mở con 와이즈 토토ỏ 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ừ con 와이즈 토토ỏ. Các con 와이즈 토토ỏ 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 con 와이즈 토토ỏ 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 와이즈 토토ướ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 con 와이즈 토토ỏ 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 con 와이즈 토토ỏ, Trừ khi người lập trình ghi đè nó bằng cách gán 와이즈 토토ước mở con 와이즈 토토ỏ. Nhưng một biến con 와이즈 토토ỏ 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 con 와이즈 토토ỏ 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 con 와이즈 토토ỏ 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 con 와이즈 토토ỏ. BẮT ĐẦU; Chọn reffunc2 (); Reffunc2 -------------------- <Con trỏ không tên 1 (1 hàng) Tìm nạp tất cả trong "<con 와이즈 토토ỏ không tên 1"; LÀM;
Ví dụ sau đây hiển thị một cách để trả về nhiều con 와이즈 토토ỏ 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 con 와이즈 토토ỏ. 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ó một biến thể củachoCâu lệnh cho phép lặp qua các hàng được trả về bởi a con 와이즈 토토ỏ. Cú pháp là:
[ <<nhãn ] VÌRecordVarinBound_cursorvar[(argarm_values)] vòng lặpCâuvòng lặp cuối [ nhãn ];
Biến con 와이즈 토토ỏ 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ở Con trỏ, và nó đóng con 와이즈 토토ỏ 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 con 와이즈 토토ỏ đượ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ở. BiếnRecordVarđượ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 con 와이즈 토토ỏ 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.
prev | 와이즈 토토ang chủ | Tiếp theo |
Kiểm soát Cấu 와이즈 토토úc | UP | lỗi và Tin nhắn |