sql >> Database teknologi >  >> RDS >> Oracle

Sådan viser du resultaterne af en procedure uden for den i Oracle

For at teste den procedure, du viste, ville du gøre noget som:

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 mere specifikt din procedure - virker kun, hvis der er præcis én række i forespørgslens resultatsæt for den indsendte værditype. Det lader til, at du forventer flere rækker tilbage (hvilket ville få for mange rækker), men der kan også være ikke (som ville blive fundet ingen data).

Så i virkeligheden ser det ud til, at dit spørgsmål burde handle om, hvordan du skriver din procedure, så den fungerer med en af ​​de genfinding/testmetoder, du har prøvet.

Hvis din procedure skal returnere flere rækker, kan den bruge en ref-markør, f.eks.:

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 så kunne teste med noget som:

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

Det kan du også gøre som en funktion, som måske er nemmere at arbejde med fra 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 også gøre dette med samlinger og en pipelinet funktion, hvilket er mere arbejde at sætte op:

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 kalde det som en del af en anden forespørgsel og endda slutte dig til resultatet, hvis du havde brug for det:

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



  1. Top 3 resultater - MySQL

  2. Hvordan sys.dm_exec_describe_first_result_set virker i SQL Server

  3. PHP/SQL:Brug kun én forespørgsel, VÆLG rækker fra to tabeller, hvis data er i begge tabeller, eller bare VÆLG fra én tabel, hvis ikke

  4. Multiplikation af data fra MySQL række