【问题标题】:what is the syntax for oracle pl sql function overloading?oracle pl sql函数重载的语法是什么?
【发布时间】:2020-09-27 10:48:01
【问题描述】:

我正在尝试在 oracle live plsql 中执行函数重载。在我能找到的任何地方,都没有适用于函数重载的基本语法。

使用 1 个参数

create or replace function area(a in number)
return number is
begin
    return a*a;
end;

使用2个参数

create or replace function area(a in number, b in number)
return number is
begin
    return a*b;
end;

函数在执行后被创建。但是,在函数调用过程中出错。

declare
begin
    dbms_output.put_line(area(5));
    dbms_output.put_line(area(3, 4));
end;

帮我解决错误并将这段代码构造成函数重载的基本语法。

ORA-06550:第 3 行,第 31 列: PLS-00363:表达式“5”不能用作赋值目标

【问题讨论】:

    标签: oracle function plsql overloading


    【解决方案1】:

    正如documentation 所说:

    PL/SQL 允许您重载嵌套子程序、封装子程序和类型方法

    独立存储过程(函数)无关。

    因此,如果将这些函数放入一个包中,它会按预期工作:

    SQL> create or replace package pkg_test as
      2    function area (a in number) return number;
      3    function area (a in number, b in number) return number;
      4  end;
      5  /
    
    Package created.
    
    SQL> create or replace package body pkg_test as
      2    function area(a in number)
      3    return number is
      4    begin
      5        return a*a;
      6    end;
      7    function area(a in number, b in number)
      8    return number is
      9    begin
     10        return a*b;
     11    end;
     12  end;
     13  /
    
    Package body created.
    
    SQL> begin
      2      dbms_output.put_line(pkg_test.area(3, 4));
      3      dbms_output.put_line(pkg_test.area(5));
      4  end;
      5  /
    12
    25
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 谢谢@Littlefoot。我在包中尝试了相同的方法并且它有效,但是有没有办法让它在没有包的情况下单独工作。???
    • 不客气。据我所知,没有。
    • @Littlefoot,你用哪个编辑器来处理 PL/SQL 代码?看起来不错!
    • 我能理解 :-)
    • @Soumendra:当我没有那么多代码并且没有 TOAD 时(即我不工作时),我就是这样做的。 TOAD 的格式化程序很好地完成了它的工作并且很好地格式化了代码。我在家使用的 GUI 是 SQL Developer,但我不喜欢它格式化代码的方式。有时 - 当有人发布大量未格式化的代码时 - 我会使用一些在线 SQL 格式化程序(没有任何喜欢的;必要时只需谷歌即可)。
    【解决方案2】:
    set serveroutput on
    declare
       function area(a in number,
                     b in number default null)
         return number is
       begin
       
          if b is null then
             return a*a;
          end if;
       
          return a*b;
       
       end area;
    begin
       dbms_output.put_line(area(5));
       dbms_output.put_line(area(3, 4));
    end;
    

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多