如何从C#调用Oracle存储过程,该过程返回自定义对象类型作为OUT参数

7gcisfzg  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(142)

我有一个Oracle 19存储过程,它有2个输入参数和2个输出参数。其中一个OUT参数返回一个表。下面是我从C#中得到的代码,但不起作用,并抛出错误“OUT参数的参数绑定问题”。我使用VS 2015和4。6.1框架。
这是Oracle存储过程的代码:

GetSomething(date IN Varachar2, code Varchar2, response OUT table_name, count OUT Number)

C#:

using Oracle.DataAccess.Client;

OracleConnection con = new OracleConnection();
con.ConnectionString = "Connection string here";

OracleCommand cmd = new OracleCommand();
cmd.CommandText = "SP name";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;

cmd.Parameters.Add("date","01/01/2020");
cmd.Parameters.Add("code", "123");
cmd.Parameters.Add("count", OracleDbType.Int64).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter
{
    ParameterName = "response",
    SourceColumn = "table_name",
    OracleDbType = OracleDbType.Array,
    CollectiveType = OracleCollectionType.PLSQLAssociativeArray
});

如果我使用CollectiveType,那么我会得到一个响应的参数绑定错误。如果我删除集合类型,它会抛出一个错误,说“参数或类型参数的数量错误”。
有人能帮帮我吗?我做错了什么?
尝试了不同的调用存储过程的方法,但总是出现错误。
CREATE TYPE table_name AS OBJECT(column_1 data_type,column_2 data_type,-- this TYPE has 20 columns..);

5cg8jx4n

5cg8jx4n1#

在Oracle中,有两个作用域可以计算语句:

  • Oracle引擎将在其中分析SQL语句的SQL范围;和
  • Oracle引擎将在其中分析过程语言语句(PL/SQL)的PL/SQL作用域。

当您使用CREATE TYPE ... AS TABLE OF ...语句定义类型时,您就是在SQL范围内定义嵌套表集合数据类型。
当你在一个包或PL/SQL(匿名)块中定义一个类型时,你是在PL/SQL作用域中定义的。C#(出于某种未知原因)只支持传递PL/SQL关联数组,并且这些数组以TYPE ... AS TABLE OF ... INDEX BY ...的形式定义。
您没有包括如何定义要返回的类型(只包括CREATE TABLE ... DDL语句,而不是CREATE TYPE ...TYPE ...语句);但如果你没有使用PL/SQL关联数组,而是使用嵌套表或VARRAY集合数据类型,那么C#不支持这些类型,你需要:

  • 更改程序以使用关联数组;和
  • 在包中定义类型。

相关问题