1

我想从 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; 
4

2 回答 2

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);
于 2013-08-23T07:35:23.540 回答
1

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 是真还是假,它的名称都不重要。

于 2020-07-19T17:54:33.957 回答