.Net调用Oracle Array绑定存储过程输出VarChar2

时间:2014-08-21 16:22:21

标签: sql sql-server oracle stored-procedures

我从C#调用Oracle数组绑定存储过程 我可以添加NUMBER类型的输出参数,并正确填充返回值。

如果我尝试使用VARCHAR2类型的输出值,我会得到“OracleParameter.ArrayBindSize无效”异常。

这有效:

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);

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

使用SQL Server。

需要指定ArrayBindSize。

替换

var pVMessage = new OracleParameter("P_MESSAGE", OracleDbType.Varchar2, 255, ParameterDirection.Output);

var pVMessage = new OracleParameter("P_MESSAGE", OracleDbType.Varchar2, 255, ParameterDirection.Output) {ArrayBindSize = new int[]{255, 255, 255}};