Использование цикла For для получения нескольких строк в процедуре Oracle - PullRequest
1 голос
/ 10 августа 2010

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

Я не слишком знаком с базами данных, но вотчто я смог придумать ..

create or replace procedure GET_EMP_RSLT
  IS

CURSOR ecursor IS select emp_id from temp_employee where 'some condition';

BEGIN

FOR empidset in ecursor  

  LOOP

  Select * from 

    (select * from payroll_info where emp_id = empidset.emp_id) a

    left join 

    (select * from benefit_info where emp_id = empidset.emp_id) b 
     on a.emp_id = b.emp_id    

  END LOOP;

END;

При выполнении я получаю следующую ошибку ..

an INTO clause is expected in this SELECT statement : "Select * from"

Может кто-нибудь объяснить, как я могу исправить эту ошибку иполучить требуемые результаты?

PS.Я использую Oracle 9i & TOAD 9

Спасибо,
Том

Ответы [ 4 ]

4 голосов
/ 10 августа 2010

SELECT внутри вашего цикла должен иметь предложение INTO для обработки значений - из вашего кода неясно, что вы пытаетесь сделать, но я подозреваю, что вложенные SELECT / JOIN внутри цикла курсора могут быть лучше записать в виде трех таблиц в главном курсоре.

1 голос
/ 11 августа 2010

Ниже приведено возможное решение, сделав немало предположений.Как было написано, он возвращает результат в виде курсора ref, содержащего данные из всех 3 таблиц (было бы тривиально заставить его возвращать курсор ref для каждой таблицы, но для сомнительного результата это было бы больше работы).* Однако, если вы на самом деле не делаете в PL / SQL то, что не можете сделать в SQL, было бы гораздо лучше сделать это непосредственно в SQL.

create object EMP_PAYROLL_BENEFIT as object (
   em_id number,
   some_payroll_column number,
   some_benefit_column number);

create type NT_EMP_PAYROLL_BENEFIT as table of EMP_PAYROLL_BENEFIT;

create or replace procedure GET_EMP_RSLT(p_output OUT sys_refcursor)  IS    
CURSOR ecursor IS select emp_id 
                  from temp_employee te 
                       join payroll_info pi 
                       on te.emp_id = pi.emp_id 
                       join benefit_info bi 
                       on te.emp_id = bi.emp_id 
                  where some_column = 'some condition';
v_results NT_EMP_PAYROLL_BENEFIT;
BEGIN
   open ecursor;
   fetch ecursor bulk collect into v_results;
   close ecursor;
   for i = v_results.first..v_results.last loop
      v_results.some_benefit_column := some_payroll_column + i;
   end loop;
   open p_output for select * from table(v_results);
end;
0 голосов
/ 11 августа 2010

В вашем коде слишком много синтаксических и идеологических ошибок.Поэтому, пожалуйста, прочитайте документацию по PL / SQL здесь , особенно раздел Архитектура PL / SQL , чтобы понять разницу между SQL и PL / SQL (обычно SQL - язык запросов, PL / SQL -язык программирования) и разделы для вашего случая:

  1. "Понимание процедур PL / SQL" и "Понимание функций PL / SQL"
  2. «Курсор для циклов» и «Использование курсора для циклов»

Полный справочник PL / SQL для Oracle 9i R2 доступен по по этой ссылке.

Набор всей документации по Oracle 9i R2 можно найти здесь .

0 голосов
/ 10 августа 2010

Вам необходимо добавить предложение INTO, чтобы указать, в какие локальные переменные помещать выбранные данные, например.

select ID, Name
  into myID, myName
from emp
...