Trả về một bảng hoàn toàn động từ một hàm Oracle


8

Tôi muốn viết một hàm với hai INtham số trong đó varchardanh sách thứ nhất là danh sách thứ hai và thứ hai varchars. Dựa trên những điều này tôi muốn trả về một bảng với số lượng cột và tên loại khác nhau varchar.

Theo như tôi đã thấy, tôi phải luôn tạo một đối tượng / bản ghi và một kiểu bảng của nó. Điều này có nghĩa là ý tưởng của tôi sẽ không hoạt động? Mục tiêu cơ bản là để chuyển một đầu ra lệnh hệ thống trở lại một callee dưới dạng bảng.

Chỉnh sửa: thêm về nhiệm vụ. Tôi muốn đưa ra một lệnh hệ điều hành, tiêu thụ đầu ra và trả lại dưới dạng bảng. Đầu ra từ lệnh OS sẽ là dữ liệu được định dạng CSV. Tại thời điểm thực hiện tôi không biết số lượng hàng được trả về mà chỉ có số lượng cột được truyền dưới dạng đối số thứ hai. Tôi đã suy nghĩ về việc sử dụng Java với một động STRUCTARRAYchứa chúng. Mặc dù tôi thích cách tiếp cận trước đây.

Nó sẽ giống như thế này:

create function(clob query, list of varchars cols) returns table
begin
  execute system command(query, cols);
  examine sysout from command;
  return tabular data from syscmd as table;
end

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


1

Mặc dù có thể khá phức tạp để viết hàm bảng pipelined trả về cấu trúc biến . Hàm bảng đường ống của bạn có thể lấy hai đối số và sử dụng giao diện Hộp dữ liệu Oracle và phép thuật của loại AnyDataSet để trả về cấu trúc động khi chạy. Sau đó, bạn có thể sử dụng nó trong các câu lệnh SQL tiếp theo như thể nó là một bảng, tức là

SELECT *
  FROM TABLE( your_pipelined_function( p_1, p_2 ));

Một vài tài liệu tham khảo thảo luận về việc thực hiện mẫu tương tự


0

Tôi nghĩ cách tiếp cận tốt nhất của bạn là từ bỏ nỗ lực gửi lại một bảng động (mặc dù tôi cho rằng bạn thể tạo bảng tạm thời và gửi lại một người giới thiệu cho nó, nhưng tôi không chắc ở đây).

Cách tiếp cận ưa thích của tôi ở đây sẽ là tạo ra các kết quả ở định dạng linh hoạt hơn, giống như một tài liệu XML hoặc tương tự và trả lại nó. Điều này mang lại cho bạn sự linh hoạt mà bạn cần mà không cần phải xác định các cột sau khi quét chức năng.


Xin chào Chris, cảm ơn vì câu trả lời. Tôi đã từ bỏ bảng động vì đơn giản là không thể. XML quá dài dòng nhưng là một ý tưởng tốt. Vấn đề chính của tôi là tôi sẽ cần gọi một hàm Java tĩnh để truy vấn một chỉ mục lucene. Điều này có nghĩa là tôi cần mở và đóng chỉ mục mỗi lần. Điều này rất không hiệu quả. Tôi đã sử dụng dịch vụ REST với đầu ra JSON và XML.
Michael-O

0

bạn có thể tạo chế độ xem tmp và thay thế chế độ xem một cách linh hoạt.

create or replace view tmp_view as select 1 x from dual;
/
create or replace package pkg_input_sql is
  cursor my_cursor is select * from tmp_view;

  my_rec_type my_cursor%rowtype;
  type my_tab_type is table of my_cursor%rowtype;

  function get_cursor(p_sqlstr varchar2) return sys_refcursor;
  function get_table return my_tab_type
    pipelined;

end pkg_input_sql;
/
create or replace package body pkg_input_sql is

  function get_cursor(p_sqlstr varchar2) return sys_refcursor as
    my_cursor sys_refcursor;
  begin
    open my_cursor for p_sqlstr;
    return my_cursor;
  end get_cursor;

  function get_table return my_tab_type
    pipelined is
    my_tab    my_tab_type;
    i         pls_integer;
    my_cursor sys_refcursor;
  begin
    my_cursor := get_cursor('select * from tmp_view');
    fetch my_cursor bulk collect
      into my_tab;
    for i in 1 .. my_tab.count loop
      pipe row(my_tab(i));
    end loop;
  end;

begin
  null;
end pkg_input_sql;
/

create or replace procedure create_tmp_view(p_sqlstr varchar2) is
begin
  execute immediate 'create or replace view tmp_view as ' || p_sqlstr;
  dbms_utility.exec_ddl_statement('alter package pkg_get_sql compile package');
  dbms_session.reset_package; -- to avoid ora-04068
end create_tmp_view;

kết quả thực hiện:

nhập mô tả hình ảnh ở đây


-1

Một giải pháp sẽ là tạo một bảng ngoài dựa trên đầu ra Lucene. Bạn có thể dễ dàng thay đổi định nghĩa bảng bên ngoài (và để trỏ nó vào nhiều tệp).

Vì vậy, bạn sẽ có:

function l_query(clob query, list of varchars cols) returns table_name
begin 
execute system command(query, cols); 
#hopefully we know the output filename
create a new external table mapping the output;
end

Nó sẽ làm việc! Định nghĩa của tệp được biết đến và chúng ta có thể tạo ra một bảng bên ngoài.
Ohadi
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.