具有 Select 的 Oracle 中变量的值在过程中无法解析

Value of variable in Oracle with Select Into not resolving during procedure

我的 table 中有一个 timestamp 列。我想获取 table 中第一个条目之后一分钟的所有条目。时间戳相对于主 ID 按时间顺序排列。

为此,我检索了 table 中的第一个条目,并将时间列的值放入一个变量中。然后我将一分钟添加到该值并使用新值创建一个新变量。使用这个新变量,我搜索小于调整时间戳的条目并检索该条目的 ID。

所以我的三个变量是v_timev_adjustedv_id

当设置v_time时,我有以下查询,

begin
    select time_of
    into v_time
    from MYTABLE where rownum=1
    order by id asc;
exception
    when no_data_found then
    v_time := null;
end;

对于v_adjusted我只是这样做,

v_adjusted := v_time + 1 / 1440.00;

设置的时候v_id我有,

begin
    select id
    into v_id
    from MYTABLE where time_of < v_adjusted and rownum=1 
    order by id desc;
exception
    when no_data_found then
    v_id:= null;
end;

这些操作没有return正确的结果。检索到的 ID 错误。我可以通过使用新的 timestamp 执行 query 来确认哪个 return 是正确的 ID。例如,在我的 table 添加一分钟应该 return id 19 但 v_id 的值是 1.

为什么我得到错误的结果?

您需要使用子查询:

begin
    SELECT id 
    INTO v_id
    FROM (select id
          from MYTABLE where time_of < v_adjusted
          order by id desc
    ) sub
    where rownum=1;
exception
    when no_data_found then
    v_id:= null;
end;

或简单的最大值:

begin
    select MAX(id)
    into v_id
    from MYTABLE where time_of < v_adjusted;
exception
    when no_data_found then
    v_id:= null;
end;

编辑:

使用 FETCH (Oracle 12c):

begin
    select id
    into v_id
    from MYTABLE where time_of < v_adjusted;
    ORDER BY id DESC
    FETCH FIRST 1 ROWS ONLY;
exception
    when no_data_found then
    v_id:= null;
end;