2011-01-18 53 views
11

我有一张表Emp,EmpID,Empname,Salary,我试图为每个员工做一次计算。但是我在尝试迭代每个emp来执行计算时遇到了问题。我不能使用显式游标。遍历PL/SQL中的一列

所以现在我只是想创建empIDs名单:

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:这个表达式的类型的声明是不完整或残缺

回答

24

遍历排在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子句以块的形式获取行。但是在这一点上,这似乎已经超越了我们自己。

+0

感谢您的帮助Justin,但是当我运行您的第一个代码但dbms输出不是(employees.eid)时,它不会在dbms输出中打印出来。你知道为什么吗? – Leo 2011-01-18 23:08:34

4

贾斯汀洞解释如何做到这一点,但具体看一下你得到的错误,那是因为这个:

eid emp_ID%TYPE; 

当使用%TYPE,你必须指定表名以及列名:

eid emp.emp_ID%TYPE; 

如果你在该行中被选择的所有列,你也可以看看%ROWTYPE

你的方法也做了两个假设:最初选择到eid找到最低的ID,这绝不是保证;并且所有后续的ID值都是连续的。并且您声明并填充了aRows,但是指的是Tot_Rows