sql >> Database >  >> RDS >> Oracle

Hoe de resultaten van een procedure daarbuiten in Oracle weer te geven

Om de procedure die u liet zien te testen, zou u zoiets doen als:

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

Maar dat - of meer specifiek uw procedure - werkt alleen als er precies één rij in de resultatenset van de query is voor het doorgegeven waardetype. Het lijkt erop dat u meerdere rijen terug verwacht (waardoor te veel rijen zouden worden), maar er kunnen ook geen zijn (waardoor geen gegevens gevonden zouden worden).

Het lijkt er dus op dat uw vraag moet gaan over hoe u uw procedure moet schrijven, zodat deze werkt met een van de ophaal-/testmethoden die u hebt geprobeerd.

Als uw procedure meerdere rijen moet retourneren, kan deze een ref-cursor gebruiken, bijvoorbeeld:

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

die je dan zou kunnen testen met zoiets als:

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

Je kunt dat ook als een functie doen, wat misschien makkelijker is om mee te werken vanuit je applicatie:

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

Je zou dit ook kunnen doen met collecties en een pijplijnfunctie, wat meer werk is om in te stellen:

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

maar je zou het kunnen noemen als onderdeel van een andere zoekopdracht, en zelfs meedoen aan het resultaat als dat nodig zou zijn:

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



  1. Hoe de SPACE()-functie werkt in SQL Server (T-SQL)

  2. Hoe de UPDATE-opdracht op te lossen die aan de gebruiker in mysql is geweigerd?

  3. Hoe meerdere tekens in SQL vervangen?

  4. In welke volgorde worden MySQL JOIN's geëvalueerd?