PL / SQL Как получить параметр OUT SP - PullRequest
0 голосов
/ 27 марта 2019

У меня есть функция DAL, которая должна вызвать хранимую процедуру и получить набор данных, а также пару параметров OUT. Я могу получить полученный набор данных, но не знаю, как получить параметры.

Обычно параметры доступны через cmd.Parameters ["ParamName"]. Значение, но я использую другой API, чтобы установить соединение с БД и вернуть полученный набор данных, не зная, как получить параметры OUT в дополнение к набору данных.

Вот что у меня есть, пока:

    Public static int getSomething(string inParam, out DataTable dtOut, out string outParam1, out string outParam2)
    {
        OracleDbCntext dbContext = new OracleDbContext();
        DataSet dsOut = new DataSet()
        DataTable dtOut = new dataTable();
        ....
        try
        {
            List<OracleParameter> spParams = new List<OracleParameter>();
            spParams.Add(new OracleParameter("INPARAM", OracleDbType.Varchar2, receptacleID, ParameterDirection.Input));
            spParams.Add(new OracleParameter("OUTARAM1", OracleDbType.TimeStamp, null, ParameterDirection.Output));
            spParams.Add(new OracleParameter("OUTARAM2", OracleDbType.TimeStamp, null, ParameterDirection.Output));
            spParams.Add(new OracleParameter("CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output));

            try
            {
                dbContext.Open();
                dbContext.ExecuteStoredProcedure("SOME_PKG.USP_SOMESP", spParams, ref dsOutcome);
            }
            catch (Exception oConnException)
            {
            }
            if (dsOut != null)
            {
                if (dsOut.Tables[0].Rows.Count > 0)
                {
                    dtOut = dsOut.Tables[0];
                    //outParam1 = ????
                    //outParam2 = ????
                }
            }
        }
    }

namespace Something.Model.DataAccess
{
    public class OracleDbContext
    {
        public OracleConnection DbConnection { get; private set; }

        public OracleDbContext()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;

            DbConnection = new OracleConnection(ConnectionString);
        }
        public void Open()
        {
            if (DbConnection.State != ConnectionState.Open)
            {
                DbConnection.Close();
                DbConnection.Open();
            }
        }
        public void Close()
        {
            if (DbConnection.State == ConnectionState.Open || DbConnection.State == ConnectionState.Broken)
            {
                DbConnection.Close();
                DbConnection.Dispose();
            }
        }
        public void ExecuteStoredProcedure(string spName, List<OracleParameter> spParams, ref DataSet dataset)
        {
            OracleDataAdapter da = null;
            OracleTransaction oraTransaction = null;
            using (OracleCommand command = new OracleCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddRange(spParams.ToArray<OracleParameter>());
                command.Connection = DbConnection;
                command.CommandText = spName;

                try
                {
                    oraTransaction = DbConnection.BeginTransaction();
                    da = new OracleDataAdapter(command);
                    da.Fill(dataset);
                    oraTransaction.Commit();
                }
                catch (Exception e)
                {
                    oraTransaction.Rollback();
                }
                finally
                {
                    if (oraTransaction != null)
                        oraTransaction.Dispose();

                    if (DbConnection != null)
                    {
                        this.Close();
                    }
                }
            }
        }

Хранимая процедура в SOME_PKG:

    PROCEDURE USP_SOMESP
    (
      INPARAM       VARCHAR2,
      OUTPARAM1     OUT TIMESTAMP,
      OUTPARAM2     OUT TIMESTAMP,
      CUR_OUT       OUT GETDATACURSOR 
    )
    ....
      LVSQUERY:='SELECT FIELD1, '''|| V_EVENTCODE ||''' AS EVENTCODE, ...
 WHERE SOMETHING= '''|| V_LOC1||''' ';


      OPEN CUR_OUT FOR LVSQUERY;
      EXCEPTION WHEN OTHERS THEN
        ...;
    END USP_SOMESP;

1 Ответ

1 голос
/ 27 марта 2019

Поскольку у вас есть слой посередине, вам может потребоваться немного изменить код.

Изменить это

spParams.Add(new OracleParameter("OUTARAM1", OracleDbType.TimeStamp, null, ParameterDirection.Output));

с

var outParam1 = new OracleParameter("OUTARAM1", OracleDbType.TimeStamp, null, ParameterDirection.Output);
spParams.Add(outParam1); 

А затем используйте свойство Значение :

outParam1.Value; 

Согласно документации :

Для выходных параметров значение:
Устанавливается при завершении OracleCommand (также верно для параметров возвращаемого значения).
Установить для данных из базы данных тип данных, указанный в OracleDbType или DbType.

...