C#调用oracle存储函数

create or replace function ar_knyga_egzistuoja( id number ) return number is kiekis number; begin select count(*) into kiekis from knygos where kn_id = id; return kiekis; end; 

C#代码:

 conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "ar_knyga_egzistuoja"; cmd.CommandType = CommandType.StoredProcedure; OdbcParameter param = new OdbcParameter(); cmd.Parameters.Add("id", OracleType.Number).Value = id; cmd.ExecuteNonQuery(); var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value); MessageBox.Show(kiekis); cmd.Parameters.RemoveAt(0); conn.Close(); 

我收到错误:

 PLS-00221: 'AR_KNYGA_EGZISTUOJA' is not a procedure or is undefined ORA-06550: line 1, column 7: 

这不是程序而是function,但我知道我可以像程序一样调用函数,有什么问题?

您获得的ORA-06550代码意味着该函数是使用无效语句编译的,需要重新编写。 我没有看到任何明显错误的代码,因此您可能会遇到权限或不正确的表名等问题,并应检查您是否可以首先在PL / SQL编辑器中运行该函数。 然后,在你运行之后,试试……

 var cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "ar_knyga_egzistuoja"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("id", id); cmd.Parameters.Add("kiekis", OracleType.Number); cmd.Parmeters["kiekis"].Direction = ParameterDirection.ReturnValue; cmd.Connection.Open(); cmd.ExecuteNonQuery(); var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value); MessageBox.Show(kiekis); cmd.Connection.Close(); 

这应该能够像存储过程一样运行函数,同时期望名为kiekis的返回值可用于工作。

你需要将你的函数作为常规select语句调用,使用“文本命令类型”,然后执行select语句来调用你的函数,最后使用executeScalar来获取返回值(我想这只是一个值)

它可能是这样的:

 conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "select yourSchema.ar_knyga_egzistuoja(@id)"; cmd.CommandType = CommandType.Text; OdbcParameter param = new OdbcParameter(); cmd.Parameters.Add("id", OracleType.Number).Value = id; var result = cmd.ExecuteScalar(); MessageBox.Show(result); cmd.Parameters.RemoveAt(0); conn.Close(); 

