将表类型对象作为输入参数从C#传递给Oracle中的存储过程

Ale*_*akh 4 .net c# oracle plsql stored-procedures

我有接受表类型作为输入参数的存储过程.如何从c#代码传递对象?

create or replace TYPE CUSTOM_TYPE AS OBJECT 
( 
  attribute1 VARCHAR(10),
  attribute2 VARCHAR(10)
);

create or replace TYPE CUSTOM_TYPE_ARRAY AS TABLE OF CUSTOM_TYPE;

PROCEDURE SP_TEST
(
  P_TABLE_IN IN CUSTOM_TYPE_ARRAY,
  P_RESULT_OUT OUT SYS_REFCURSOR 
) AS 
BEGIN
  OPEN P_RESULT_OUT FOR
    SELECT  ti.attribute1, ti.attribute2, ti.attribute3
    FROM  TABLE(P_TABLE_IN) ea inner join MYTABLE ti on ea.attribute1 = ti.attribute1 and ea.attribute2 = ti.attribute2;
END SP_TEST;
Run Code Online (Sandbox Code Playgroud)

并尝试添加如下参数:

var oracleParam = new OracleParameter();
oracleParam.OracleDbType = OracleDbType.Array;
oracleParam.Direction = ParameterDirection.Input;
oracleParam.ParameterName = "P_TABLE_IN";
oracleParam.Value = entities;
oracleCommand.Parameters.Add(oracleParam); 
Run Code Online (Sandbox Code Playgroud)

其中实体是自定义实体集合的实例(具有已定义的oracle属性映射)

public class EntityUdt
{
    [OracleObjectMappingAttribute("attribute1")]
    public string attribute1 {get;set;}
    [OracleObjectMappingAttribute("attribute2")]
    public string attribute2 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我按照本指南正确定义了.net实体,但通过我的列表仍然没有运气:

System.InvalidOperationException 未被用户代码处理
HResult = -2146233079
Message ='EntityUdt :: attribute1 :: OracleObjectMappingAttribute'无法设置为'attribute1'的无效值
Source = Oracle.DataAccess StackTrace:at Oracle.DataAccess.Types.OracleUdtDescriptor. DescribeCustomType(Object customTypeFactory)

Ale*_*akh 8

我花了好几个小时试图找出问题,结果发现oracle属性定义的映射应该具有与属性名称不同的名称.

所以我只是将所有的映射属性都设置为大写,现在就可以了!

    [OracleObjectMappingAttribute("ATTRIBUTE1")]
    public string attribute1 { get; set; }
    [OracleObjectMappingAttribute("ATTRIBUTE2")]
    public string attribute2 { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,名称是不同的(Oracle中的所有小写,.NET中的Camel案例),但它仍然不起作用.将映射属性更改为大写后,一切都开始工作.谢谢! (4认同)