QW1256csdn 2024-11-16 22:58 采纳率: 0%
浏览 4

C#调用输入参数是嵌套表的存储过程

oracle 自定义UDT类型,使用嵌套表,创建了存储过程,
C#调用存储过程报错 Custom type mapping for 'dataSource='' typeName='CONTAINER_NAME_TABLE'' is not specified or is invalid”
注:使用的是Oracle.ManagedDataAccess.core,版本号是3.21.50
具体如下:

-- 自定义类型
CREATE OR REPLACE TYPE CONTAINER_NAME_OBJ  AS OBJECT (
    CONTAINER_NAME VARCHAR2(20)
);
CREATE OR REPLACE TYPE CONTAINER_NAME_TABLE AS TABLE OF CONTAINER_NAME_OBJ;
create procedure Get_Battery_Data(t_container_Name in container_name_table,
                                          Battery_Package_Data_cursor out sys_refcursor) is
begin
    OPEN Battery_Package_Data_cursor FOR  select* from table (t_container_Name ) c 
join b on b.CONTAINER_NAME =c.CONTAINER_NAME;
end Get_Battery_Data;
string [] containerNames = containerNameListToken.ToObject<string[]>();
OracleParameter[] parameters = new OracleParameter[2];

 OracleParameter containerNamesParam = new OracleParameter("T_CONTAINER_NAME", OracleDbType.Array);
 containerNamesParam.UdtTypeName= "CONTAINER_NAME_TABLE";
 containerNamesParam.Value= new[] { "Container1", "Container2" };
 parameters[0] = containerNamesParam;

OracleParameter cursorParam = new OracleParameter("Battery_Package_Data_cursor", 
OracleDbType.RefCursor, ParameterDirection.Output);
parameters[1] = cursorParam;

OracleDbHelper oracleDbHelper = new OracleDbHelper();
//执行存储过程
DataTable dt = OracleTableByParas(1, "Get_Battery_Data", parameters);
  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    看起来你在尝试使用Oracle的自定义UDT类型和嵌套表类型作为存储过程的输入参数,并在C#中调用这个存储过程。你遇到的问题可能是由于在C#中如何正确地传递UDT类型和嵌套表类型的参数导致的。在你的代码中,你尝试将字符串数组直接赋值给UDT类型的参数,这是不正确的。你需要创建一个正确的Oracle的自定义UDT类型的实例,并将其赋值给参数。同时,还需要正确设置OracleDbType和UdtTypeName属性。此外,还需要注意Oracle对输入参数的命名和数据类型的敏感性。在你的代码中,OracleParameter的名称("T_CONTAINER_NAME")需要和存储过程中的参数名称一致。下面是修改后的代码示例:

    首先,你需要创建一个Oracle的自定义UDT类型的实例,并将其作为参数的值。由于Oracle的ManagedDataAccess不支持直接创建UDT实例,你需要使用Oracle的PL/SQL API来创建它。以下是一个创建UDT实例的例子:

    // 创建Oracle的自定义UDT类型的实例
    Oracle.ManagedDataAccess.Client.OracleUdt[] containerNamesArray = new Oracle.ManagedDataAccess.Client.OracleUdt[containerNames.Length];
    for (int i = 0; i < containerNames.Length; i++)
    {
        containerNamesArray[i] = new Oracle.ManagedDataAccess.Client.OracleUdt();
        containerNamesArray[i].SetObjectData(new Oracle.ManagedDataAccess.Types.OracleObjectData("CONTAINER_NAME_OBJ", containerNames[i]));
    }
    Oracle.ManagedDataAccess.Client.OracleUdtCollection containerNamesCollection = new Oracle.ManagedDataAccess.Client.OracleUdtCollection(containerNamesArray);
    containerNamesParam.Value = containerNamesCollection; // 将UDT实例赋值给参数
    

    然后,修改你的调用存储过程的代码:

    // 执行存储过程
    DataTable dt = OracleTableByParas(1, "Get_Battery_Data", parameters);
    

    请注意,以上代码可能需要根据你的实际情况进行调整。此外,还需要确保你的Oracle数据库连接已经正确配置,并且已经包含了必要的权限和配置信息。希望这些信息能够帮助你解决问题。如果还有其他问题,请随时向我提问。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月16日