Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wyświetlić wyniki procedury poza nią w Oracle?

Aby przetestować pokazaną procedurę, zrobiłbyś coś takiego:

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;
/

Ale to — a dokładniej, procedura — działa tylko wtedy, gdy w zestawie wyników zapytania znajduje się dokładnie jeden wiersz dla przekazanego typu wartości. Wygląda na to, że spodziewasz się wielu wierszy z powrotem (co spowodowałoby uzyskanie zbyt wielu wierszy), ale może być również brak (co spowoduje brak danych).

Wygląda więc na to, że twoje pytanie powinno dotyczyć tego, jak napisać procedurę, aby działała z jedną z wypróbowanych metod pobierania/testowania.

Jeśli twoja procedura wymaga zwrócenia wielu wierszy, może użyć kursora ref, np.:

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;
/

które możesz następnie przetestować za pomocą czegoś takiego:

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;
/

Możesz to również zrobić jako funkcję, która może być łatwiejsza do pracy z Twojej aplikacji:

-- 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;
/

Możesz to również zrobić za pomocą kolekcji i funkcji potokowej, której konfiguracja wymaga więcej pracy:

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;
/

ale możesz to wywołać jako część innego zapytania, a nawet dołączyć do wyniku, jeśli zajdzie taka potrzeba:

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. Zrozumienie wyników Execute Explain Plan w Oracle SQL Developer

  2. Jak stworzyć sekwencję Oracle zaczynającą się od maksymalnej wartości z tabeli?

  3. Cofnij A, jeśli B pójdzie nie tak. wiosna boot, jdbctemplate

  4. Jak korzystać z Oracle w cakePHP

  5. Wygeneruj plik XML z niestandardowymi tagami XML z tabeli bazy danych Oracle