oracle 此SELECT语句中需要INTO子句请提供有关此子句的帮助

j2cgzkjk  于 2022-12-03  发布在  Oracle
关注(0)|答案(1)|浏览(185)

我将在if条件传递中编写if语句,需要运行第一个select语句,否则运行第二个select语句。但它显示了此SELECT语句中应包含INTO子句,请帮助解决此问题

declare
x integer;
begin
select to_char(sysdate,'hh') into x from dual;
if x > 12 then
select sysdate from dual;
else
select sysdate+1 from dual;
end if;
end;
vddsk6oq

vddsk6oq1#

您在PL/SQL上下文中运行所有三个查询(在匿名PL/SQL块中,在beginend之间),因此它们都需要遵循PL/SQL规则。
这意味着它们都需要被选择到某个对象中(或被视为游标),因此需要一个日期变量来选择,然后需要对该变量执行一些操作:

declare
  x integer;
  d date;
begin
  select to_number(to_char(sysdate, 'hh24')) into x from dual;
  if x > 12 then
    select sysdate into d from dual;
  else
    select sysdate+1 into d from dual;
  end if;
  -- do something with the variable
  dbms_output.put_line(to_char(d, 'YYYY-MM-DD HH24:MI:SS'));
end;
/

请注意,我还将第一个查询更改为使用hh24元素,因为hh给出了12小时制的时间,该时间永远不会超过12。
实际上并不需要第一个查询,只需执行以下操作即可:

declare
  d date;
begin
  if to_number(to_char(sysdate, 'hh24')) > 12 then
    select sysdate into d from dual;
...

但是看起来您使用PL/SQL只是为了能够使用if/then/else结构,而if/then/else结构在普通SQL中是不可用的。但是它确实有case,所以正如@jarlh所说,您可以:

select
  case
    when to_number(to_char(sysdate,'hh24')) > 12
    then sysdate
    else sysdate + 1
  end as result
from dual;

select
  case
    when extract(hour from systimestamp) > 12
...

即使您将日期更改为明天,也会保留当前系统时间;您 * 可能 * 想要将时间设置为午夜,您可以使用trunc(sysdate)来实现这一点。
这个逻辑看起来也很奇怪,但还是不清楚您的意图; 00-12被修改为明天,13-23被保留为今天,这可能是反向的。如果您想将中午之后(包括中午)的任何时间视为明天,那么如果小时是12点或以上,您应该添加一天,因此00-11被保留为今天,12-23被修改为明天。如果这是您的意思,那么您可以执行以下操作:

select case
  when extract(hour from systimestamp) >= 12
  then trunc(sysdate) + 1
  else trunc(sysdate)
  end as result
from dual;

或者更简单地说,假设您不想保留运行的实际时间,您可以执行以下操作:

select trunc(sysdate + 12/24) as result
from dual;

fiddle

相关问题