Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengulang nilai, membuat kueri dinamis, dan menambahkan ke kumpulan hasil

Fungsi tabel berpipa tampaknya lebih cocok untuk apa yang Anda inginkan, terutama jika semua yang Anda lakukan adalah mengambil data. Lihat http://www.Oracle-base.com/ article/misc/pipelined-table-functions.php

Apa yang Anda lakukan adalah membuat tipe untuk baris output Anda. Jadi dalam kasus Anda, Anda akan membuat objek seperti

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

Kemudian buat tipe tabel yang merupakan tabel yang terdiri dari tipe baris Anda di atas

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Kemudian buat fungsi tabel Anda yang mengembalikan data secara pipelined. Pipelined di Oracle sedikit mirip dengan pengembalian hasil di .net (tidak yakin apakah Anda terbiasa dengan itu). Anda menemukan semua baris yang Anda inginkan dan "menyalurkan" mereka satu per satu dalam satu lingkaran. Saat fungsi Anda selesai, tabel yang dikembalikan terdiri dari semua baris yang Anda keluarkan.

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;

EDIT:Mengikuti komentar Alex di bawah, Anda memerlukan sesuatu seperti ini. Saya belum dapat menguji ini, tetapi ini akan membantu Anda memulai:

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;

Info tambahan dari komentar Alex di bawah ini berguna untuk jawabannya:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL beralih dari decode ke case

  2. SQL Query untuk Menciutkan Nilai Duplikat Berdasarkan Rentang Tanggal

  3. Guci mana di server weblogic/sumber daya lain yang mungkin memiliki kelas:oracle.security.jps.ee.http.JpsFilter?

  4. Oracle DataAccess terkait:Anggota yang dipanggil tidak didukung dalam perakitan dinamis.

  5. Menampilkan Pemicu DBMS_OUTPUT.PUT_LINE di Oracle Apex