【问题标题】:How can i execute a Oracle Function in C#如何在 C# 中执行 Oracle 函数
【发布时间】:2013-08-26 03:45:10
【问题描述】:

我想从 c# 执行 oracle 函数。我使用oracle 数据访问OracleConnection 和OracleCommand。我的功能是;

create or replace 
FUNCTION Fnc_Sistem(Tbl VarChar2) RETURN Number IS
Sistem    Number     := -1;
C         Integer;
S         Integer;

BEGIN
C := Dbms_sql.open_cursor;
Dbms_sql.parse(C, 'Select Sistem_Kodu From '||Tbl ||' Where Referans = 1', 0);
Dbms_sql.define_column(C, 1, Sistem);
S := dbms_sql.execute(C);
Loop
  If Dbms_sql.fetch_rows(C) > 0 then
       Dbms_sql.Column_value(C, 1, Sistem);
  End If;
  Exit;
End Loop;
Dbms_sql.close_cursor(C);
Return (Sistem);
Exception
      when others then
     If dbms_sql.is_open(C) then
        dbms_sql.close_cursor(C);
        Return (-1);
     end if;
     Return (-1);
     Raise;
End; 

【问题讨论】:

    标签: c# oracle odac


    【解决方案1】:

    您可以使用 Oracle 匿名块来调用您的函数:

    public static int FunctionCall(String value, String myConnectionString) {
      using (var conn = new OracleConnection(myConnectionString)) {
        conn.Open();
    
        using (var command = conn.CreateCommand()) {
          command.CommandText =
            @"begin
                :prm_Result := Fnc_Sistem(:prm_Argument);
              end;";
    
          command.Parameters.Add(":prm_Result", OracleDbType.Varchar2, ParameterDirection.Output);
          command.Parameters.Add(":prm_Argument", OracleDbType.Varchar2).Value = value;
    
          command.ExecuteNonQuery();
    
          return int.Parse(command.Parameters[0].Value.ToString());
        }
      } 
    }
    
    ....
    
    int myValue = FunctionCall("myValue", myConnectionString);
    

    【讨论】:

    • 非常感谢。我怎样才能做那种存储过程类型而不是文本。我会将它用于其他功能。而且他们有更多的论据。
    • 恕我直言,匿名块(文本类型)更好:首先,它更通用,例如,您可以一次运行多个函数、过程、查询;其次,它通常更快——一个查询而不是多个查询。
    【解决方案2】:

    Oracle 函数的调用方式与存储过程类似:

    cmd = new OracleCommand("Fnc_Sistem", connection);
    cmd.CommandType = CommandType.StoredProcedure;
    
    cmd.Parameters.Add("prm_Result", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
    cmd.Parameters.Add("prm_Argument", OracleDbType.Varchar2).Value = value;
    
    command.ExecuteNonQuery();
    

    应该先创建返回参数,不管BindByName是真还是假,它的名字都不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      相关资源
      最近更新 更多