Oracle脚本不返回任何行

时间:2015-06-23 22:59:34

标签: oracle powerbuilder

我有一个脚本,返回0行以获得准确的数据。我省略了第6或第7行脚本的工作原理。这个脚本在逻辑上是否有任何错误?

1 Select Max (seq_num)
2 From t_cap_history
3  Where pr_id_sak = :il_pr_id_sak
4     And re_unique_id=:locw_re_unique_id
5     And period_dte = :ll_period_date 
6     AND cap_from_dte = :ll_curr_from_date
7     And cap_to_dte = :ll_curr_to_date
8     And capitation_cde = :ls_cap_cde 

2 个答案:

答案 0 :(得分:0)

深深地凝视着我的水晶球......

如果cap_from_dtecap_to_dtedate类型的列,那么它们将具有日期组件和时间组件。即使您的会话未设置为显示时间组件,它也会在那里。您正在进行相等性比较,因此:ll_curr_from_date:ll_curr_to_date绑定变量需要与表中的数据完全匹配。我猜你的SQL * Plus会话设置为默认情况下不显示date值的时间部分,这会导致你为绑定变量传递错误的值。

假设您的绑定变量是时间组件为午夜(默认值)的日期,您可以使用不等式,这通常使优化器更容易在日期列上使用索引

Select Max (seq_num)
  From t_cap_history
 Where pr_id_sak = :il_pr_id_sak
   And re_unique_id=:locw_re_unique_id
   And period_dte = :ll_period_date 
   AND cap_from_dte >= :ll_curr_from_date
   AND cap_from_dte <  :ll_curr_from_date + 1
   And cap_to_dte >= :ll_curr_to_date
   And cap_to_dte < :ll_curr_to_date + 1
   And capitation_cde = :ls_cap_cde 

或者您可以使用trunc功能将时间组件设置为午夜

Select Max (seq_num)
  From t_cap_history
 Where pr_id_sak = :il_pr_id_sak
   And re_unique_id=:locw_re_unique_id
   And period_dte = :ll_period_date 
   AND trunc(cap_from_dte) = :ll_curr_from_date
   And trunc(cap_to_dte) = :ll_curr_to_date
   And capitation_cde = :ls_cap_cde 

答案 1 :(得分:0)

对于日期范围,为什么不

cap_to_dte >= :ll_curr_from_date AND cap_from_dte <= :ll_curr_to_date