2016-11-17 107 views
-2

我对PL/SQL非常陌生,最近我创建了一个新程序,它似乎可以正确编译,但是当我执行该程序时,它不显示任何内容。PLSQL BETWEEN过程不起作用

我想要完成的是选择带有受影响的两个输入之间的房屋的最大数量的邮政编码,这些输入是outage_start_time timestamp,outage_end_time时间戳。

表: OUTAGE_ID,OUTAGE_START,OUTAGE_END,OUTAGE_ZIPCODE,OUTAGE_STATUS,HOUSES_AFFECTED

步骤:

create or replace procedure start(outage_start_time timestamp, outage_end_time timestamp) 
as 
    Cursor test is 
    select outage_zipcode 
    from outage 
    where HOUSES_AFFECTED in (select max(HOUSES_AFFECTED)from outage) 
    and outage_start_time between outage_start and outage_end 
    and outage_end_time between outage_start and outage_end; 
average varchar(256); 
BEGIN 
    Open test; 
    Loop 
    fetch test into average; 
    exit when test%notfound; 
    dbms_output.put_line(average); 
end loop; 
end; 
+0

你在这里写的程序是不完整的。请提供全文。 – Dmitry

+0

更新了整个过程 – user2402107

+0

您是否正在运行sqlplus,并且您是否在运行之前设置了SERVEROUTPUT ON? (即尝试编写一个只写出“hello world”的程序,并确保它适用于您;然后确保您的查询实际返回结果,...) – Glenn

回答

0

考虑到您的意见,我可以假设你average变量包含NULL值。在SQL * Plus中,它看起来像一个空行。为了确保您可以添加一些输出:

dbms_output.put_line('average value is: ' || average); 

甚至

dbms_output.put_line('average value is: ''' || average || ''''); 

最后一个,当你需要区分空间符号(S)NULL价值是非常好的。

average由于查询返回无行,因此变量可能为空。为什么 - 这是你的数据问题。

+0

我认为完全一样的东西,但有一些奇怪的事情,我有其他游标(上面没有显示)在同一过程中,当我添加这个游标,他们不输出了。就像这个光标打破它。没有“测试”游标,它们按预期工作。 – user2402107

+0

@ user2402107如果您需要任何其他帮助,则必须提供有关如何重现此行为的信息。现在我不能说别的。有了这些新的信息,这是一个不同的问题。也许你有'exception'部分,它会隐藏错误?也许查询的结果取决于先前执行的结果? – Dmitry

+0

我想我最好的问题是,你认为上面的select查询在语法上是否正确,并且应该根据逻辑做它想要的行为? – user2402107

0

您的查询不会返回任何行。运行此:

select outage_start, outage_end 
    from outage 
where HOUSES_AFFECTED in (select max(HOUSES_AFFECTED)from outage) 

,并检查是否有针对这两种OUTAGE_START_TIME和OUTAGE_END_TIME,它传递给你的程序,下跌outage_start和outage_end之间的任何记录。我很确定没有这样的记录。请记住,如果outage_start或outage_end为null,那么您的WHERE条件未满足。

0

没有样本数据和预期的结果/输出几乎不可能知道你真的在寻找什么。

我会先开发适当的查询。也许这会有所帮助:

SELECT DISTINCT 
     outage_zipcode 
FROM (
      SELECT 
        MAX(HOUSES_AFFECTED) over(partition by 1) as MX 
       , HOUSES_AFFECTED 
       , outage_zipcode 
      FROM outage 
     AND ( %1 BETWEEN outage_start AND outage_end 
      OR %2 BETWEEN outage_start AND outage_end 
      ) 
    ) 
WHERE HOUSES_AFFECTED = MX 
; 
+0

我想要完成的是选择带有最大受影响房间的两个输入之间的邮政编码,这些输入是outage_start_time时间戳,outage_end_time时间戳。 – user2402107

+0

我改变了上面的wuery。我的建议的重点在于你写出一个可以工作并产生正确结果的查询,生成一个过程。您在现有查询中遇到的一个问题是,最大计算工作量由日期过滤,因此您可能偶尔会找到匹配项。首先在wuery上工作。得到那个权利。然后让它成为一个程序。 –