具有 Select 的 Oracle 中变量的值在过程中无法解析
Value of variable in Oracle with Select Into not resolving during procedure
我的 table 中有一个 timestamp
列。我想获取 table 中第一个条目之后一分钟的所有条目。时间戳相对于主 ID 按时间顺序排列。
为此,我检索了 table 中的第一个条目,并将时间列的值放入一个变量中。然后我将一分钟添加到该值并使用新值创建一个新变量。使用这个新变量,我搜索小于调整时间戳的条目并检索该条目的 ID。
所以我的三个变量是v_time
、v_adjusted
和v_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;
我的 table 中有一个 timestamp
列。我想获取 table 中第一个条目之后一分钟的所有条目。时间戳相对于主 ID 按时间顺序排列。
为此,我检索了 table 中的第一个条目,并将时间列的值放入一个变量中。然后我将一分钟添加到该值并使用新值创建一个新变量。使用这个新变量,我搜索小于调整时间戳的条目并检索该条目的 ID。
所以我的三个变量是v_time
、v_adjusted
和v_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;