Saya ingin menulis fungsi dengan dua IN
parameter di mana yang pertama adalah varchar
dan yang kedua daftar varchars
. Berdasarkan ini saya ingin mengembalikan tabel dengan jumlah kolom dan nama tipe yang bervariasi varchar
.
Sejauh yang saya lihat, saya harus selalu membuat objek / catatan dan tipe tabel. Ini berarti bahwa ide saya tidak akan berfungsi? Tujuan yang mendasarinya adalah untuk mengirimkan output perintah sistem kembali ke callee sebagai tabel.
Edit: lebih lanjut tentang tugas. Saya ingin mengeluarkan perintah OS, mengkonsumsi output dan mengembalikannya sebagai tabel. Output dari perintah OS akan menjadi data yang diformat CSV. Pada saat eksekusi saya tidak tahu jumlah baris yang akan dikembalikan tetapi hanya jumlah kolom yang dilewati sebagai argumen kedua. Saya sedang berpikir tentang menggunakan Java dengan dinamis STRUCT
dan ARRAY
mengandung mereka. Meskipun saya lebih suka pendekatan yang pertama.
Seharusnya terlihat seperti ini:
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
sumber
Jawaban:
Dimungkinkan, meskipun cukup rumit, untuk menulis fungsi tabel pipelined yang mengembalikan struktur variabel . Fungsi tabel pipa Anda bisa mengambil dua argumen dan menggunakan antarmuka Oracle Data Cartridge dan keajaiban tipe AnyDataSet untuk mengembalikan struktur dinamis saat runtime. Anda kemudian dapat menggunakannya dalam pernyataan SQL berikutnya seolah-olah itu adalah sebuah tabel, yaitu
Sepasang lagi referensi yang membahas implementasi sampel yang sama
sumber
Saya pikir pendekatan terbaik Anda adalah mengabaikan upaya untuk mengirim kembali tabel dinamis (walaupun saya kira Anda mungkin dapat membuat tabel sementara dan mengembalikan refcursor ke sana, tapi saya tidak yakin di sini).
Pendekatan pilihan saya di sini adalah menghasilkan hasil dalam format yang lebih fleksibel, seperti dokumen XML atau sejenisnya dan mengembalikannya. Ini memberi Anda fleksibilitas yang Anda butuhkan tanpa harus menentukan kolom setelah pemindaian fungsi.
sumber
Anda dapat membuat tampilan tmp, dan mengganti tampilan secara dinamis.
hasil eksekusi:
sumber
Salah satu solusinya adalah membuat tabel ekstra berdasarkan pada keluaran Lucene. Anda dapat dengan mudah mengubah definisi tabel eksternal (dan mengarahkannya ke beberapa file).
Jadi, Anda akan memiliki:
sumber