Набор результатов вывода хранимой процедуры - PullRequest
0 голосов
/ 26 июня 2019

Извиняюсь за вопрос новичка, я пишу хранимую процедуру Oracle, которая открывает курсор для определенного SQL, вычисляет некоторые переменные для каждой строки, возвращаемой курсором, но хранимая процедура должна вернуть в результате набор этих переменных, которые былирассчитывается для каждой строки, возвращаемой курсором.Я немного запутался, как это сделать - кто-нибудь может помочь?!

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

Если вы хотите, чтобы процедура возвращала ссылочный курсор для вызывающей подпрограммы, чтобы сама процедура не могла ее использовать. Курсоры, включая эталонные курсоры, - это 1-сторонние, 1-кратные расходные материалы. Что касается желаемых расчетов, то их можно добавить, чтобы выбрать определенный для курсора. Итак:

-- setup 
create table test (blah integer, blah_stuff varchar2(50) );

-- build sp 
create or replace procedure sp_blah_text(
                  in_input  in number
                , out_cur  out sys_refcursor
                )
is
begin 
    open out_cur for
         select blah, blah_stuff, blah*5 as blah_x_5
           from test
          where blah = in_input;
end sp_blah_text; 

-- test data 
insert into test(blah, blah_stuff)
  select 1,'a' from dual union all
  select 2,'b' from dual union all 
  select 2,'x' from dual union all 
  select 2,'z' from dual union all   
  select 3,'c' from dual;

-- test 
declare
   ref_cur  sys_refcursor;
   l_blah   test.blah%type;
   l_stuff  test.blah_stuff%type;
   l_blah_5 test.blah%type; 
begin
   dbms_output.enable(null);
   sp_blah_text(2,ref_cur);
   loop
      fetch ref_cur
       into l_blah
          , l_stuff
          , l_blah_5;
      exit when ref_cur%notfound;
    dbms_output.put_line('blah=' || l_blah || ',stuff=' || l_stuff || ',blah*5=' || l_blah_5);
   end loop;
end;
0 голосов
/ 30 июня 2019

Это работает удовольствие большое спасибо.Теперь у меня есть проблема с производительностью, с которой, возможно, вы могли бы помочь.Когда я открываю курсор, я затем запускаю несколько других операторов SELECT, чтобы получить значения, используя переменные из курсора (см. Ниже).Я предполагаю, что это потому, что переключение между PL / SQL и движком SQL.Поможет ли использование коллекций таблиц?Но, как я вижу, поскольку мне нужны разные столбцы из разных таблиц, мне нужно иметь несколько разных коллекций, как я могу вывести все в одной записи?

CREATE OR REPLACE procedure sp_test
(
 in_input in number
)  
as 
v_calc number;
v_calc_res number;
v_blah_blah number;
v_blah_blah_blah number;
v_blah_blah_blah number;
 CURSOR C_test IS 
      select blah from test where blah  = in_input;
begin
  open c_test
  loop
  fetch c_test into v_calc;

select blah_blah into v_blah_blah from t_blah_blah;

select blah_blah_blah into v_blah_blah_blah from t_blah_blah_blah;

select blah_blah_blah_blah into v_blah_blah_blah_blah from t_blah_blah_blah_blah;

    v_calc_res := v_calc*5*v_blah_blah*v_blah_blah_blah*v_blah_blah_blah_blah
  end loop;
end;
0 голосов
/ 26 июня 2019

Я читал кое-что из этого до сих пор, у меня есть что-то вроде этого (просто урезанный пример, а не точный код), но мне просто нужно вернуть v_calc и v_calc_res в наборе результатов: -

CREATE OR REPLACE procedure sp_test
(
 in_input in number,
 out_return out sys_refcursor
)  
as 
v_calc number;
v_calc_res number;
 CURSOR C_test IS 
      select blah from test where blah  = in_input;
begin
  open c_test
  loop
  fetch c_test into v_calc;
   v_calc_res := v_calc*5;
  end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...