【问题标题】:Does sql%rowcount attribute work in loop condition?sql%rowcount 属性是否在循环条件下工作?
【发布时间】:2026-02-15 02:50:01
【问题描述】:

我在 PL/SQL 中编写了以下程序,在学生表中插入 5 行。根据循环条件,行数应为 5,但仅显示 1。将 DBMS 输出置于循环下也无济于事。

DECLARE
    v_input_1 INT;
    v_input_2 VARCHAR2(15);
    v_input_3 VARCHAR2(10);
    v_counter NUMBER := 10;
BEGIN
    v_input_1:= 0;
    v_input_2:= &Type_student_name;
    v_input_3:= &Type_student_class;
        LOOP
            INSERT INTO STUDENTS(id, student_name, student_class)
            VALUES(v_input_1+v_counter, v_input_2, v_input_3);
            v_counter:=v_counter+10;
            EXIT WHEN V_counter > 50;
    --DBMS_OUTPUT.PUT_LINE('Total rows inserted : '||SQL%ROWCOUNT);
        END LOOP;
    DBMS_OUTPUT.PUT_LINE('Total rows inserted : '||SQL%ROWCOUNT);
END;

【问题讨论】:

标签: oracle plsql rowcount


【解决方案1】:

在您的示例中,当您一次插入一行 (insert into ... values ...) 时,SQL%ROWCOUNT 在每次迭代中都设置为 1。

因此,在这种情况下,它几乎毫无用处。创建一个局部变量并每次都增加它(类似于您对 v_counter 所做的事情),例如

declare
  l_cnt number := 0;
begin
  loop
    insert ...
    l_cnt := l_cnt + sql%rowcount;
  end loop;

  dbms_output.put_line('Number of inserted rows = ' || l_cnt);
end;

【讨论】:

  • 这会更好,@Barbaros,对于受影响的行不是 1 的其他情况。谢谢,已修复。