从C#和ODP.NET调用包中的函数的代码
我试图用ODP.NET编写C#代码来调用包中的函数。 我收到以下两个错误:
ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to INSERT_FUNC' ORA-06550: line 1, column 7: PL/SQL: Statement ignored ORA-06550: line 1, column 7: PLS-00221: 'INSERT_FUNC' is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL: Statement ignored
我的OracleCommand
设置为:
cmd.CommandText = "PKG_NAME.INSERT_FUNC"; cmd.CommandType = CommandType.StoredProcedure;
- 我应该如何将参数传递给下面的函数?
- 我需要添加
ReturnValue
参数吗? 我见过很多论坛讨论需要添加一个ReturnValue
参数作为OracleCommand
对象上的第一个OracleParameter
。
我将不胜感激任何建议。
CREATE OR REPLACE PACKAGE BODY pkg_name IS FUNCTION insert_func ( i_description IN tableName.description%TYPE, i_theme IN tableName.theme%TYPE, o_id OUT tableName.id%TYPE, o_error_msg OUT VARCHAR2 ) RETURN NUMBER IS l_program VARCHAR2(100) := 'PKG_NAME.INSERT_FUNC'; BEGIN INSERT INTO tablea ( event_id, id, description, theme, lock_version ) VALUES ( rms12.tablea_seq.NEXTVAL, rms12.tablea_id_seq.NEXTVAL, i_description, i_theme, NULL ); INSERT INTO tableb ( id, description, theme ) VALUES ( rms12.id_seq.CURRVAL, i_description, i_theme ); SELECT rms12.id_seq.CURRVAL INTO o_id FROM dual; RETURN 1; EXCEPTION WHEN OTHERS THEN o_error_msg := sql_lib.create_msg( 'PACKAGE_ERROR', SQLERRM, l_program, TO_CHAR( SQLCODE ) ); RETURN 0; END insert_func; END pkg_name;
这是我在这个论坛上的第一个问题,我很乐意发表自己的答案。
我们可以通过设置CommandType.StoredProcedure
来使用ODP.NET调用oracle包函数。
ORA-06550: line 1, column 7: PLS-00221: 'INSERT_FUNC' is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL: Statement ignored
如果出现此错误,只需将此行添加为命令对象上的第一个参数:
cmd.Parameters.Add("Return_Value", OracleDbType.Int16, ParameterDirection.ReturnValue);
这是工作代码:
using (var conn = new OracleConnection(oradb)) using (var cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "PKG_NAME.INSERT_FUNC"; cmd.BindByName = true; cmd.Parameters.Add("Return_Value", OracleDbType.Int16, ParameterDirection.ReturnValue); cmd.Parameters.Add("i_description", OracleDbType.Varchar2, 1000, promotionEventSetupDetails.PromotionDescription, ParameterDirection.Input); cmd.Parameters.Add("i_theme", OracleDbType.Varchar2, 80, promotionEventSetupDetails.PromotionTheme, ParameterDirection.Input); cmd.Parameters.Add("o_id", OracleDbType.Varchar2, ParameterDirection.Output); cmd.Parameters.Add("o_error_msg", OracleDbType.Varchar2, ParameterDirection.Output); conn.Open(); using (var dr = cmd.ExecuteReader()) { // do some work here } }
对于最新版本的Oracle,这必须是新的。 我之前能够使用在我的C#代码中的所有输入参数之后列出的返回值参数来执行此操作,但是在12c上运行此参数之后,我遇到了这个问题,现在可以使用返回val param的这个建议。
上述就是C#学习教程:从C#和ODP.NET调用包中的函数的代码分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/960808.html