Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Vòng lặp các giá trị, tạo truy vấn động và thêm vào tập kết quả

Một hàm bảng pipelined có vẻ phù hợp hơn với những gì bạn muốn, đặc biệt nếu tất cả những gì bạn đang làm là truy xuất dữ liệu. Xem http://www.oracle-base.com/ article / misc / pipelined-table-functions.php

Những gì bạn làm là tạo một kiểu cho hàng đầu ra của bạn. Vì vậy, trong trường hợp của bạn, bạn sẽ tạo một đối tượng chẳng hạn như

CREATE TYPE get_data_faster_row AS OBJECT(
    seq    NUMBER(15,2),
    value  VARCHAR2(10),
    item   VARCHAR2(10)
);

Sau đó, tạo một loại bảng là một bảng được tạo thành từ loại hàng của bạn ở trên

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Sau đó, tạo hàm bảng của bạn để trả về dữ liệu theo cách thức tổng hợp. Pipelined trong Oracle hơi giống với lợi nhuận trả về trong .net (không chắc bạn có quen với điều đó không). Bạn tìm thấy tất cả các hàng mà bạn muốn và "chuyển" chúng ra từng hàng một trong một vòng lặp. Khi hàm của bạn hoàn thành, bảng được trả về bao gồm tất cả các hàng bạn đã nhập.

CREATE FUNCTION Get_Data_Faster(params) RETURN get_data_faster_data PIPELINED AS
BEGIN
    -- Iterate through your parameters 
        --Iterate through the results of the select using
        -- the current parameters. You'll probably need a 
        -- cursor for this
        PIPE ROW(get_data_faster_row(seq, value, item));
        LOOP;
    LOOP;
END;

CHỈNH SỬA:Theo bình luận của Alex bên dưới, bạn cần một cái gì đó như thế này. Tôi không thể kiểm tra điều này nhưng nó sẽ giúp bạn bắt đầu:

CREATE FUNCTION Get_Data_Faster(in_seq_numbers IN seq_numbers_array, in_values IN text_array, in_items IN text_array, list IN VARCHAR2) RETURN get_data_faster_data PIPELINED AS
    TYPE r_cursor IS REF CURSOR;
    query_results r_cursor;
    results_out get_data_faster_row := get_data_faster_row(NULL, NULL, NULL);

    query_str VARCHAR2(4000);

    seq_number NUMBER;
    the_value VARCHAR2(10);
    the_item VARCHAR2(10);

BEGIN
    FOR i IN 1..in_seq_number.COUNT
    LOOP
        seq_number := in_seq_numbers(i);
        the_value := trim(in_values(i));
        the_item := trim(in_items(i));

        query_str := 'SELECT distinct '||seq_number||' as seq, value, item
        FROM my_table ai';                    

        query_str := query_str || '
        WHERE ai.value = '''||the_value||''' AND ai.item = '''||the_item||'''
        AND ai.param = ''BOOK''
        AND ai.prod in (' || list || ');

        OPEN query_results FOR query_str;

        LOOP
            FETCH query_results INTO 
                results_out.seq,
                results_out.value,
                results_out.item;
            EXIT WHEN query_results%NOTFOUND;
            PIPE ROW(results_out);
        END LOOP;

    CLOSE query_results;

    END LOOP;

END;

Thông tin bổ sung từ bình luận của Alex bên dưới hữu ích cho câu trả lời:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Specifiy classpath dành cho maven

  2. Oracle.ManagedDataAccess với Oracle 8.1.7 DB

  3. Chạy quy trình được lưu trữ từ JMeter

  4. Xếp tầng Xóa truy vấn

  5. Cách tạo liên kết DB giữa hai phiên bản oracle