有一个非常简单的查询,在Oracle数据库端完美工作,但试图使用.net实现它,并有以下问题,下面是代码示例:
var cmd = new OracleCommand
{
CommandText = "SELECT * FROM TESTTABLE WHERE ID IN (:1)"
};
cmd.ArrayBindCount = values.Length; // an array of integers boxed to object[]
cmd.Parameters.Add(new OracleParameter
{
OracleDbType = OracleDbType.Array,
Value = values // object array
});
var reader = await cmd.ExecuteReaderAsync();
使用这种方法,我有一个例外-Invalid parameter binding
如果我将OracleDbType
替换为OracleDbType = OracleDbType.Decimal
,那么我有下面的例外-ORA-03146: invalid buffer length for TTC field
。
请帮我找出我在这里错过了什么?
1条答案
按热度按时间oyxsuwqo1#
请帮我找出我在这里错过了什么?
会有用的。
不起作用,因为:
1.绑定变量包含单个值(不管该单个值是标量还是包含数组的UDT),
IN
子句将左操作数与每个右操作数进行比较,以查看它们是否相等;由于IN
子句中只有一个值,因此您正在检查一个数字是否等于一个数组,这将导致语法错误,因为它们不是相同的数据类型(如果它可以工作,它不工作,那么数字值永远不会等于数组值,无论该数字是否是数组的成员)。1.在Oracle中,关联数组是一种PL/SQL数据类型,这意味着它们可以在PL/SQL函数、过程或匿名块中使用,但不能在SQL查询中使用。
您需要做的是将PL/SQL关联数组传递给某个PL/SQL代码,该代码将关联数组转换为非关联数组,然后在查询中使用该数组。
有关传递PL/SQL关联数组的Oracle端示例,请参见How to use associative array in "where in" clause?或pass integer array to oracle procedure by c#。