我做了一个测试,用下面的方法就可以输出你函数中的中间值。
SQL> create or replace function temp_func
  2  return number is
  3  begin
  4    dbms_output.put_line('输出一个值');
  5    return 1;
  6  end;
  7  /函数已创建。SQL> 
SQL> declare
  2    a number;
  3  begin
  4    a:=temp_func;
  5  end;
  6  /
输出一个值PL/SQL 过程已成功完成。我的理解是这样的,因为你调用函数时使用的是select语句,为了显示select的结果,就没有显示dbms_output.put_line输出的内容(但是该内容已进入输出缓存),当你随后调用任何使用dbms_output.put_line时,缓存中的内容就被显示出来了,所以你可以看到那些内容总是位于最前面。所以只要你是在匿名块或存储过程中调用函数,就可以显示调试信息了。

解决方案 »

  1.   

    我想可能也是这样的。不然,你看上面 beckhambobo(beckham) 给的匿名块 根本就没有调用的我的函数,就把它显示出来了,岂不是很奇怪?你的函数还调用了要显示的函数,还好理解一点。但我发现,如果,匿名块运行一次之后,在运行时就不显示了,也就是把缓存中的回显的数据清空了。不知道是不是这样的?
      

  2.   

    若不是肯定要select ...from ...这种形式。
    那用过程可返加多参数,比函数好用.
      

  3.   

    最新研究成果:SQL> select ecoadd('21',to_date('2003-04-18','yyyy-mm-dd')) from dual;ECOADD('21',TO_DATE('2003-04-18','YYYY-MM-DD'))
    -----------------------------------------------
    SQL> set serveroutput on;
    SQL> begin
      2  dbms_output.put_line('输出一个值');
      3  end;
      4  /
    v_canBeAdd is 1
    输出一个值PL/SQL procedure successfully completed.
    上面是最简单的调试过程。根本就不用调用函数,就可以直接显示调试信息。还有一种办法就是:SQL> set serverout on;
    SQL> declare
      2  a number;
      3  begin
      4  a:=ecoadd('21',to_date('2003-04-18','yyyy-mm-dd'));
      5  end;
      6  /
    v_canBeAdd is 1PL/SQL procedure successfully completed.正如空杯大哥所说。
    由此可见,此处输出,与调用函数关系不大。不调用函数也能输出结果!