sql >> Databáze >  >> RDS >> Oracle

Jak zobrazit výsledky procedury mimo ni v Oracle

Chcete-li otestovat postup, který jste ukázali, udělali byste něco jako:

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 - nebo přesněji, váš postup - funguje pouze tehdy, pokud je ve výsledné sadě dotazu přesně jeden řádek pro typ předané hodnoty. Zdá se, že očekáváte více řádků zpět (což by získalo příliš mnoho řádků), ale mohlo by také existovat žádné (což by nenalezlo žádná data).

Takže to opravdu vypadá, že vaše otázka by se měla týkat toho, jak napsat svůj postup, aby fungoval s jednou z metod vyhledávání/testování, které jste vyzkoušeli.

Pokud váš postup potřebuje vrátit více řádků, může použít referenční kurzor, např.:

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

které byste pak mohli otestovat pomocí něčeho jako:

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

Můžete to také udělat jako funkci, se kterou se může snadněji pracovat z vaší aplikace:

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

Můžete to udělat také pomocí kolekcí a zřetězené funkce, což je náročnější na nastavení:

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 můžete to zavolat jako součást jiného dotazu a dokonce se k výsledku připojit, pokud potřebujete:

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



  1. Přidejte vnitřní spojení do příkazu GROUP_CONCAT mySQL

  2. Nejlepší datový typ mysql pro gramy, miligramy, mikrogramy a kilojoule

  3. Shoda SQL na uspořádání písmen a čísel bez použití regulárních výrazů

  4. MySQL Workbench zobrazuje výsledky jako BLOB