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

bybem2ql  于 12个月前  发布在  Oracle
关注(0)|答案(3)|浏览(139)

基本上,我有一个观点,这是有下面的查询作为一个视图的一部分。

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子句中替换该变量,以便执行得更快。我希望你能理解手头的问题。

ljo96ir5

ljo96ir51#

这可能是因为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%确定这一点关闭我的头-如果你张贴一个计划,为您的查询可能能够帮助进一步。

ajsxfq5m

ajsxfq5m2#

有很多方法可以做到这一点,但肯定所有这些都需要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

relj7zay

relj7zay3#

我知道这是一个旧的职位,但它是没有1在谷歌搜索结果,我从来没有使用过一个包,所以我制定了一个不同的方法使用CTE:

with my_variable as (SELECT MAX (last_time_stamp) as val
                           FROM saa_bfg_feed_ctl)

SELECT /*+DRIVING_SITE(saa_bfg_feed_ctl) */
       site_id ch_site_id 
FROM bfg_router_pi_details 
left join my_variable on val = val

WHERE last_modified_date > val

相关问题