PL/SQL 如何获取 SP 的 OUT 参数

Posted

技术标签:

【中文标题】PL/SQL 如何获取 SP 的 OUT 参数【英文标题】:PL/SQL How to get SP's OUT parameter 【发布时间】:2019-03-27 12:50:04 【问题描述】:

我有一个 DAL 函数,它需要调用一个存储过程并获取数据集,以及几个 OUT 参数。我可以得到结果数据集,但不确定如何获取参数。

通常,参数可通过 cmd.Parameters["ParamName"].Value 获得,但我使用另一个 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】:

由于中间有一层,您可能需要稍微更改代码。

改变这个

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

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

然后使用Value属性:

outParam1.Value; 

根据documentation:

对于输出参数,值为: 在 OracleCommand 完成时设置(返回值参数也为 true)。 设置为数据库中的数据,设置为 OracleDbType 或 DbType 中指定的数据类型。

【讨论】:

以上是关于PL/SQL 如何获取 SP 的 OUT 参数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过休眠访问 pl/sql proc 中的 out 参数

如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数

如何验证作为参数 PL/SQL 给出的 YYYYMMDD 日期

如何在 Oracle PL/SQL 中动态地从行参数中获取命名列?

where 条件中的可选参数 - 如何提高性能 - PL/SQL

如何检查 Oracle PL/SQL 中的参数列表值?