即使在'set serveroutput on'

时间:2017-08-26 07:24:00

标签: sql stored-procedures plsql oracle10g plsqldeveloper

以下程序执行正常,但其中的“dbms”不打印任何输出。(程序意味着记下表中尚未输入工资的emps的名称) 该表有两列,即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;
/

serveroutput设置为'on'并且我在执行时得到消息“procedure completed successfully”但它不打印未输入工资的emps的名称(表中有一些)。 这里有什么关键吗?

1 个答案:

答案 0 :(得分:0)

在获取一行之前,

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关键字)。你可以把它们放在那里,但它们会被忽略。