我需要在oracle视图中声明一个变量

时间:2012-10-04 07:08:22

标签: 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个小时才能完成。但是,如果我用实际日期值替换内部查询,则需要2分钟。所以我试图看看是否有任何方法可以在视图中定义变量并将最后一个时间戳值分配给该变量,然后在查询的where子句中替换该变量,以便执行变得更快。希望你能理解手中的问题。

2 个答案:

答案 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%肯定这一点 - 如果您发布查询计划可能会有所帮助。

答案 1 :(得分: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