【问题标题】:How to reuse a large dynamic query without repeating it?如何重用大型动态查询而不重复?
【发布时间】:2012-04-12 09:36:02
【问题描述】:

我有一个参数化(动态)查询,我想在 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 但它不是.. 除了填充和使用大量额外的对象之外,还有其他更简单的方法吗?

【问题讨论】:

  • 我实际上想重用代码而不是重用结果(但如果可能的话重用结果会更好)
  • 其实查询不是那么动态的,它没有变化,只有参数是

标签: sql oracle plsql reusability


【解决方案1】:

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

【讨论】:

  • 这种方法在多用户环境中是否有效?我的意思是当多个用户同时调用包装所有这些查询的函数时?
  • 我认为不适合 - 所以可能不适合您的要求。
【解决方案2】:

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

请参阅此处查看good article,了解更多示例。

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

【讨论】:

  • 是的,它看起来是目前为止最好的主意,但它使用起来很麻烦,声明额外的结构,处理异常......,我实际上需要一些更简单的东西,在语义层面,只是为了更好地重用代码
【解决方案3】:

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

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
....

【讨论】:

  • 是的,我可以这样做,但我实际上并没有完成太多,因为第一个查询的大部分代码将被复制到所有查询中......很多粘贴......目标是尽可能重用代码并将其包含在第一个查询中...我还必须提到 p* 是我可以在运行时注入的变量..与后续查询无关
  • 我不明白为什么需要复制大部分代码 - 为什么不只是过滤器and col1 = p1 and col2 = p2 and col3 = p3
  • 该视图不使用参数/过滤器,因此在后续使用视图时应引入这些过滤器/参数;因此,在视图的所有用途中,还应该添加引用这些参数(a、b、c)的过滤器并添加连接条件,因此最终只能重用视图的“静态”过滤...
【解决方案4】:

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

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

【讨论】:

  • 这是一个重用的想法,但它缺乏性能,因为你必须手动逐行遍历光标,而不是以某种方式将光标连接到另一个 sql,以便机器可以执行最佳加入
猜你喜欢
  • 2012-02-25
  • 2011-05-12
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多