2012-10-04 34 views
0

基本上我有一个视图,它具有以下查询作为视图的一部分。我需要在oracle视图中声明一个变量

SELECT site_id ch_site_id 
    FROM bfg_router_pi_details 
WHERE last_modified_date > (SELECT MAX (last_time_stamp) 
           FROM saa_bfg_feed_ctl) 

现在,在这个查询bfg_router_pi_details是在另一个数据库的视图和saa_bfg_feed_ctl是在同一数据库中的表从我们射击这个查询。

现在当这个查询像上面在where子句中使用内部查询一样被触发时,它需要2个小时才能完成,因为它正在通过db链接。但是,如果我用实际日期值替换内部查询需要2分钟。所以我试图查看是否有任何方法可以在视图中定义变量并将最后的时间戳值赋予该变量,然后在查询的where子句中替换该变量,以便执行变得更快。希望你能理解这个问题。

回答

1

有很多方法如何做到这一点,但肯定都需要plsql编程。最简单的方法是创建一个包,其中在查询视图之前分配了MAX的变量。 这样的观点看起来像

begin 
SELECT MAX (last_time_stamp) 
into your_package.your_variable 
FROM saa_bfg_feed_ctl 
end; 

可能是你需要NO_DATA_FOUND,但它不是我的茶

SELECT site_id ch_site_id 
    FROM bfg_router_pi_details 
WHERE last_modified_date > your_package.your_variable 

您可以通过同样的方式使用用户PLSQL上下文的杯子,请考虑一下原文档 - http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

+1

+1但是,您的示例错误地暗示可以直接在SQL语句中引用包变量。您将需要编写一个函数来检索值。 –

+0

感谢您指出。这就是为什么我也提到了上下文。 –

2

这可能是因为Oracle选择远程站点作为查询的驱动站点。试试这个提示来告诉它从本地站点运行查询:

SELECT /*+DRIVING_SITE(saa_bfg_feed_ctl) */ 
     site_id ch_site_id 
FROM bfg_router_pi_details 
WHERE last_modified_date > (SELECT MAX (last_time_stamp) 
          FROM saa_bfg_feed_ctl) 

我不是这个把我的头顶部肯定100% - 如果你发布一个计划,您的查询可能能够进一步帮助。