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

Cara menampilkan hasil prosedur di luarnya di Oracle

Untuk menguji prosedur yang Anda tunjukkan, Anda akan melakukan sesuatu seperti:

declare
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  drill_record_position('D', l_id, l_group_name, l_group_level);
  dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
end;
/

Tapi itu - atau lebih khusus lagi, prosedur Anda - hanya berfungsi jika ada tepat satu baris dalam kumpulan hasil kueri untuk tipe nilai yang diteruskan. Sepertinya Anda mengharapkan beberapa baris kembali (yang akan mendapatkan terlalu banyak baris), tetapi mungkin juga ada yang tidak (yang tidak akan mendapatkan data yang ditemukan).

Jadi sepertinya pertanyaan Anda seharusnya tentang bagaimana menulis prosedur Anda sehingga berfungsi dengan salah satu metode pengambilan/pengujian yang Anda coba.

Jika prosedur Anda perlu mengembalikan beberapa baris, maka prosedur tersebut dapat menggunakan kursor ref, mis.:

create or replace procedure drill_record_position (
  p_record_type in varchar2,
  p_ref_cursor out sys_refcursor
)
as
begin
  open p_ref_cursor for
    select hr.id, hr.group_name, hr.group_level
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type;
end drill_record_position;
/

yang kemudian dapat Anda uji dengan sesuatu seperti:

declare
  l_ref_cursor sys_refcursor;
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  drill_record_position('D', l_ref_cursor);
  loop
    fetch l_ref_cursor into l_id, l_group_name, l_group_level;
    exit when l_ref_cursor%notfound;
    dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
  end loop;
  close l_ref_cursor;
end;
/

Anda juga dapat melakukannya sebagai fungsi, yang mungkin lebih mudah digunakan dari aplikasi Anda:

-- drop procedure drill_record_position;

create or replace function drill_record_position (p_record_type in varchar2)
return sys_refcursor as
  l_ref_cursor sys_refcursor;
begin
  open l_ref_cursor for
    select hr.id, hr.group_name, hr.group_level
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type;
  return l_ref_cursor;
end drill_record_position;
/

declare
  l_ref_cursor sys_refcursor;
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  l_ref_cursor := drill_record_position('D');
  loop
    fetch l_ref_cursor into l_id, l_group_name, l_group_level;
    exit when l_ref_cursor%notfound;
    dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
  end loop;
  close l_ref_cursor;
end;
/

Anda juga dapat melakukan ini dengan koleksi dan fungsi pipelined, yang lebih sulit untuk disiapkan:

create type t_drill_obj as object (
   -- use your real data types...
  id number,
  group_name varchar2(10),
  group_level number
)
/

create type t_drill_tab as table of t_drill_obj
/

create or replace function drill_record_position (p_record_type in varchar2)
return t_drill_tab pipelined as
begin
  for l_row in (
    select t_drill_obj(hr.id, hr.group_name, hr.group_level) as obj
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type
  )
  loop
    pipe row (l_row.obj);
  end loop;
  return;
end drill_record_position;
/

tetapi Anda dapat menyebutnya sebagai bagian dari kueri lain, dan bahkan menggabungkan hasil jika Anda perlu:

select * from table(drill_record_position('D'));



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghasilkan pernyataan DELETE di PL/SQL, berdasarkan tabel hubungan FK?

  2. rs.last() memberikan operasi yang tidak valid untuk forward only resultset :last

  3. ... di mana count(col)> 1

  4. Oracle:pemicu kenaikan otomatis.

  5. tanggal sebagai nama kolom