c# - 从存储过程返回 OUT 参数 & OUT 游标 & 解析结果 (Oracle)

标签 c# oracle plsql

问题:是否可以使用 OUT 返回:

两者:一个变量和一个游标,来 self 下面的代码??


我在 SqlDB 上看到了类似的问题,但经过很长时间的搜索后没有找到 OracleDB 的解决方案。

在 PLSQL 中:

CREATE OR REPLACE
PROCEDURE SPGETRESULTANDSETFLAG
(
 pFilter VARCHAR2,
 pMaxRowCount VARCHAR2,
 pTableID RAW,
 myFlag OUT NUMBER,
 myCursor OUT types.cursorType
)
AS
BEGIN
 Declare
  CountQuery VARCHAR(20000) := '';
  DataQuery VARCHAR(20000) := '';
  ResultingRows NUMBER := -1;
 Begin
  myFlag := -1;

  CountQuery := 'SELECT COUNT(*) FROM ' 
                || F_GET_TABLENAME_FROM_ID(PTABLEID => pTableID)
                || ' WHERE ' || pFilter;
  EXECUTE IMMEDIATE CountQuery INTO ResultingRows;


  --Get the Return Value
  if( pMaxRowCount > ResultingRows ) then myFlag := 1; end if;


  DataQuery := 'SELECT * FROM '
                || F_GET_TABLENAME_FROM_ID(PTABLEID => pTableID) 
                || ' WHERE ' || pFilter; 
  --Get the Return Cursor
  Open myCursor for DataQuery;

 End;
END SPGETRESULTANDSETFLAG;

在代码背后..

Database db = DBSingleton.GetInstance();
using (DbCommand command = db.GetStoredProcCommand(spName))
{
    //The three Add In Parameters... & then the Add out Parameter as below
    db.AddOutParameter(command, "myFlag", System.Data.DbType.Int32, LocVariable );
    using ( IDataReader reader = db.ExecuteReader(command))
    {
         //Loop through cursor values & store them in code behind class-obj(s)
    }
}

我认为这是不可能的,因为我如何读取值和光标,因为..

如果只标记参数,那么我会使用db.ExecuteNonQuery(..) & 如果只有光标出来我会使用db.ExecuteReader(..)

最佳答案

是的,可以有多个输出参数。下面是我用来在 C# 中调用 Oracle 存储过程的示例:

OracleParameter op = null;
OracleDataReader dr = null;

/* custom code here. Yours would look a little different */
OracleCommand cmd = (OracleCommand) this.FactoryCache.Connection.CreateCommand();

cmd.CommandText = "pkg_prov_index.getNextPanel";
cmd.CommandType = CommandType.StoredProcedure;

op = new OracleParameter("pCurrentPanelId", OracleType.VarChar);
op.Direction = ParameterDirection.Input;
op.Value = masterProviderIndex.CurrentPanelId;
cmd.Parameters.Add(op);

op = new OracleParameter("pRefCursor", OracleType.Cursor);
op.Direction = ParameterDirection.Output;
cmd.Parameters.Add(op);

op = new OracleParameter("pReturnCode", OracleType.Number);
op.Direction = ParameterDirection.Output;
op.Size = 5;
cmd.Parameters.Add(op);

op = new OracleParameter("pReturnMessage", OracleType.VarChar);
op.Direction = ParameterDirection.Output;
op.Size = 4000;
cmd.Parameters.Add(op);

cmd.ExecuteNonQuery();

returnCode = Convert.ToInt16(cmd.Parameters[2].Value);
returnMessage = cmd.Parameters[3].Value.ToString();

dr = (OracleDataReader) cmd.Parameters[1].Value;

while (dr.Read()) {
}

关于c# - 从存储过程返回 OUT 参数 & OUT 游标 & 解析结果 (Oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882690/

相关文章:

mysql - Oracle 10g, 11g, MySQL, SQL SERVER (不支持MATCH RECOGNIZE)如何合并两个数据行warning off power and on power into one

oracle - 如何在 perl 脚本中使用 IPC::Run 模块

sql - 查找表中缺失的序列

c# - 无法在 ASP.NET C# 中转换字符

sql - 获取删除的记录数sql

c# - 如何调试 PerfMon.dll 中的 0xc0000409 错误?/组装绑定(bind)

sql - 设置执行 PL/SQL 脚本的最长时间

sql - 如何在 Oracle PL/SQL 中 SELECT INTO 数字数组?

c# - 无法让 SignalR Hub 变量停止丢失值(静态变量不是问题)

c# - 使用 C# 使用 V2 方法执行带有命令行参数的 PowerShell 脚本