从C#和ODP.NET调用包中的函数的代码

use*_*709 12 c# oracle 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
Run Code Online (Sandbox Code Playgroud)

OracleCommand的设置如下:

cmd.CommandText = "PKG_NAME.INSERT_FUNC";
cmd.CommandType = CommandType.StoredProcedure;
Run Code Online (Sandbox Code Playgroud)
  1. 我应该如何将参数传递给下面的函数?
  2. 我需要添加ReturnValue参数吗?我见过很多论坛讨论了在对象上添加ReturnValue参数的必要性.OracleParameterOracleCommand

我将不胜感激任何建议.

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;
Run Code Online (Sandbox Code Playgroud)

use*_*709 24

这是我在这个论坛上的第一个问题,我很乐意发表自己的答案.

我们可以通过设置使用ODP.NET调用oracle包函数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
Run Code Online (Sandbox Code Playgroud)

如果出现此错误,只需将此行添加为命令对象上的第一个参数:

cmd.Parameters.Add("Return_Value", OracleDbType.Int16,
    ParameterDirection.ReturnValue);
Run Code Online (Sandbox Code Playgroud)

这是工作代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么我们必须添加`cmd.Parameters.Add("Return_Value",OracleDbType.Int16,ParameterDirection.ReturnValue);`作为第一个参数? (3认同)
  • 这部分"cmd.BindByName = true;" 拯救我的生命,如果你有相同的问题来执行包,不要忘记. (2认同)