迭代PL/SQL中的列

Leo*_*Leo 13 oracle plsql loops

我有一张带有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; 
Run Code Online (Sandbox Code Playgroud)

但我收到错误:PLS-00320:此表达式的声明类型声明不完整或格式错误

Jus*_*ave 27

在PL/SQL中迭代表中的行的最简单方法是执行类似的操作

BEGIN
  FOR employees IN (SELECT emp_id FROM emp)
  LOOP
    dbms_output.put_line( employees.emp_id );
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

或者,您可以将所有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;
Run Code Online (Sandbox Code Playgroud)

但是,如果您的查询可以返回数千行,则将所有数据提取到集合中可能会使用比您想要的更多的PGA内存,您可能需要使用LIMIT子句获取块中的行.但在这一点上,这似乎已经超越了我们自己.


Ale*_*ole 5

Justin Cave 已经解释了如何执行此操作,但要具体查看您收到的错误,这是因为:

eid emp_ID%TYPE;
Run Code Online (Sandbox Code Playgroud)

使用时,%TYPE您必须指定表名和列名:

eid emp.emp_ID%TYPE;
Run Code Online (Sandbox Code Playgroud)

如果您选择该行中的所有列,您还可以查看%ROWTYPE.

您的方法还做出了两个假设:初始 select intoeid找到了最低的 ID,这绝不是保证的;并且所有后续 ID 值都是连续的。您正在声明并填充aRows但引用Tot_Rows.