У меня есть следующая функция Oracle:
function get_job_no return number is
V_job_no number;
begin
select appwork.tlm_corphier_job.nextval into V_job_no from dual;
return V_job_no;
end get_job_no;
ОБРАТИТЕ ВНИМАНИЕ:
1) Это ФУНКЦИЯ, а не процедура
2) Это возвращает НОМЕР, а не VARCHAR
3) Я использую System.Data.OracleClient, а не Oracle.DataAccess.Client (из-за другой проблемы, с которой я столкнулся), но решение с любым из них будет в порядке.
Я пытаюсь вызвать это из VB.Net, используя корпоративную библиотеку MS, например:
Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data.OracleClient
Public Function GetNextJobNumber() As Object
Dim db As Database = DatabaseFactory.CreateDatabase()
Dim myresult As Object = Nothing
Using cmd As DbCommand = db.GetStoredProcCommand("CORPHIER_PKG.get_job_no")
Dim retval As New Data.OracleClient.OracleParameter("retval", GetType(System.Data.OracleClient.OracleNumber))
retval.Direction = ParameterDirection.ReturnValue
cmd.Parameters.Add(retval)
db.ExecuteNonQuery(cmd)
myresult = retval.Value
End Using
Return myresult
End Function
Я получаю следующую ошибку:
System.InvalidCastException: не удалось преобразовать значение параметра из RuntimeType в десятичное. ---> System.InvalidCastException: объект должен реализовывать IConvertible.
в System.Convert.ChangeType (значение объекта, тип преобразования типа, поставщик IFormatProvider)
в System.Data.OracleClient.OracleParameter.CoerceValue (значение объекта, MetaType destinationType)
--- Конец внутренней трассировки стека исключений ---
в System.Data.OracleClient.OracleParameter.CoerceValue (значение объекта, MetaType destinationType)
в System.Data.OracleClient.OracleParameter.SetCoercedValueInternal (значение объекта, метатип MetaType)
в System.Data.OracleClient.OracleParameterBinding.PrepareForBind (соединение OracleConnection, Int32 и смещение)
в System.Data.OracleClient.OracleCommand.Execute (оператор OciStatementHandleHandle, поведение CommandBehavior, логическое значение needRowid, OciRowidDescriptor & rowidDescriptor, ArrayList & resultParameterOrdinals)
в System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal (логическое значение needRowid, OciRowidDescriptor & rowidDescriptor)
в System.Data.OracleClient.OracleCommand.ExecuteNonQuery ()
в Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery (команда DbCommand)
в Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (команда DbCommand)