我有一个如下所示的 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”。这对我来说不是解决方案。
现在我想查询几个表作为输出参数。这怎么可能?这可能吗?
是的,这是可能的。
我只想使用单个光标。
运气不好,您返回的每个结果集都需要自己的REF CURSOR。
我尝试通过使用多个光标来实现我的目标。然而,这个 SQL 文件会不断增长,这意味着我必须在代码中为每个新的 SELECT 定义一个新的“result_cursor”。
使用多个参考游标是正确的解决方案。
还有一点:
[...]使用替换命令替换变量的值[...]
不要使用
Replace
,而是使用参数。您已经声明了一个 (result_cursor
),只需声明更多即可。