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

Posted

技术标签:

【中文标题】.Net 调用 Oracle Array 绑定存储过程输出 VarChar2【英文标题】:.Net calling Oracle Array bound stored procedure output 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);

【问题讨论】:

how can I out a parameter as varchar2 in oracle的可能重复 【参考方案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;

【讨论】:

以上是关于.Net 调用 Oracle Array 绑定存储过程输出 VarChar2的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE存储过程怎么调用?

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

java 实现往oracle存储过程中传递array数组类型的参数

雪花:从另一个过程调用的带有 ARRAY 参数的过程

在Net下调用SqlServer2k中存储过程

从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型