如何在不重复的情况下重用大型动态查询?

时间:2012-04-12 09:36:03

标签: sql oracle plsql reusability

我有一个参数化(动态)查询我希望在oracle过程中重用(如果可能,甚至在oracle包中),如下所示:

cursor q (p1 integer, p2 integer, p3 ...) as
select .... from .... where col1 = p1 and col2 = p2 and ....

稍后在后续查询中执行类似的操作

select ... 
from t1, t2, ..., q (a, b, c)
where q.c1 = t1.tc1
and q.c2 = t2.tc2
....


select ... 
from n1, n2, ..., q (a, b, c)
where q.c1 = n1.tc1
and q.c2 = n2.tc2
....

如果查询是静态的,我已经使用了VIEWS,但它没有... 是否有其他更简单的方法,而不是填充和使用大量的其他对象?

4 个答案:

答案 0 :(得分:2)

您可以尝试使用here on AskTom所述的“参数化视图”方法。

答案 1 :(得分:2)

要创建一种参数化视图,您可以使用流水线函数,正如我在previous post中详述的那样。使用流水线函数有其局限性,但Oracle不断增加其功能(例如函数缓存和并行执行)。

请点击此处查看good article的示例,了解更多信息。

请务必根据您的情况测试他们的表现。我个人不会疯狂地创建大量的函数来代替简单的SQL,但他们有自己的位置。

答案 2 :(得分:1)

我可能会遗漏一些东西,但为什么不将视图创建为:

create view q as
select .... from .... 

即。没有WHERE子句中的3个参数(where col1 = p1 and col2 = p2 and col3 = p3

然后在使用视图时应用3“参数”:

select ... 
from t1, t2, ..., q
where q.c1 = t1.tc1
and q.c2 = t2.tc2
and col1 = p1 and col2 = p2 and col3 = p3
....


select ... 
from n1, n2, ..., q
where q.c1 = n1.tc1
and q.c2 = n2.tc2
and col1 = p1 and col2 = p2 and col3 = p3
....

答案 3 :(得分:1)

您可以在包中定义参数化光标,然后从您需要的任何地方引用它。

http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/09_packs.htm#i7454