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

Oracle FOR LOOP tidak beralih di SYS_REFCURSOR

Perhatikan komentar tambahan berikut:

Mungkin di tengah pertanyaannya adalah kesalahpahaman tentang apa itu kursor. Ini bukan wadah yang penuh dengan catatan, ini adalah spesifikasi untuk kumpulan hasil, seperti pada suatu waktu, berdasarkan satu kueri SQL. Jadi jika Anda

open rc for select id from table1;

dan berikan rc kembali ke pemanggil, Anda tidak meneruskan data apa pun, Anda meneruskan pointer ke area memori pribadi yang berisi kueri yang disiapkan. Anda tidak mendorong hasil, penelepon menariknya. Ini seperti program yang akan dijalankan pemanggil untuk mengambil baris. Anda tidak dapat membukanya sedikit lagi untuk menambahkan baris lain, yang menurut saya adalah apa yang Anda harapkan.

Untuk menggunakan koleksi di kursor dalam suatu prosedur, tipe koleksi harus dibuat sebagai objek skema terpisah (meskipun tentu saja Anda dapat menggunakan kembali tipe koleksi dalam prosedur lain, jadi tidak seketat kedengarannya).

Jika Anda tidak dapat membuat jenis, lihat jenis yang sudah ada yang dapat Anda gunakan:

select owner, type_name
from   all_coll_types t
where  t.coll_type = 'TABLE'
and    t.elem_type_name = 'NUMBER';

Misalnya:

create or replace type number_tt as table of number;

create table table1 (id primary key, currency, t_id) as
    select 10, 'GBP', 'PB1' from dual union all
    select 15, 'GBP', 'RB' from dual union all
    select 20, 'GBP', 'CC' from dual union all
    select 25, 'AUD', 'DC' from dual;

create table table2 (id,country,account) as
    select 10, 'UK', 'PB1' from dual union all
    select 15, 'Wales', 'RB' from dual union all
    select 20, 'SH', 'CC' from dual;

Sekarang prosedurnya bisa:

create or replace procedure myproc
    ( rc out sys_refcursor)
as
    l_names number_tt;
begin
    select id bulk collect into l_names
    from   table1
    where  currency = 'GBP';

    open rc for
        select t.id,t.country,t.account from table2 t
        where  t.id member of l_names;
end myproc;

Keluaran kursor:

        ID COUNT ACC
---------- ----- ---
        10 UK    PB1
        15 Wales RB
        20 SH    CC

(Saya menghapus i_id parameter dalam prosedur Anda karena saya tidak jelas bagaimana Anda ingin menggunakannya.)

Agaknya ini adalah versi yang disederhanakan dari masalah yang sebenarnya, karena sebagaimana adanya, Anda dapat menggunakan kueri pertama sebagai subkueri dan Anda tidak memerlukan koleksi:

create or replace procedure myproc
    ( rc out sys_refcursor)
as
begin
    open rc for
        select t.id,t.country,t.account from table2 t
        where  t.id in
               ( select id 
                 from   table1
                 where  currency = 'GBP' );
end myproc;

atau bergabung saja, seperti yang disarankan Littlefoot:

create or replace procedure myproc
    ( rc out sys_refcursor)
as
begin
    open rc for
        select t2.id, t2.country, t2.account
        from   table1 t1
               join table2 t2 on t2.id = t1.id
        where  t1.currency = 'GBP';
end myproc;

Namun, Anda mengomentari jawaban itu bahwa Anda tidak dapat melakukannya karena kebutuhan Anda tampaknya melakukannya melalui kumpulan, loop, beberapa lakban, dua kucing, dan generator fusi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekspresi reguler pada Tanggal di Oracle

  2. Bagaimana saya bisa tahu jika sistem Oracle saya diatur untuk mendukung karakter Unicode atau multibyte?

  3. Bagaimana cara mengekstrak hanya Waktu dari bidang DateTime di Oracle SQL Developer?

  4. Bagaimana cara menghitung nilai kolom di Oracle 10g?

  5. Bagaimana menemukan tiga gaji tertinggi di tabel emp di oracle?