sql >> Databasteknik >  >> RDS >> Oracle

Hur man visar resultaten av en procedur utanför den i Oracle

För att testa proceduren du visade, skulle du göra något i stil med:

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

Men det - eller mer specifikt, din procedur - fungerar bara om det finns exakt en rad i sökfrågans resultatuppsättning för den inlämnade värdetypen. Det verkar som om du förväntar dig flera rader tillbaka (vilket skulle få för många rader), men det kan också finnas icke (som skulle få ingen data-funna).

Så egentligen verkar det som att din fråga borde handla om hur du skriver din procedur så att den fungerar med en av de hämtning/testmetoder du provat.

Om din procedur behöver returnera flera rader kan den använda en ref-markör, t.ex.:

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

som du sedan kan testa med något i stil med:

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

Du kan också göra det som en funktion, vilket kan vara lättare att arbeta med från din applikation:

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

Du kan också göra detta med samlingar och en pipelined funktion, vilket är mer jobb att ställa in:

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

men du kan kalla det som en del av en annan fråga, och till och med gå med i resultatet om du behövde:

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



  1. Hur man returnerar tabellen med mysql-funktionen

  2. MySQL-transaktion över två databaser på olika servrar

  3. Rake-uppgifter verkar ignorera database.yml-konfigurationen

  4. Vad gör DELIMITER // i en utlösare?