Код для вызова функции в пакете из C # и ODP.NET

Я попытался написать код C # с ODP.NET для вызова функции в пакете. Я получаю две ошибки ниже:

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; 
  1. Как передать параметры функции ниже?
  2. Нужно ли добавлять параметр ReturnValue ? Я видел много форумов, обсуждая необходимость добавления параметра ReturnValue в качестве первого OracleCommand объекта OracleCommand .

Буду признателен за любые предложения.

 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; 

Это мой первый вопрос на этом форуме, и я счастлив опубликовать свой ответ.

Мы можем вызвать функцию пакета oracle с помощью ODP.NET, установив CommandType.StoredProcedure .

 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 у меня была эта точная проблема, которая теперь работает с этим предложением сначала поставить return val param.