.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的主要内容,如果未能解决你的问题,请参考以下文章
如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀
java 实现往oracle存储过程中传递array数组类型的参数
从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型