【问题标题】:Oracle can't use value default if parameter is null如果参数为空,Oracle 不能使用默认值
【发布时间】:2017-11-15 16:32:23
【问题描述】:

我有存储过程

create or replace PROCEDURE  TestApi  (  
     p_Contract IN varchar2,
     p_ObjID IN INT DEFAULT 0, ------ This Question
     p_Result OUT SYS_REFCURSOR
     --p_Message OUT varchar2
) IS
    p_Message varchar2(500);
Begin
    IF p_ObjID =0 THEN p_Message:= `Null`;
    ELSE  p_Message:=`Not Null`;
    END IF;
    Open p_Result For 
         Select ID as "SupportListID", 
                p_ObjID as "ObjID" 
         FROM SupportList
         where rownum<=5 ;
End ;

运行:

 VARIABLE p_Result REFCURSOR;
 EXEC PAR.TESTAPI('PPHP0001',null,:p_Result); 
 -- If i don't set Parameter with NUll , execute will cause an error 
 print p_Result;

结果:

 SupportListID ObjID                                   
------------- --------------------------------------- 
107*******                                            
107*******                                            
107*******                                            
107*******                                            
107*******    

我的问题:我用1个参数NULL执行SP,SP可以得到DEFAULT VALUE 注意:如果我使用除 REFCURSOR 之外的任何类型数据,我可以得到 DEFAULT VALUE 。告诉我该怎么做。我使用OracleCommandBuilder.DeriveParameters C# 从SP Oracle 获取参数

更新:我完成了,使用 OracleCommand 的 BybindName,非常感谢大家

【问题讨论】:

  • 为什么要使用默认参数?您提供了一个值,该值为NULL;这意味着一个未知的值,并不意味着“没有值所以使用默认值”。
  • No No,在 C# 代码中,我只使用无默认值的 Parameter 的 Oracle 参数。如果存在,SP 将从 C# 中检索数据,如果不将其传递给 SP,SP 将使用默认值。你知道我的意思吗???
  • 如果您需要 C# 代码方面的帮助,那么您需要发布您当前的代码(以及它导致问题的位置)。

标签: c# oracle


【解决方案1】:

只需使用命名参数并省略p_ObjID

VARIABLE p_Result REFCURSOR;
EXEC PAR.TESTAPI(p_Contract => 'PPHP0001', p_Result =>:p_Result); 

【讨论】:

  • OP 声明“我使用 OracleCommandBuilder.DeriveParameters C# 从 SP Oracle 获取参数”。这没有回答如何在 C# 中使用命名参数(或参数的默认值)。
  • @MT0 所以OP,如果是NULL,可以很容易地添加if语句并且不要在C#中绑定参数。
  • 但是如果 SP 添加一个带有默认值的参数,我必须更改 C# 代码,如何在不更改 C# 代码的情况下做到这一点。所以不能导致错误。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 2018-12-11
  • 2018-06-20
  • 1970-01-01
  • 2020-10-26
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多