我有一张带有EmpID,Empname,Salary的表格,我正在尝试为每位员工进行计算。但是我在尝试迭代每个emp来进行计算时遇到了问题。我不能使用明确的游标。
所以现在我只是想创建一个empID列表:
Declare
aRows Number;
eid emp_ID%TYPE;
Begin
Select Count(*)
Into aRows
from emp;
Select emp_ID
Into eid
From emp;
FOR days IN 1..Tot_Rows
Loop
Dbms_Output.Put_Line(eid);
eid := eid + 1;
End Loop;
END;
但我收到错误: PLS-00320:此表达式类型的声明不完整或格式错误
答案 0 :(得分:26)
在PL / SQL中迭代表中的行的最简单方法是执行类似
的操作BEGIN
FOR employees IN (SELECT emp_id FROM emp)
LOOP
dbms_output.put_line( employees.emp_id );
END LOOP;
END;
或者,您可以将所有EID值提取到PL / SQL集合中并迭代集合,如本示例所示
DECLARE
TYPE emp_id_tbl IS TABLE OF emp.emp_id%type;
l_emp_ids emp_id_tbl ;
BEGIN
SELECT emp_id
BULK COLLECT INTO l_emp_ids
FROM emp;
FOR i IN l_emp_ids .FIRST .. l_empnos.LAST
LOOP
dbms_output.put_line( l_emp_ids (i) );
END LOOP;
END;
但是,如果您的查询可以返回数千行,则将所有数据提取到集合中可能会使用比您想要的更多的PGA内存,您可能需要使用LIMIT子句获取块中的行。但在这一点上,这似乎已经超越了我们自己。
答案 1 :(得分:4)
Justin Cave已经解释了如何做到这一点,但要专门看看你得到的错误,那是因为:
eid emp_ID%TYPE;
使用%TYPE
时,您必须指定表名和列名:
eid emp.emp_ID%TYPE;
如果您选择了行中的所有列,您还可以查看%ROWTYPE
。
你的方法也做了两个假设:初始选择eid
找到了最低的ID,这绝不是保证;并且所有后续ID值都是顺序的。并且您正在声明并填充aRows
,但引用Tot_Rows
。