使用For循环在Oracle过程中检索多行

时间:2010-08-10 17:05:47

标签: oracle stored-procedures join plsql cursor

我正在处理存储过程,我需要检索一组结果并单独处理每个元素,然后返回整个结果。(使用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 个答案:

答案 0 :(得分:4)

循环中的SELECT需要有一个INTO子句来处理值 - 从你的代码中你不清楚你要做什么,但我怀疑游标循环中嵌套的SELECT / JOIN可能是最好在主光标中写成三个表连接。

答案 1 :(得分:1)

以下是一个可能的解决方案,做出了相当多的假设。如上所述,它将结果作为包含来自所有3个表的数据的引用游标返回(让每个表返回一个引用游标是微不足道的,但对于可疑结果来说,这将更有用)。

但是,除非你真的在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;

答案 2 :(得分:0)

您需要添加一个INTO子句来指定放置所选数据的局部变量,例如

select ID, Name
  into myID, myName
from emp

答案 3 :(得分:-1)

您的代码中存在太多语法和意识形态错误。 因此,请阅读PL/SQL documentation here,尤其是PL/SQL Architecture section,以了解SQL和PL / SQL(通常是SQL查询语言,PL / SQL - 编程语言)之间的区别以及适合您案例的部分:

  1. "Understanding PL/SQL Procedures""Understanding PL/SQL Functions"
  2. "Cursor FOR Loops""Using cursor FOR Loops"
  3. {9}}提供了针对Oracle 9i R2的完整PL / SQL参考。

    可以找到所有Oracle 9i R2文档的集合this link