gpt4 book ai didi

c# - 过程参数中 Oracle UDT 的绑定(bind)无效

转载 作者:太空狗 更新时间:2023-10-29 23:42:01 26 4
gpt4 key购买 nike

我正在尝试调用一个将自定义数据类型 table of numbers 作为参数之一的过程。

这是类型的定义:

create type num_list as table of number;

以及程序的定义:

create or replace procedure my_procedure
(listofnumbers num_list,
v_value char)
is
begin

update my_table
set my_column = v_value
where my_row_id in (select column_value
from table(listofnumbers));

end;

使用 ODP.NET 和 C#,我声明如下:

var row_ids = new int[] { 1, 2 };

using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString))
{
oracleConn.Open();
var cmd = new Oracle.DataAccess.Client.OracleCommand("my_procedure", oracleConn);
cmd.CommandType = CommandType.StoredProcedure;

var param1 = new Oracle.DataAccess.Client.OracleParameter("listofnumbers", Oracle.DataAccess.Client.OracleDbType.Array, ParameterDirection.Input);
param1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray;
param1.UdtTypeName = "num_list";
param1.Value = row_ids;
cmd.Parameters.Add(param1);

var param2 = new Oracle.DataAccess.Client.OracleParameter("v_value ", Oracle.DataAccess.Client.OracleDbType.Char, ParameterDirection.Input);
param2.Value = "Y";
cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();
}

抛出的异常说明:

Invalid parameter binding Parameter name: listofnumbers

我在定义参数时缺少哪些属性?

最佳答案

编辑:5 月 14 日

由于我的回答未被接受,这里有一个可能有用的链接:

http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g


不幸的是,我不能玩这个,因为我有不支持 UDT 的 x64 ODP.NET。

但是,由于您的 UDT 是一个集合,您是否尝试过在 param1 上设置 Size 属性?

param1.Size = row_ids.Length;

现在,它不是 UDT,但这是一个代码片段,我如何绑定(bind)到包规范中定义的类型:

TYPE t_stringlist IS TABLE OF VARCHAR2(4000);

string[] values = new string[] { "AAA", "BBB" };

OracleParameter parameter = new OracleParameter();
parameter.Name = "my_param";
parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
parameter.OracleDbType = OracleDbType.Varchar2;
parameter.ArrayBindSize = new int[values.Length];
parameter.ArrayBindStatus = new OracleParameterStatus[values.Length];
parameter.Size = values.Length;

for (int i = 0; i < values.Length; ++i)
{
parameter.ArrayBindSize[i] = 4000;
parameter.ArrayBindStatus[i] = OracleParameterStatus.Success;
}

parameter.Value = values;

我不确定您可以将 ArrayBindSize 设置为什么值。

此外,您可以考虑为您的 UDT 创建一个类型工厂:

http://download.oracle.com/docs/html/E15167_01/featUDTs.htm

无论如何,我希望你能在这里找到对你有帮助的东西。

关于c# - 过程参数中 Oracle UDT 的绑定(bind)无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4271605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com