Как вернуть параметры вывода оракула из хранимой процедуры в .NET.

У меня возникают серьезные проблемы с попыткой вернуть данные из SP. Я пытался сделать это вот так:

OracleCommand ora_cmd = new OracleCommand("a6r1.PR_ABC_P_ALTA_TARJETA_PAYWARE", ora_conn);
                    ora_cmd.BindByName = true;
                    ora_cmd.CommandType = CommandType.StoredProcedure;

                    int success= new int();

                    ora_cmd.Parameters.Add("Lc_Param_Issuer", OracleDbType.Varchar2, issuer, ParameterDirection.Input);
                    ora_cmd.Parameters.Add("Ln_Param_Valid_Product", OracleDbType.Varchar2, DropDownListProducto.SelectedValue.ToString(), ParameterDirection.Input);
                    ora_cmd.Parameters.Add("Ln_Param_Total", OracleDbType.Int32, parsed, ParameterDirection.Input);
                    ora_cmd.Parameters.Add("Lc_Param_User", OracleDbType.Varchar2, user, ParameterDirection.Input);
                    ora_cmd.Parameters.Add("Lc_Encrypted_Password", OracleDbType.Varchar2, pass, ParameterDirection.Input);
                    ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, success, ParameterDirection.Output);
                    ora_cmd.Parameters.Add("Lc_Error", OracleDbType.Varchar2, errorMessage, ParameterDirection.Output);

Но он ничего не возвращает переменным sucess или errorMessage. Что я делаю не так? Есть ли способ лучше? Он отлично работает при выполнении непосредственно на Oracle.

Ответ 1

Кажется, вы не можете использовать существующую переменную в качестве выходного параметра, попробуйте вместо этого

ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32).Direction = ParameterDirection.Output;

ora_cmd.ExecuteNonQuery();

if (ora_cmd.Parameters["Lc_Exito"].value == 0)

Ответ 2

Я не нашел нигде, где он документирует весь процесс в одном месте, поэтому, ударив головой о стену и ударив его, вот моя версия того, что я придумал, используя один из выходных параметров из Код OP:

OracleParameter param = new OracleParameter();
param = ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, ParameterDirection.Output);  // can assign the direction within the parameter declaration
param.Size = 25;  // failed for me if I did not have this - should be the same as the DB field, if exporting a value from the database

ora_cmd.ExecuteNonQuery();

int myLc_ExitoValue = int.Parse(param.Value);  // might not need to parse, and might need a .ToString() on param.Value if you do - I was using strings so not sure about OP exact case

Затем необходимо настроить хранимую процедуру, чтобы принять параметр OUT, и вы должны назначить ему процедуру:

create or replace procedure PR_ABC_P_ALTA_TARJETA_PAYWARE(Lc_Exito OUT number)
  as
  begin
    Lc_Exito := 123;
  end;
 /

Очевидно, это исключает все другие параметры, которые были отправлены, и другие параметры "вне" - хотели упростить его. Но это показывает, как все настраивается, от до, во время и после вызова хранимой процедуры на С#, и как установить параметр OUT и получить значение вне хранимой процедуры.