oracle select与数组绑定

vyswwuz2  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(124)

有一个非常简单的查询,在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
请帮我找出我在这里错过了什么?

oyxsuwqo

oyxsuwqo1#

请帮我找出我在这里错过了什么?

SELECT * FROM TESTTABLE WHERE ID IN (1, 2, 3)

会有用的。

SELECT * FROM TESTTABLE WHERE ID IN ( :bind_variable_containing_collection_type )

不起作用,因为:
1.绑定变量包含单个值(不管该单个值是标量还是包含数组的UDT),IN子句将左操作数与每个右操作数进行比较,以查看它们是否相等;由于IN子句中只有一个值,因此您正在检查一个数字是否等于一个数组,这将导致语法错误,因为它们不是相同的数据类型(如果它可以工作,它不工作,那么数字值永远不会等于数组值,无论该数字是否是数组的成员)。

  1. C#不支持将数组传递给Oracle。可以传递关联数组,但由于某种未知原因,它不支持非关联数组。
    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#

相关问题