C# OracleCommand 使用单个游标返回多个数据表作为输出参数

问题描述 投票:0回答:1

我有一个如下所示的 SQL 文件:

DECLARE
  V_ID_CB VARCHAR2(15) := '{V_ID_CB}';
  V_X_CB VARCHAR2(15) := '{V_X_CB}';
BEGIN
    IF V_ID_CB IS NOT NULL THEN
        OPEN :result_cursor FOR
            SELECT * FROM DEMANDES WHERE ID_CB = V_ID_CB;
    ELSIF V_X_CB IS NOT NULL THEN
        OPEN :result_cursor FOR
            SELECT * FROM SITES;
    END IF;
END;

我用 C# 读取这个文件,然后使用 Replace 命令将变量的值替换为实际值:

      var content = System.IO.File.ReadAllText(filePath);
      var sqlSkript = content;
      foreach (var param in parameters)
      {
        sqlSkript = sqlSkript.Replace($"{{V_{param.Key}}}", param.Value);
      }
public DataTable Execute(string sqlSkript)
    {
      try
      {
        if (!(_oraController.OracleConnection.State == ConnectionState.Open))
        {
          _oraController.OracleConnection.Open();
        }
        using (var command = new OracleCommand(sqlSkript) { Connection = _oraController.OracleConnection })
        {
          command.CommandType = CommandType.Text;
          OracleParameter resultCursor = new OracleParameter
          {
            ParameterName = "result_cursor",
            OracleDbType = OracleDbType.RefCursor,
            Direction = ParameterDirection.Output
          };
          command.Parameters.Add(resultCursor);
          using (var reader = command.ExecuteReader())
          {
            DataTable dataTable = new DataTable();
            dataTable.Load(reader);
            return dataTable;
          }
        }
      }
      catch (Exception ex)
      {
        string errorMessage = ex.Message + "\n" + ex.StackTrace;
        throw new Exception(errorMessage, ex);
      }
    }

到目前为止这也是有效的,我在数据表中得到了 SELECT 语句的结果。

现在我想查询几个表作为输出参数。这怎么可能?这可能吗?我只想使用单个光标。

我尝试通过使用多个光标来实现我的目标。然而,这个 SQL 文件会不断增长,这意味着我必须在代码中为每个新的 SELECT 定义一个新的“result_cursor”。这对我来说不是解决方案。

c# wpf oracle plsql ado.net
1个回答
0
投票

现在我想查询几个表作为输出参数。这怎么可能?这可能吗?

是的,这是可能的。

我只想使用单个光标。

运气不好,您返回的每个结果集都需要自己的REF CURSOR

我尝试通过使用多个光标来实现我的目标。然而,这个 SQL 文件会不断增长,这意味着我必须在代码中为每个新的 SELECT 定义一个新的“result_cursor”。

使用多个参考游标是正确的解决方案。

还有一点:

[...]使用替换命令替换变量的值[...]

不要使用

Replace
,而是使用参数。您已经声明了一个 (
result_cursor
),只需声明更多即可。

© www.soinside.com 2019 - 2024. All rights reserved.