PL/SQL 新手 - 返回多个结果集问题

Posted

技术标签:

【中文标题】PL/SQL 新手 - 返回多个结果集问题【英文标题】:New to PL/SQL - Returning multiple result sets question 【发布时间】:2011-03-17 19:52:18 【问题描述】:

好的 - 我在 SQL Server 方面拥有相当广泛的背景,但我之前只在 Oracle 中闲逛过。好吧,push 已经到了紧要关头,我需要创建一个相对复杂的查询。本质上,它在 T-SQL 中归结为:

SELECT Col1 
INTO #tmpTable
FROM Table1
WHERE Col3 = @paramValue

SELECT Col1
FROM #tmpTable

SELECT OtherCol
FROM Table2
INNER JOIN #tmpTable 
  ON Table1.Col1 = Table2.fkCol1

这个序列的原因是因为对 Table1 的初始调用非常繁重(约 5 秒运行时间),因为它是对我们的数据仓库的高度复杂的调用。我想在单独的调用中返回 Table2 的结果,因为 Table2 中的每个记录可能有 5-10 条记录,这使我的前端透视更容易。

我知道我可以做到

SELECT Table1.Col1, Table2.OtherCol
FROM Table1
LEFT JOIN Table2 
  ON Table1.Col1 = Table2.fkCol1

然后在前端重新规范化数据(只处理 Col1 的第一条记录,然后处理所有 OtherCol 记录,直到我发现新的 Col1)

不过,我不是数据库专家,所以我不确定哪种方法更好。从开发人员的角度来看,第一个解决方案对我来说更容易使用。它也(直觉)看起来更高效,因为不必返回与 Table2 耦合的 Table1 的“厚”结果。 Table1 将返回约 1200 行,宽约 2kb。 Table2 明显更精简(约 20 字节宽),但行数更多(6000-12000)。

所以,最终我的问题是,哪种解决方案最适合 PL/SQL 环境,如果是第一个,那么最好的解决方案是什么?全局临时表/光标/子选择/什么?

【问题讨论】:

在第一段代码中,你真的是从同一个 Col1 匹配参数的表中选择 Col1,还是被过度简化了? @Gary Myers:哈哈,我想我会改一下名字——这太简单了。 【参考方案1】:

我会使用连接。它更容易编码和阅读,并且应该比三个单独的选择更快。如果你只选择Col1,那么整行有多“厚”都没关系。

【讨论】:

第二种方案写SQL肯定更简单! 哈哈!我想我们只在性能出现时才进行优化,是吗? :p 如果在一周(我的截止日期)内没有其他人更好地回答这个问题,我将标记为已接受! 我同意丹尼斯的观点,加入不是邪恶的,也不是应该避免的。更直接。如果您可以进行连接,请避免使用 pl/sql 游标循环等。【参考方案2】:

如果您担心性能,您应该对其进行测试并比较结果。我个人会选择加入解决方案。 Oracle 将在幕后做自己的事情,并可能会提高您的绩效。

您还应该查看查询的执行计划。我相信您的开发环境可以让您快速查看执行计划。您的查询费用将使您对正在发生的事情有一个很好的了解,并帮助您做出决定。

【讨论】:

很遗憾,我不知道如何实现第一个解决方案,所以无法比较。否则,我会这样做。【参考方案3】:

针对您关于不知道如何实施第一个解决方案的评论:

procedure get_data(p_paramValue in varchar2, 
                  c_data1 out sys_refcursor,
                  c_data2 out sys_refcursor)
is
  v_tmptable in varchar2(30);
begin
  SELECT Col1 INTO v_tmpTable
  FROM Table1
  WHERE Col3 = p_paramValue;

  open c_data1 for 'SELECT Col1 FROM '||v_temptable;

  open c_data2 for
    'SELECT OtherCol FROM Table2 INNER JOIN '||v_tmpTable|| 
    ' ON Table1.Col1 = Table2.fkCol1'; 
end get_data;

假设 Table1.Col1 中的数据是可信的,因为两个游标都存在注入漏洞。

【讨论】:

以上是关于PL/SQL 新手 - 返回多个结果集问题的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06504: PL/SQL: 执行时返回结果集变量的类型

Oracle 存储过程返回结果集

在 Java 中调用 Oracle PL/SQL 中的过程或函数。返回结果集 false

使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]

PL/SQL - 将两个结果集缓存到集合中并将它们连接在一起?

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