我有一个参数化(动态)查询我希望在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,但它没有... 是否有其他更简单的方法,而不是填充和使用大量的其他对象?
答案 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