我正在尝试在 .net 4.5 中执行以下存储过程
PROCEDURE my_procedure (
a_cursor OUT t_cursor,
return_value OUT VARCHAR2,
a_type VARCHAR2,
a_time DATE,
a_id VARCHAR2,
a_arg1 VARCHAR2,
a_from VARCHAR2,
a_gl2 VARCHAR2,
a_arg2 DATE DEFAULT NULL,
a_templ VARCHAR2 DEFAULT NULL
)
这些参数中的大多数可以为空。在蟾蜍中,我可以执行它:
BEGIN package.my_procedure( :c, :out, 'arg', '', '123' , '', '', '', '', ''); END;
在 C# 中,我正在尝试以下操作:
object[] parameters = {
new OracleParameter("arg1", arg1),
new OracleParameter("arg", "arg"),
new OracleParameter("empti", ""),
new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output)
};
const string sql = "BEGIN package.my_procedure
(:c, :out, :arg, :empti, :arg1 , :empti, :empti, :empti, :empti, :empti); END;";
res = _projectRepository.ExecuteStoredProcedure(sql, parameters);
我收到以下错误
Test method Tests.repository.RepositoryTests.TestMethod1 threw exception:
Oracle.DataAccess.Client.OracleException: ORA-06550:
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550:
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550:
line 1, column 7:
PL/SQL: Statement ignored
我尝试过使用和不使用可选参数以及使用/不使用 return_value/:out 参数。
我正在使用 Oracle.DataAccess 提供程序 v. 4.112.3.0。它适用于没有那么多参数/只有一个输出参数(光标)的其他存储过程。
编辑:我发现一个错误,我需要在参数数组中首先有输出参数;
new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output),
new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
new OracleParameter("arg1", "arg1"),
new OracleParameter("empti", ""),
new OracleParameter("arg", arg),
};
现在我收到错误:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
似乎是数据库错误,但看起来很奇怪,因为我可以从 toad 执行相同的命令而不会出现错误。