2014-04-21 2 views
4
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# 코드 : 나는 점점C# 호출 Oracle 저장 기능

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: 

이 절차하지만 함수가 아닙니다,하지만 난 프로 시저처럼 호출 할 수 기능을 알고, 뭐가 잘못 되었 니 ?

+0

기능 코드 (1 매개 변수)를 넣었습니다. – Wizard

답변

9

당신이 얻는 ORA-06550 코드는 함수 was compiled with invalid statements가 다시 작성해야하는 것을 의미한다 : 값)

는 이런 일이 될 수 있습니다. 분명히 코드에 문제가있는 것은 아니므로 권한이나 잘못된 테이블 이름과 같은 문제가있을 수 있으므로 먼저 PL/SQL 편집기에서 함수를 실행할 수 있는지 확인해야합니다. 그런 다음 그 실행을 얻을 후, 작업에 사용할 수 타입 numberkiekis라는 이름의 반환 값을 기대하면서 저장 프로 시저와 같은 기능을 실행할 수 있어야

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(); 

...보십시오.

+0

똑똑한 작품, 고마워요! – Wizard

+0

@ 토마스 리 토우 바, 저의 기쁨. – gfish3000

1

나는 문제가 ExecuteNonQuery의 호출에 있다고 생각합니다. 그렇게하면 프로 시저 (값을 반환하지 않음)가 필요합니다. ExecuteScalar으로 전화하면 ar_knyga_egzistuoja이 그 기능이라고 기대할 것입니다.

+0

동일한 오류가 발생합니다. – Wizard

+1

토마스,보세요 [여기] (http://stackoverflow.com/questions/18788509/code-for-calling-a-function-in-a-package-from-c-sharp-and-odp-net) . 똑같은 문제인 것처럼 보입니다. –

4

함수를 일반 select 문으로 호출하고 "텍스트 명령 유형"을 사용하고 select statement을 수행하여 함수를 호출하고 마지막으로 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(); 
+0

오류가 발생했습니다 : 'ORA-01036 : 잘못된 변수 이름/번호' – Wizard

+0

your "실제 스키마"이름에 대한 yourSchema를 변경하십시오. –

+0

Oracle SQL Developer에서 스키마를 찾을 수있는 곳은 어디입니까? 스키마가 없다고 생각합니다. – Wizard

-2
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 

    ''' <summary> 
    ''' Open Oracle Connection 
    ''' </summary> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Close Oracle Connection if Open 
    ''' </summary> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Read Settings From Configuratiob File 
    ''' </summary> 
    ''' <param name="key"> Key name from Configuration File aap.config</param> 
    ''' <returns> return keyvalue as string </returns> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Clear oracle Paramter Collection of Coomand 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private Sub ClearParameter() 
     Try 
      OracleCommand.Parameters.Clear() 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Sub 

    ''' <summary> 
    ''' Add Parameter For Procedure or Function any type of oracle command 
    ''' </summary> 
    ''' <param name="p_paraType">'I' for Input,'O' for Output and 'IO' for Input Output both,'R' For R</param> 
    ''' <param name="p_paraName"> Name Of Parameter, same which is in declaration of Oracle </param> 
    ''' <param name="p_paraDBType"> Name Of Parameter Typw, same which is in declaration of Oracle </param> 
    ''' <param name="p_paraSize"> Size Of output Parameter/Field when p_paratype 'I' Size not consider </param> 
    ''' <param name="p_paraval"> Parameter Value as Object but must be compitible with object </param> 
    ''' <remarks> </remarks> 
    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 

    ''' <summary> 
    ''' Begin Transaction For Commit and Rollback Transaction 
    ''' </summary> 
    ''' <param name="p_isolvl"></param> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Commit DML command 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub Commit() 
     Try 
      Oratrans.Commit() 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Sub 

    ''' <summary> 
    ''' Rollback DML command 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub Rollback() 
     Try 
      Oratrans.Rollback() 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Sub 

    ''' <summary> 
    ''' Fill Dataset With command 
    ''' </summary> 
    ''' <param name="p_PrcName"> Oracle Procedure Name </param> 
    ''' <param name="p_TableNames"> Name Of the Return Table </param> 
    ''' <returns> Return Dataset From Store Procedure </returns> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Execute Stored Procedure With Transaction 
    ''' </summary> 
    ''' <param name="p_prcname"> Oracle Procedure Name </param> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Execute Sql Query as string 
    ''' </summary> 
    ''' <param name="p_Sqlqry"> sql query for execute </param> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Return Scalar value from sql stmt 
    ''' </summary> 
    ''' <param name="p_Sqlqry"></param> 
    ''' <returns> Object for all datatype compatibalite </returns> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Execute Sp/Function With Command 
    ''' </summary> 
    ''' <param name="p_prcname"> Procedure and Function name </param> 
    ''' <remarks></remarks> 
    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 

    ''' <summary> 
    ''' Get Parameter Value From Parameter list as out parameter 
    ''' </summary> 
    ''' <param name="p_parametername"></param> 
    ''' <returns> return value as object</returns> 
    ''' <remarks></remarks> 
    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