web-dev-qa-db-fra.com

Code pour appeler une fonction dans un package à partir de C # et ODP.NET

J'ai essayé d'écrire du code C # avec ODP.NET pour appeler une fonction dans un package. Je reçois les deux erreurs ci-dessous:

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

Ma OracleCommand est configurée comme suit:

cmd.CommandText = "PKG_NAME.INSERT_FUNC";
cmd.CommandType = CommandType.StoredProcedure;
  1. Comment dois-je passer des paramètres à la fonction ci-dessous?
  2. Dois-je ajouter un paramètre ReturnValue? J'ai vu de nombreux forums discuter de la nécessité d'ajouter un paramètre ReturnValue en tant que première OracleParameter sur l'objet OracleCommand.

J'apprécierais toutes suggestions.

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;
12
user2776709

Ceci est ma première question sur ce forum et je suis heureux de poster à ma propre réponse.

Nous pouvons appeler une fonction de package Oracle à l'aide de ODP.NET en définissant 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

Si vous obtenez cette erreur, ajoutez simplement cette ligne en tant que premier paramètre de l'objet de commande:

cmd.Parameters.Add("Return_Value", OracleDbType.Int16,
    ParameterDirection.ReturnValue);

Voici le code de travail:

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
    }
}
22
user2776709

Cela doit être nouveau avec une version plus récente d'Oracle. Auparavant, je pouvais le faire avec le paramètre de valeur de retour répertorié après tous les paramètres d'entrée dans mon code C #, mais après avoir exécuté cette opération sur 12c, j'avais ce problème précis, qui fonctionne désormais avec cette suggestion de mettre le paramètre de retour val avant en premier.

1
Ken