C#调用oracle存储函数创建或替换函数ar_knyga_egzistuoja(idnumber)returnnumberiskiekisnumber;beginselectcount(*)intokiekisfromknygoswherekn_id=id;返回kiekis;结尾;C#代码:conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="ar_knyga_egzistuoja";cmd.CommandType=CommandType.StoredProcedure;OdbcParameterparam=newOdbcParameter();cmd.Parameters.Add("id",OracleType.Number).Value=id;cmd.ExecuteNonQuery();varkiekis=Convert.ToString(cmd.Parameters["kiekis"].Value);MessageBox.Show(kiekis);cmd.Parameters.RemoveAt(0);conn.Close();我收到错误:PLS-00221:'AR_KNYGA_EGZISTUOJA'不是过程或未定义ORA-06550:第1行,第7列:这不是程序而是函数,但我知道我可以像程序一样调用函数,有什么问题?您得到的ORA-06550代码意味着该函数是使用无效语句编译的,需要重写。我没有看到任何明显错误的代码,因此您可能遇到权限问题或不正确的表名等问题,应该首先检查您是否可以在PL/SQL编辑器中运行该函数。然后,在你运行它之后,尝试...varcmd=newOracleCommand();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();varkiekis=Convert.ToString(cmd.Parameters["kiekis"].Value);MessageBox.Show(kiekis);cmd.Connection.Close();这应该能够像存储过程一样运行该函数,同时期望名为kiekis的返回值可用于工作。你需要像常规的select语句一样调用你的函数,使用“文本命令类型”,然后执行select语句来调用你的函数,最后使用executeScalar来获取返回值(我猜它只是一个值)可??能是像这样的东西:conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="选择你的Schema.ar_knyga_egzistuoja(@id)";cmd.CommandType=CommandType.Text;OdbcParameterparam=newOdbcParameter();cmd.Parameters.Add("id",OracleType.Number).Value=id;varresult=cmd.ExecuteScalar();MessageBox.Show(结果);cmd.Parameters.RemoveAt(0);conn.Close();我认为问题在于您调用了ExecuteNonQuery。这样,它期望一个过程(不返回值)。如果您调用ExecuteScalar,它会期望ar_knyga_egzistuoja是一个函数。以上就是C#学习教程:C#调用oracle存储函数全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—ImportsSystem.ConfigurationImportsSystem.Data.OracleClientPublicClassDBConnectionDimv_connectionstringAsStringPublicOracleConnectAsNewOracleClient.OracleConnectionPublicOracleCommandAsNewOracleClient.OracleCommandPublicOraDataAdpAsNewOracleClient.OracleDataAdapterPublicOratransAsOracleClient.OracleTransactionDimOraParaAsNewOracleParameterCollectionPublictitleAsStringDimv_clearParameterAsBoolean=TruePublicresponseAsMsgBoxResult''''''打开Oracle连接''''''PublicSubConnect()Tryv_connectionstring=ReadSetting("DBString")'用于测试默认注释'v_connectionstring="SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=team-pc)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xe)));uid=genmfg1;pwd=genmfg1;"如果OracleConnect.State=ConnectionState.OpenThenOracleConnect.Close()EndIfOracleConnect.ConnectionString=v_connectionstringOracleConnect.Open()CatchexAsExceptionThrowexFinallyEndTryEndSub''''''如果打开则关闭OracleConnection''''''PublicSubDisconnect()TryIfOracleConnect.State=ConnectionState.OpenThenOracleConnect.Close()EndIfCatchexAsExceptionThrowexFinallyEndTryEndSub''''''从配置文件中读取设置''''''配置文件aap.config中的键名'''将键值作为字符串返回'''PrivateFunctionReadSetting(ByValkeyAsString)AsStringDimresultAsStringTryDimappSettings=ConfigurationSettings.AppSettingsresult=appSettings(key)IfIsNothing(result)Thenresult="Notfound"EndIf返回结果CatchexAsConfiguration.ConfigurationExceptionThrowexCatchexAsExceptionThrowexFinallyEndTryEndFunction''''''清除Coomand的oracle参数集合''''''PrivateSubClearParameter()TryOracleCommand.Parameters.Clear()CatchexAs异常抛出exEndTryEndSub''''''AddParameterForProcedureorFunctionanytypeoforaclecommand'''''''I'forInput,'O'forOutputand'IO'forInput输出两者,'R'对于R'''参数名称,与Oracle'''参数名称声明中的相同'参数值作为对象,但必须与对象兼容'''PublicSubAddParameter(ByValp_paraTypeAsString,ByValp_paraNameAsString,ByValp_paraDBTypeAsOracleType,ByValp_paraSizeAsInteger,ByValp_paravalAsObject)'OracleCommand.Parameters.AddTry如果v_clearParameterThenClearParameter()v_clearParameter=FalseEndIf'OracleCommand.Parameters.Add(p_paraName,p_paraDBType,p_paraSize,p_paraval)Ifp_paraType="I"ThenOracleCommand.Parameters.Add(p_paraName,p_paraDBType).Value=p_paravalElseIfp_paraType=“O”然后是OracleCommand.Parameters.Add(p_paraName,p_paraDBType,p_paraSize).Direction=ParameterDirection.OutputElseIfp_paraType="IO"或p_paraType="OI"然后OracleCommand.Parameters.Add(p_paraName,p_paraDBType,p_paraSize).Direction=ParameterDirection.InputOutputOracleCommand.Parameters(p_paraName)).Value=p_paravalElseIfp_paraType="R"ThenOracleCommand.Parameters.Add(p_paraName,p_paraDBType,p_paraSize).Direction=ParameterDirection.ReturnValueElseThrowNewException("InvalidParameterType")EndIfCatchexAsException抛出exEndTryEndSub''''''BeginTransactionForCommitandRollbackTransaction'''''''''PublicSubBeginTransaction(ByValp_isolvlAsSystem.Data.IsolationLevel)尝试Oratrans=OracleConnect.BeginTransaction(p_isolvl)OracleCommand.Transaction=OratransCatchexAsExceptionThrowexEndTryEndSub''''''CommitDML命令''''''PublicSubCommit()TryOratrans.Commit()CatchexAsExceptionThrowexEndTryEndSub''''''RollbackDMLcommand''''''PublicSubRollback()TryOratrans.Rollback()CatchexAsExceptionThrowexEndTryEndSub''''''FillDatasetWithcommand''''''Oracle过程名称'''返回表的名称'''从存储过程返回数据集'''PublicFunctionExecuteSPReturnDatasetWithCommand(ByValp_PrcNameAsString,ByValp_TableNamesAsString())AsDataSetDim_dsAsDataSet=NewDataSetTryConnect()OracleCommand.CommandText=p_PrcNameOracleCommand.Connection=OracleConnectOracleCommand.CommandType=CommandType.StoredProcedureOraDataAdp=NewOracleClient.OracleDataAdapter(OracleCommand)OracleCommand.ExecuteNonQuery()OraDataAdp.Fill(_ds)尝试为每个_tbstrAsStringInp_TableNames_ds.Tables(0)).TableName=_tbstrNextCatchexAsExceptionThrowNewException("NoOfReturnTableDoesnotmatchwithProcedure")EndTryReturn_dsCatchexAsExceptionThrowex最后v_clearParameter=TrueDisconnect()EndTryEndFunction''''''ExecuteStoredProcedureWithTransaction''''''OracleProcedureName'''PublicSubExecuteSPFunWithTransaction(ByValp_prcnameAsString)尝试OracleCommand.CommandText=p_prcnameOracleCommand.Connection=OracleConnectOracleCommand.CommandType=CommandType.StoredProcedureOracleCommand.ExecuteNonQuery()CatchexAsExceptionThrowex最后v_clearParameter=TrueEndTryEndSub''''''ExecuteSqlQueryasstring''''''执行的sql查询'''PublicSubExecuteSqlWithcommand(ByValp_SqlqryAsString)TryConnect()OracleCommand.CommandText=p_SqlqryOracleCommand.Connection=OracleConnectOracleCommand.CommandType=CommandType.TextOracleCommand.ExecuteNonQuery()Catchex作为异常Throwex最后v_clearParameter=TrueDisconnect()EndTryEndSub''''''从sqlstmt返回标量值'''''''''所有数据类型兼容的对象'''PublicFunctionExecuteSqlReturnScalarWithcommand(ByValp_SqlqryAsString)AsObjectDim_objAsObject尝试连接()TrueDisconnect()EndTryReturn_objEndFunction''''''ExecuteSp/FunctionWithCommand''''''ProcedureandFunctionname'''PublicSubExecutSPFunPWithcommand(ByValp_prcnameAsString)TryConnect()OracleCommand。CommandText=p_prcnameOracleCommand.Connection=OracleConnectOracleCommand.CommandType=CommandType.StoredProcedureOracleCommand.ExecuteNonQuery()CatchexAsExceptionThrowex最后v_clearParameter=TrueDisconnect()EndTryEndSub''''''从参数列表获取参数值作为输出参数'''''''''返回值作为对象'''PublicFunctionGetParameterValue(ByValp_parameternameAsString)AsOb项目尝试返回OracleCommand.Parameters(p_parametername).ValueCatchexAsExceptionReturnNothingFinallyEndTryEndFunctionEndClass:
