【问题标题】:In oracle database, how can I specify default value for a parameter that is a user defined type?在 oracle 数据库中,如何为用户定义类型的参数指定默认值?
【发布时间】:2011-10-06 11:42:25
【问题描述】:
    PACKAGE PKG_DEVICE AS 
     TYPE STR_ASSOC_ARR is table of VARCHAR(255) index by BINARY_INTEGER;
     procedure proc_create_device 
(
  in_deviceid in raw  
, in_devicecert in clob  
, in_status in number
, in_caps in STR_ASSOC_ARR
, in_vals in STR_ASSOC_ARR
);

是存储过程声明。我想为 in_caps 和 in_vals 参数指定一个默认值。可能吗?我无法指定default null,因为它不起作用。我的目标是当它们不可用时不必从 C# 传递这两个参数(或传递 null)。如果有一种 odp.net 方式来完成同样的事情,那也可以。
使用 oracle db 11g。

【问题讨论】:

  • :你是说不想从C#端传递null,只想在过程中指定默认值

标签: oracle stored-procedures default-value user-defined-types


【解决方案1】:

您需要将 NULL 强制转换为用户定义的类型。试试这个:

    PACKAGE PKG_DEVICE AS 
     TYPE STR_ASSOC_ARR is table of VARCHAR(255) index by BINARY_INTEGER;
     procedure proc_create_device 
(
  in_deviceid in raw  
, in_devicecert in clob  
, in_status in number
, in_caps in STR_ASSOC_ARR DEFAULT CAST(NULL AS STR_ASSOC_ARR)
, in_vals in STR_ASSOC_ARR DEFAULT CAST(NULL AS STR_ASSOC_ARR)
);

现在您不必为 in_caps 或 in_vals 指定值。如果未传递值,则默认为 STR_ASSOC_ARRAY 类型的 NULL 值。

当然,您需要更新包主体中的过程声明以对应这些更改。

【讨论】:

    【解决方案2】:

    如果你想从 C# 端传递默认值,你可以使用

     var sParam1 = new OracleParameter("in_param1_array", 
                                         OracleDbType.Varchar2, ParameterDirection.Input);
     sParam1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    
     if (list.Count == 0)
     {
         sParam1.Size = 1;
         sParam1.Value = new string[1] { "" };//Or initialize as default value.
     }
     else
     {
         sParam1.Size = list.Count;
         sParam1.Value = list.ToArray();
     }
     parameters.Add(sParam1);
    

    【讨论】:

    • 为什么否定点..请添加评论。这与提出的问题有关。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 2012-05-13
    • 2022-01-17
    • 1970-01-01
    • 2011-12-06
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多