我认为问题在于你调用ExecuteNonQuery 。 以这种方式,它期望一个过程(不返回值)。 如果你调用ExecuteScalar它会期望ar_knyga_egzistuoja是一个函数。

 Imports System.Configuration Imports System.Data.OracleClient Public Class DBConnection Dim v_connectionstring As String Public OracleConnect As New OracleClient.OracleConnection Public OracleCommand As New OracleClient.OracleCommand Public OraDataAdp As New OracleClient.OracleDataAdapter Public Oratrans As OracleClient.OracleTransaction Dim OraPara As New OracleParameterCollection Public title As String Dim v_clearParameter As Boolean = True Public response As MsgBoxResult '''  ''' Open Oracle Connection '''  '''  Public Sub Connect() Try v_connectionstring = ReadSetting("DBString") 'for test default comment it 'v_connectionstring = "SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=team-pc)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xe)));uid=genmfg1;pwd=genmfg1;" If OracleConnect.State = ConnectionState.Open Then OracleConnect.Close() End If OracleConnect.ConnectionString = v_connectionstring OracleConnect.Open() Catch ex As Exception Throw ex Finally End Try End Sub '''  ''' Close Oracle Connection if Open '''  '''  Public Sub Disconnect() Try If OracleConnect.State = ConnectionState.Open Then OracleConnect.Close() End If Catch ex As Exception Throw ex Finally End Try End Sub '''  ''' Read Settings From Configuratiob File '''  '''  Key name from Configuration File aap.config '''  return keyvalue as string  '''  Private Function ReadSetting(ByVal key As String) As String Dim result As String Try Dim appSettings = ConfigurationSettings.AppSettings result = appSettings(key) If IsNothing(result) Then result = "Not found" End If Return result Catch ex As Configuration.ConfigurationException Throw ex Catch ex As Exception Throw ex Finally End Try End Function '''  ''' Clear oracle Paramter Collection of Coomand '''  '''  Private Sub ClearParameter() Try OracleCommand.Parameters.Clear() Catch ex As Exception Throw ex End Try End Sub '''  ''' Add Parameter For Procedure or Function any type of oracle command '''  ''' 'I' for Input,'O' for Output and 'IO' for Input Output both,'R' For R '''  Name Of Parameter, same which is in declaration of Oracle  '''  Name Of Parameter Typw, same which is in declaration of Oracle  '''  Size Of output Parameter/Field when p_paratype 'I' Size not consider  '''  Parameter Value as Object but must be compitible with object  '''   Public Sub AddParameter(ByVal p_paraType As String, ByVal p_paraName As String, ByVal p_paraDBType As OracleType, ByVal p_paraSize As Integer, ByVal p_paraval As Object) ' OracleCommand.Parameters.Add Try If v_clearParameter Then ClearParameter() v_clearParameter = False End If 'OracleCommand.Parameters.Add( p_paraName,p_paraDBType,p_paraSize,p_paraval) If p_paraType = "I" Then OracleCommand.Parameters.Add(p_paraName, p_paraDBType).Value = p_paraval ElseIf p_paraType = "O" Then OracleCommand.Parameters.Add(p_paraName, p_paraDBType, p_paraSize).Direction = ParameterDirection.Output ElseIf p_paraType = "IO" Or p_paraType = "OI" Then OracleCommand.Parameters.Add(p_paraName, p_paraDBType, p_paraSize).Direction = ParameterDirection.InputOutput OracleCommand.Parameters(p_paraName).Value = p_paraval ElseIf p_paraType = "R" Then OracleCommand.Parameters.Add(p_paraName, p_paraDBType, p_paraSize).Direction = ParameterDirection.ReturnValue Else Throw New Exception("Invalid Parameter Type") End If Catch ex As Exception Throw ex End Try End Sub '''  ''' Begin Transaction For Commit and Rollback Transaction '''  '''  '''  Public Sub BeginTransaction(ByVal p_isolvl As System.Data.IsolationLevel) Try Oratrans = OracleConnect.BeginTransaction(p_isolvl) OracleCommand.Transaction = Oratrans Catch ex As Exception Throw ex End Try End Sub '''  ''' Commit DML command '''  '''  Public Sub Commit() Try Oratrans.Commit() Catch ex As Exception Throw ex End Try End Sub '''  ''' Rollback DML command '''  '''  Public Sub Rollback() Try Oratrans.Rollback() Catch ex As Exception Throw ex End Try End Sub '''  ''' Fill Dataset With command '''  '''  Oracle Procedure Name  '''  Name Of the Return Table  '''  Return Dataset From Store Procedure  '''  Public Function ExecuteSPReturnDatasetWithCommand(ByVal p_PrcName As String, ByVal p_TableNames As String()) As DataSet Dim _ds As DataSet = New DataSet Try Connect() OracleCommand.CommandText = p_PrcName OracleCommand.Connection = OracleConnect OracleCommand.CommandType = CommandType.StoredProcedure OraDataAdp = New OracleClient.OracleDataAdapter(OracleCommand) OracleCommand.ExecuteNonQuery() OraDataAdp.Fill(_ds) Try For Each _tbstr As String In p_TableNames _ds.Tables(0).TableName = _tbstr Next Catch ex As Exception Throw New Exception("No Of Return Table Does not match with Procedure") End Try Return _ds Catch ex As Exception Throw ex Finally v_clearParameter = True Disconnect() End Try End Function '''  ''' Execute Stored Procedure With Transaction '''  '''  Oracle Procedure Name  '''  Public Sub ExecuteSPFunWithTransaction(ByVal p_prcname As String) Try OracleCommand.CommandText = p_prcname OracleCommand.Connection = OracleConnect OracleCommand.CommandType = CommandType.StoredProcedure OracleCommand.ExecuteNonQuery() Catch ex As Exception Throw ex Finally v_clearParameter = True End Try End Sub '''  ''' Execute Sql Query as string '''  '''  sql query for execute  '''  Public Sub ExecuteSqlWithcommand(ByVal p_Sqlqry As String) Try Connect() OracleCommand.CommandText = p_Sqlqry OracleCommand.Connection = OracleConnect OracleCommand.CommandType = CommandType.Text OracleCommand.ExecuteNonQuery() Catch ex As Exception Throw ex Finally v_clearParameter = True Disconnect() End Try End Sub '''  ''' Return Scalar value from sql stmt '''  '''  '''  Object for all datatype compatibalite  '''  Public Function ExecuteSqlReturnScalarWithcommand(ByVal p_Sqlqry As String) As Object Dim _obj As Object Try Connect() OracleCommand.CommandText = p_Sqlqry OracleCommand.Connection = OracleConnect OracleCommand.CommandType = CommandType.Text _obj = OracleCommand.ExecuteScalar() Catch ex As Exception Throw ex Finally v_clearParameter = True Disconnect() End Try Return _obj End Function '''  ''' Execute Sp/Function With Command '''  '''  Procedure and Function name  '''  Public Sub ExecutSPFunPWithcommand(ByVal p_prcname As String) Try Connect() OracleCommand.CommandText = p_prcname OracleCommand.Connection = OracleConnect OracleCommand.CommandType = CommandType.StoredProcedure OracleCommand.ExecuteNonQuery() Catch ex As Exception Throw ex Finally v_clearParameter = True Disconnect() End Try End Sub '''  ''' Get Parameter Value From Parameter list as out parameter '''  '''  '''  return value as object '''  Public Function GetParameterValue(ByVal p_parametername As String) As Object Try Return OracleCommand.Parameters(p_parametername).Value Catch ex As Exception Return Nothing Finally End Try End Function End Class