我有一个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..);
1条答案
按热度按时间5cg8jx4n1#
在Oracle中,有两个作用域可以计算语句:
当您使用
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#不支持这些类型,你需要: