Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да покажа резултатите от процедура извън него в Oracle

За да тествате процедурата, която показахте, трябва да направите нещо като:

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

Но това - или по-конкретно, вашата процедура - работи само ако има точно един ред в набора от резултати на заявката за предадения тип стойност. Изглежда, че очаквате няколко реда назад (което ще получи твърде много редове), но може да има и не (което ще получи no-data-found).

Така че наистина изглежда, че въпросът ви трябва да е за това как да напишете вашата процедура, така че да работи с един от методите за извличане/тест, които сте опитали.

Ако вашата процедура трябва да върне няколко реда, тогава тя може да използва референтен курсор, напр.:

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

което след това можете да тествате с нещо като:

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

Можете също да направите това като функция, с която може да е по-лесно да работите от вашето приложение:

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

Можете също така да направите това с колекции и конвейерна функция, която изисква повече работа за настройка:

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

но можете да го извикате като част от друга заявка и дори да се присъедините към резултата, ако трябва:

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. Избиране на произволен ред в Oracle

  2. Как мога ефективно да направя заявка за съседни набори от дати в моя набор от данни?

  3. Изберете втората минимална стойност в Oracle

  4. Грешка при опит за импортиране на драйвер oracle jdbc7 с Maven

  5. Как мога да създам уникален индекс в Oracle, но да игнорирам нули?