Cách thức và thời điểm sử dụng sys numfcthon trong oracle


9

Ai đó có thể cho tôi một lời giải thích nhỏ về cách thức và thời điểm ai đó nên sử dụng sys_Vfcoder không?

Câu trả lời:


9

Con trỏ là con trỏ tới tập kết quả cho truy vấn. Bằng cách trả về, sys_refcursorbạn cho phép khách hàng tìm nạp bao nhiêu hoặc một vài hàng trong truy vấn theo yêu cầu. Trong các ứng dụng trạng thái, điều này có thể được sử dụng để trang thông qua kết quả.

Một con trỏ có thể cho phép linh hoạt hơn so với việc viết hàm PL / SQL trả về một mảng vì nó hoàn toàn phụ thuộc vào máy khách có bao nhiêu hàng để tìm nạp và khi nào dừng. Điều đó nói rằng, tôi đã không tìm thấy nhiều trường hợp mà tính linh hoạt bổ sung này là hữu ích.

Điều đáng chú ý là phần sys_refcursorđánh máy yếu, vì vậy bạn có thể trả về các con trỏ cho các truy vấn không chỉ khác nhau hoặc ở các mệnh đề, mà cả các số và loại cột khác nhau. Ngoài ra, bạn có thể sử dụng con trỏ được gõ mạnh trong đó các cột trong tập kết quả được cố định.

Điều này cho phép bạn viết các hàm trả về các truy vấn khác nhau, như vậy:

create function get_data ( type varchar2 ) return sys_refcursor as
  ret_cur sys_refcursor;
begin

  if type = 'EMP' then
    open ret_cur for select * from emp;
  elsif type = 'DEPT' then
    open ret_cur for select * from dept;
  end if;

  return ret_cur;
end;

Tuy nhiên, nếu bạn đang sử dụng sys_refcursorđể tạo một hàm "mở truy vấn" chung chung như trên thì có lẽ bạn đã làm sai điều gì đó!


@Chris ... tại sao chức năng ví dụ của bạn là "sai?"
Johnny Wu

1
@JohnnyWu một chức năng "lấy cho tôi bất cứ thứ gì" sẽ khó quản lý hơn. Làm thế nào để bạn kiểm tra để đảm bảo bạn có kết quả đúng trong mọi trường hợp? Còn an ninh thì sao? Điều này có thể cần thiết nếu bạn đang xây dựng một khung. Nhưng đối với logic kinh doanh nói chung, tốt hơn là có các chức năng get_empsget_deptschức năng riêng biệt
Chris Saxon

1

Như một ví dụ về các khả năng: bởi vì nó trở lại pl / sql, người ta có thể định nghĩa một đối tượng để biểu diễn một hàng, xác định bảng pl / sql của các đối tượng đó,

create type T_MY_TABLE as table of t_my_object;

và kết thúc bằng

OPEN p_recordset FOR select * from table( v_my_table );

Vì vậy, thay vì xây dựng mongo, thường dày đặc và / hoặc truy vấn trực tiếp khó hiểu trên bảng cơ sở dữ liệu, người ta có thể tạo một bảng nội bộ và có toàn bộ sức mạnh của pl / sql để điền vào nó. Và khách hàng thu thập tập kết quả không phải là khôn ngoan hơn. Và việc thay đổi định nghĩa của bảng nội bộ dễ dàng hơn từ một quản lý POV hơn là thay đổi bảng cơ sở dữ liệu.

Ngoài ra, khi sử dụng các trình tạo báo cáo như Jasper, bạn có thể đẩy SQL ra khỏi báo cáo và vào cơ sở dữ liệu, và chỉ cần gọi thủ tục để lấy recordset, để phía báo cáo tập trung vào định dạng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.