确定传递给过程的参数 (Oracle)

Lei*_*fel 6 oracle oracle-11g-r2 plsql

PL/SQL 中的过程可以有参数的默认值,但调用者可以传递与默认值相同的值。有没有办法从 PL/SQL 内部确定是否传递了参数?正如暗示的那样,这不能通过将值与默认值进行比较来完成。

jco*_*and 6

所以我这样做的方式是我不使用默认值。或者更确切地说,我将它们设置为 NULL 作为默认值。然后在我的程序主体中,我检查它是否等于 NULL,如果是,则将其设置为合理的默认值。在这一点上,您可以在同一空间中处理一两个标志,以查看正在设置或未设置的内容。

但是,如果他们出于某种原因打算传入 NULL,则存在边缘情况。但是,大多数开发人员都不能很好地处理三元组,所以我通常不担心(另外,如果我传递一个值,我需要传递一个值,而不是 null,所以 null 对我来说意味着永远 -被定义)

  • @jcolebrand:三元逻辑? (2认同)

Ren*_*ger 2

如果您考虑重载过程,这可能是可能的。假设您希望参数默认为 5 a,参数默认为 7 b,并且还想检查参数是否已传递。在这种情况下,您必须为每个组合(带参数和不带参数)使过程重载 4 次。最后,真正的事情发生在私有过程中p_

set serveroutput on size 100000 format wrapped

create or replace package tq84_test_pck as

   procedure p;
   procedure p(a number          );
   procedure p(          b number);
   procedure p(a number, b number);

end tq84_test_pck;
/

create or replace package body tq84_test_pck as

    procedure p_(a number := 5, a_default boolean,
                 b number := 7, b_default boolean) as
    begin

        dbms_output.put_line(
             'a: ' || a || 
             case when a_default then ' [default]'
                                 else ' [passed ]' end);

        dbms_output.put_line(
             'b: ' || b || 
             case when b_default then ' [default]'
                                 else ' [passed ]' end);

        dbms_output.new_line;

    end p_;

    procedure p is
    begin
        p_(a_default => true, 
           b_default => true);
    end p;

    procedure p (a number) is
    begin
        p_(a         => a, 
           a_default => false, 
           b_default => true);
    end p;

    procedure p (b number) is
    begin
        p_(b         => b, 
           a_default => true, 
           b_default => false);
    end p;

    procedure p (a number, b number) is
    begin
        p_(a         => a,
           b         => b, 
           a_default => false, 
           b_default => false);
    end p;

end tq84_test_pck;
/

show errors

declare

begin

   tq84_test_pck.p;
   tq84_test_pck.p( b => 7);
   tq84_test_pck.p( a => 7 );
   tq84_test_pck.p( a => null);
   tq84_test_pck.p( a => 5, b => 6);

end;
/
Run Code Online (Sandbox Code Playgroud)