Как узнать, была ли хранимая процедура выполнена правильно? - PullRequest
0 голосов
/ 18 июня 2019

Я вызываю хранимую процедуру, которая вставляет записи в БД, но я хочу знать, как определить, что хранимая процедура была выполнена правильно? Чтобы узнать, сколько было сделано вставок, это можно проверить из Интернета?

Я добавляю код, который я использую для вызова хранимой процедуры:

public void EjecutaSP(string NomSP, ParametroOracle[] Parameter, string OracleCon)
{
    OracleCon = Rijndael.Desencriptar(strOracleCon);
    OracleConnection oracleCon = new OracleConnection(OracleCon);

    try
    {
        OracleCommand cmd = new OracleCommand(NomSP, oracleCon);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("DateProcess", "OracleType.VarChar").Value = "'2019-05-29'";
        cmd.Parameters.Add("EmployeeGroup", "OracleType.Number").Value = 555501;
        cmd.Parameters.Add("IdEmployee", "OracleType.Number").Value = 555501;

        cmd.Parameters.Add("NomEmployee", "OracleType.VarChar").Value = "'Espanol'";

        OracleDataAdapter da = new OracleDataAdapter(cmd);
        DataTable dtTable = new DataTable();

        da.Fill(dtTable);
    }
    catch (Exception ex)
    {
        string strSP = NomSP;
        int intPar = Parameter.Length;

        for (int i = 0; i < intPar; i++)
            strSP += " ," + Parameter[i].Valor;

        Exception _ex = new Exception("Error en SP: " + strSP, ex.InnerException);
        throw _ex;
    }
    finally
    {
        oracleCon.Close();
        oracleCon.Dispose();
    }
}    

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

1 Ответ

1 голос
/ 18 июня 2019
  1. Вам нужно очистить свой вопрос.Вы вставляете или выбираете данные? "Я вызываю процедуру хранилища, которая вставляет записи" .,. da.Fill(dtTable); ????

  2. Если вы выбираете данные, ваш SP должен иметь RefCursor out параметр

create or replace procedure X (pDataout OUT SYS_REFCURSOR)....

И, следовательно, вам нужно добавить соответствующий параметр

cmd.Parameters.Add(pdata, OracleDbType.RefCursor) // NOTE correct usage
На ваш вопрос ... Хранимая процедура не возвращает количество затронутых записей, скажем, с использованием ExecuteNonQuery.Если вы просто хотите узнать, успешен ли SP, если у вас нет ошибок - это так.Если у вас нет обработки ошибок в вашем SP, и что-то не получается, все будет откатано.Это все или ничего.Вы можете поймать исключение в C # и работать с ним.Избегайте обработки ошибок внутри SP.
create or replace procedure X (...)
AS
 . .  .
Begin
    insert into . . . 
End;

Если у вас есть несколько DML в SP, и вы хотите знать, сколько строк затронуто, вам нужно построить для него SP

create or replace procedure X (pAffected out number)
AS
 . .  .
Begin
    insert into A. . . 
    pAffected := SQL%ROWCOUNT;

    insert into B. . . 
    pAffected := pAffected + SQL%ROWCOUNT;
End;

А в c # просто получите значение

 cmd.Parameters.Add("pAffected", OracleDbType.Decimal, ParameterDirection.Output)
 . . .  . . . 
 int count = ((OracleDecimal)cmd.Parameters["pAffected"].Value).ToInt32();
Код конструкции
using (var conn = new OracleConnection(.......))
using (var cmd = new OracleCommand(.......))
{
  // . . . . .  CODE HERE ........   
  using (var adp = new OracleDataAdapter(....) // if you need to fill table
  {
      // fill table
  }
}
// NOTE: no need close/dispose (automatic with using). Transaction committed internally. 
// If SP errors out, everything is rolled back. Wrap this into `Try/Catch(OracleException ex)`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...