1

我有一个参数化(动态)查询,我想在 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

4 回答 4

2

您可以尝试使用AskTom 此处描述的“参数化视图”方法。

于 2012-04-12T09:54:23.270 回答
2

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

有关更多示例,请参阅此处以获取带有示例的好文章

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

于 2012-04-12T11:12:09.787 回答
1

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

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

于 2012-04-12T11:28:57.140 回答
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
....
于 2012-04-12T10:50:21.763 回答