我正在处理存储过程,我需要检索一组结果并单独处理每个元素,然后返回整个结果。(使用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
谢谢,
汤姆
答案 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 - 编程语言)之间的区别以及适合您案例的部分:
{9}}提供了针对Oracle 9i R2的完整PL / SQL参考。
可以找到所有Oracle 9i R2文档的集合this link。