dbms_output.put_line 即使在 'set serveroutput on' 之后也不打印内部程序

dbms_output.put_line not printing inside procedure even after 'set serveroutput on'

下面的过程执行得很好,但是它里面的 'dbms' 没有打印任何输出。(这个过程旨在记下尚未在 table 中输入工资的员工的姓名) table 有两列,即 1)name_of_emp 2)salary(默认 0)

create or replace procedure add_sal_info
as
    cursor c is select * from emp_earnings;
    cname varchar2(30);
    csal number(5);

begin
    open c;

    while(c%found) loop
        fetch c into cname, csal;
        if (csal = 0) then
            dbms_output.put_line('enter salary for : ' ||' '|| cname);
        end if;
    end loop;

    close c;
end;
/

服务器输出设置为 'on' 并且我在执行时收到消息 "procedure completed successfully" 但它不打印未输入工资的 emps 的名称(其中有几个在table)。 这里有什么症结吗?

c%found 在您获取一行之前是不正确的,因此您永远不会进入循环。这是一个代码结构问题,而不是 dbms_output 问题。

顺便说一下,这可以简化为:

create or replace procedure add_sal_info
as
    cursor c is select * from emp_earnings;
begin
    for r in c loop
        if r.csal = 0 then
            dbms_output.put_line('enter salary for : ' ||' '|| r.cname);
        end if;
    end loop;
end;

甚至

create or replace procedure add_sal_info
as
begin
    for r in (
        select * from emp_earnings
    )
    loop
        if r.csal = 0 then
            dbms_output.put_line('enter salary for : ' ||' '|| r.cname);
        end if;
    end loop;
end;

PL/SQL 没有围绕 ifwhile 条件的方括号(而是有 then 关键字)。您可以将它们放在那里,但它们会被忽略。