【问题标题】:.Net calling Oracle Array bound stored procedure output VarChar2.Net 调用 Oracle Array 绑定存储过程输出 VarChar2
【发布时间】: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


【解决方案1】:

找到了解决办法。

使用 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}};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2013-06-06
    • 2012-11-24
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多