我有以下Oracle存储过程:
PROCEDURE SP_ITEMEXISTS(pID IN NUMBER, pExists OUT CHAR) IS
BEGIN
select CASE count(*) WHEN 0 THEN 'N' ELSE 'Y' END into pExists from items where id = pID;
END SP_ITEMEXISTS;
我使用ODP.NET从Enterprise Library 6.0调用它,代码如下:
public bool ItemExists(int itemID)
{
string procedureName = "SP_ItemExists";
var database = new DatabaseProviderFactory().CreateDefault();
bool returnValue = false;
using (OracleCommand command = (OracleCommand)database.GetStoredProcCommand(procedureName))
{
command.Parameters.Add("pID", OracleDbType.Int32, itemID, ParameterDirection.Input);
command.Parameters.Add("pExists", OracleDbType.Char, ParameterDirection.Output);
using (OracleDataReader reader = ((OracleDataReaderWrapper)database.ExecuteReader(command)).InnerReader)
{
char exists = reader.GetChar("pExists");
if (exists.ToString().ToUpper() == "Y")
returnValue = true;
else
returnValue = false;
}
}
return returnValue;
}
我收到以下错误:ORA-06550:第1行第7列:\nPLS-00306:对"SP_ITEMEXISTS"的调用中的参数数量或类型错误\nORA-06550:第1行,第7列;\nPL/SQL:忽略语句
我还有其他可以成功调用的存储过程,但其他存储过程有一个refcursor OUT参数。当OUT类型为Char时,我该如何称呼它?
ExecuteReader仅用于RefCursor,正如您已经发现的那样。使用database.ExecuteNonQuery()
调用过程或函数。用command.Parameters("pExists").Value
读取返回值