【发布时间】:2014-08-21 16:22:20
【问题描述】:
我正在从 C# 调用一个 Oracle 数组绑定存储过程 我可以添加 NUMBER 类型的输出参数,并且正确填充了返回值。
如果我尝试使用 VARCHAR2 类型的输出值,我会收到“OracleParameter.ArrayBindSize is invalid”异常。
这行得通:
CREATE OR REPLACE PROCEDURE CLOUDDBA.INSERTTEST (
P_VALUE NUMBER,
P_CODE OUT NUMBER--,
-- P_MESSAGE OUT VARCHAR
)
AS
BEGIN
P_CODE := P_Value ;
--P_MESSAGE := '';
IF P_Value = 1 THEN
P_CODE := 1;
--P_MESSAGE := 'ONE';
END IF;
END INSERTTEST;
C#代码:
var values = new int[] { 1, 2, 3 };
ocmd.CommandText = "INSERTTEST";
ocmd.CommandType = CommandType;
ocmd.BindByName = true;
ocmd.ArrayBindCount = 3;
ocmd.Transaction = transaction;
ocmd.Parameters.Clear();
var pValue = new OracleParameter("P_VALUE", OracleDbType.Int32, 255, ParameterDirection.Output) { Value = values };
ocmd.Parameters.Add(pValue);
var pVCode= new OracleParameter("P_CODE", OracleDbType.Int32, 255, ParameterDirection.Output);
ocmd.Parameters.Add(pVCode);
这会爆炸:
CREATE OR REPLACE PROCEDURE CLOUDDBA.INSERTTEST (
P_VALUE NUMBER,
P_CODE OUT NUMBER,
P_MESSAGE OUT VARCHAR
)
AS
BEGIN
P_CODE := P_Value ;
P_MESSAGE := '';
IF P_Value = 1 THEN
P_CODE := 1;
P_MESSAGE := 'ONE';
END IF;
END INSERTTEST;
C#代码:
var values = new int[] { 1, 2, 3 };
ocmd.CommandText = "INSERTTEST";
ocmd.CommandType = CommandType;
ocmd.BindByName = true;
ocmd.ArrayBindCount = 3;
ocmd.Transaction = transaction;
ocmd.Parameters.Clear();
var pValue = new OracleParameter("P_VALUE", OracleDbType.Int32, 255, ParameterDirection.Output) { Value = values };
ocmd.Parameters.Add(pValue);
var pVCode= new OracleParameter("P_CODE", OracleDbType.Int32, 255, ParameterDirection.Output);
ocmd.Parameters.Add(pVCode);
var pVMessage= new OracleParameter("P_MESSAGE", OracleDbType.Varchar2, 255, ParameterDirection.Output);
ocmd.Parameters.Add(pVMessage);
【问题讨论】:
标签: sql sql-server oracle stored-procedures