【发布时间】:2012-08-23 11:59:22
【问题描述】:
我正在 Oracle 中创建一个类似 OLAP 的包,您可以在其中调用一个主控制函数,该函数通过进行大量左连接来组装其返回的输出表。这些连接表在包内的“从”函数中定义,这些函数使用静态游标返回特定子集,由函数的参数进行参数化。问题是,这些光标都非常相似。
除了生成动态查询并在ref cursor 中使用它们之外,还有什么方法可以概括这些。每次我添加一个函数时,我都会有一种奇怪的感觉,作为一个开发者,这不是特别优雅!
伪代码
somePackage
function go(param)
return select myRows.id,
stats1.value,
stats2.value
from myRows
left join table(somePackage.stats1(param)) stats1
on stats1.id = myRows.id
left join table(somePackage.stats2(param)) stats2
on stats2.id = myRows.id
function stats1(param)
return [RESULTS OF SOME QUERY]
function stats2(param)
return [RESULTS OF A RELATED QUERY]
stats 查询都具有相同的结构:
- 首先他们以有用的方式聚合数据
- 然后他们根据标准将这些数据分成逻辑部分,并再次聚合(例如,按部门、按地区等),然后合并结果
- 然后他们返回结果,转换成相关的
object类型,这样我就可以轻松地做一个bulk collect
类似:
cursor myCursor is
with fullData as (
[AGGREGATE DATA]
),
fullStats as (
[AGGREGATE FULLDATA BY TOWN]
union all
[AGGREGATE FULLDATA BY REGION]
union all
[AGGREGATE FULLDATA BY COUNTRY]
)
select myObjectType(fullStats.*)
from fullStats;
...
open myCursor;
fetch myCursor bulk collect into output limit 1000;
close myCursor;
return output;
【问题讨论】:
-
您的问题是“如何在不生成动态查询的情况下生成动态查询?”
-
点了!我的理由是我所有的查询都具有相同的结构:所以也许更准确的总结是“我可以创建多态游标吗?”