Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带变量的Oracle case语句_Oracle_Case_Ora 06550_Pls 00103 - Fatal编程技术网

带变量的Oracle case语句

带变量的Oracle case语句,oracle,case,ora-06550,pls-00103,Oracle,Case,Ora 06550,Pls 00103,我有一个要求,如果今天是星期一,运行一个查询,否则运行另一个查询。为此,我编写了下面的查询,但是我得到了下面的错误消息 DECLARE l_today_date VARCHAR2(15) := TO_CHAR(SYSDATE, 'DAY'); BEGIN CASE l_today_date WHEN 'MONDAY' THEN (SELECT st_time AS SYS_DATE, start_time

我有一个要求,如果今天是星期一,运行一个查询,否则运行另一个查询。为此,我编写了下面的查询,但是我得到了下面的错误消息

DECLARE
   l_today_date VARCHAR2(15) := TO_CHAR(SYSDATE, 'DAY');
 BEGIN
   CASE l_today_date
   WHEN 'MONDAY' THEN
     (SELECT st_time AS SYS_DATE,
       start_time                          AS JOB_START_TIME,
       COALESCE (end_job,'Job Is Running') AS JOB_END_TIME,
       CASE duration_job
         WHEN ' min'
         THEN 'Job is Running'
         ELSE duration_job
       END AS JOB_DURATION,
       CASE duration_job
         WHEN ' min'
         THEN 'Job is Running'
         ELSE 'Complete'
       END AS job_status
     FROM
       (SELECT name,
         st_time,
         ABS(floor(((((st_time - lag(end_time) over (order by end_time desc))*24*60*60)/3600)*3600)/60))
         || ' min' duration_job,
         TO_CHAR(st_time, 'hh24:mi:ss')      AS start_time,
         TO_CHAR(lag(end_time)over(order by end_time desc),'hh24:mi:ss') AS end_job
       FROM sc_stask
       WHERE name IN ( '111 has started' ,'111 has ended' )
       ORDER BY st_time DESC
       )
     WHERE name = '111 has started');
   ELSE
     (SELECT st_time                       AS SYS_DATE,
       start_time                          AS JOB_START_TIME,
       COALESCE (end_job,'Job Is Running') AS JOB_END_TIME,
       CASE duration_job
         WHEN ' min'
         THEN 'Job is Running'
         ELSE duration_job
       END AS JOB_DURATION,
       CASE duration_job
         WHEN ' min'
         THEN 'Job is Running'
         ELSE 'Complete'
       END AS job_status
     FROM
       (SELECT name,
         st_time,
         ABS(floor(((((st_time - lag(end_time)over(order by end_time desc) )*24*60*60)/3600)*3600)/60))
         || ' min' duration_job,
         TO_CHAR(st_time, 'hh24:mi:ss')      AS start_time,
         TO_CHAR(lag(end_time)over(order by end_time desc),'hh24:mi:ss') AS end_job
       FROM sc_stask
       WHERE name                      IN ( '111 has started' ,'111 has completed' )
       AND TO_CHAR(st_time,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY')
       ORDER BY st_time DESC
       )
     WHERE name = '111 has started'
     );
   END CASE;
   dbms_output.Put_line(l_today_date);
END;
这是我收到的错误消息

 Error report -
 ORA-06550: line 6, column 6:
 PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

    ( - + case mod new not null <an identifier>
    <a double-quoted delimited-identifier> <a bind variable>
    continue avg count current exists max min prior sql stddev
    sum variance execute forall merge time timestamp interval
    date <a string literal with character set specification>
    <a number> <a single-quoted SQL string> pipe
    <an alternatively-quoted string literal with character set specification>
    <an alternat
 ORA-06550: line 22, column 47:
 PLS-00103: Encountered the symbol "OVER" when expecting one of the following:

    . ( ) , * % & = - + < / > at in is mod remainder not rem =>
    <an exponent (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec as between || member submultiset
 06550. 00000 -  "line %s, column %s:\n%s"
 *Cause:    Usually a PL/SQL compilation error.
错误报告-
ORA-06550:第6行第6列:
PLS-00103:在预期以下情况时遇到符号“选择”:
(+case mod new不为空)
继续平均计数当前存在最大最小优先sql STDEV
对所有合并时间时间戳间隔执行求和方差
日期
管
at in为mod余数而非rem=>

或者!=或者~=>=不是
案例
,而是
如果

begin
  if to_char(sysdate, 'DAY') = 'MONDAY' then
     select ... query you run on monday;
  else
     select ... query you run otherwise
  end if;
end;
[编辑:为INTO子句添加了示例]

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_cnt number;
  3    l_today varchar2(10) := to_char(sysdate, 'DAY');
  4  begin
  5    if l_today = 'THURSDAY' then
  6       select count(*)
  7         into l_cnt          --> this
  8         from emp
  9         where deptno = 10;
 10    else
 11       select count(*)
 12         into l_cnt
 13         from emp
 14         where deptno <> 10;
 15    end if;
 16
 17    dbms_output.put_line('Today is ' || l_today || ' and count = ' || l_cnt);
 18  end;
 19  /
Today is THURSDAY  and count = 11

PL/SQL procedure successfully completed.

SQL>
SQL>打开服务器输出
SQL>
SQL>声明
2 l_cnt编号;
3 l_today varchar2(10):=to_char(sysdate,'DAY');
4开始
5如果l_今天=周四,那么
6选择计数(*)
7到l_cnt-->此
8来自emp
9,其中deptno=10;
10其他
11选择计数(*)
12到l_cnt
13来自emp
14凡第10条另有规定者;
15如果结束,则结束;
16
17 dbms|u output.put|u line('今天是'| | l| u今天',计数='| | l|u cnt);
18结束;
19  /
今天是星期四,计数=11
PL/SQL过程已成功完成。
SQL>

不是
案例
,而是
如果

begin
  if to_char(sysdate, 'DAY') = 'MONDAY' then
     select ... query you run on monday;
  else
     select ... query you run otherwise
  end if;
end;
[编辑:为INTO子句添加了示例]

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_cnt number;
  3    l_today varchar2(10) := to_char(sysdate, 'DAY');
  4  begin
  5    if l_today = 'THURSDAY' then
  6       select count(*)
  7         into l_cnt          --> this
  8         from emp
  9         where deptno = 10;
 10    else
 11       select count(*)
 12         into l_cnt
 13         from emp
 14         where deptno <> 10;
 15    end if;
 16
 17    dbms_output.put_line('Today is ' || l_today || ' and count = ' || l_cnt);
 18  end;
 19  /
Today is THURSDAY  and count = 11

PL/SQL procedure successfully completed.

SQL>
SQL>打开服务器输出
SQL>
SQL>声明
2 l_cnt编号;
3 l_today varchar2(10):=to_char(sysdate,'DAY');
4开始
5如果l_今天=周四,那么
6选择计数(*)
7到l_cnt-->此
8来自emp
9,其中deptno=10;
10其他
11选择计数(*)
12到l_cnt
13来自emp
14凡第10条另有规定者;
15如果结束,则结束;
16
17 dbms|u output.put|u line('今天是'| | l| u今天',计数='| | l|u cnt);
18结束;
19  /
今天是星期四,计数=11
PL/SQL过程已成功完成。
SQL>

问题在于括号;select语句周围不应该有括号:

DECLARE
   l_today_date VARCHAR2(15) := TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH');
 BEGIN
   CASE l_today_date
   WHEN 'MONDAY' THEN
     SELECT st_time AS SYS_DATE,
...
     WHERE name = '111 has started';
   ELSE
     SELECT st_time                       AS SYS_DATE,
...
     WHERE name = '111 has started';
   END CASE;
   dbms_output.Put_line(l_today_date);
END;
/
我还将可选的第三个参数添加到了
to_char()
,因此请确保日期名称是您正在搜索的日期名称;否则,如果有人在非英语会话中运行此名称,它将无法正确匹配


顺便说一句,如果您只使用了
l\u tdoay\u date
值一次,并且在最后没有
dbms\u输出
调试调用,那么您就不需要该变量;您可以在函数调用中使用
case

BEGIN
   CASE TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH')
   WHEN 'MONDAY' THEN
...
您可以在这里使用
if
而不是
case
——这两种方法都有效,但在本例中,如果只检查一个值,您可能不会从使用
case
中获得多少收益


您还可以使用单个查询,将case语句逻辑移动到其
where
子句中,类似于:

   FROM sc_stask
   WHERE name IN ( '111 has started' ,'111 has ended' )
   AND (TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'MONDAY'
     OR TO_CHAR(st_time,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY')
   )

尽管我通常会将最后一部分作为
或TRUNC(st_time)=TRUNC(SYSDATE)
来完成,而不是将两者都转换为字符串。无论如何,使用这种方法,您可能根本不需要PL/SQL块;如果您有它,那么正如@Littlefoot所提到的,您必须选择(其中一个)查询到某物。

问题在于括号;select语句周围不应该有括号:

DECLARE
   l_today_date VARCHAR2(15) := TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH');
 BEGIN
   CASE l_today_date
   WHEN 'MONDAY' THEN
     SELECT st_time AS SYS_DATE,
...
     WHERE name = '111 has started';
   ELSE
     SELECT st_time                       AS SYS_DATE,
...
     WHERE name = '111 has started';
   END CASE;
   dbms_output.Put_line(l_today_date);
END;
/
我还将可选的第三个参数添加到了
to_char()
,因此请确保日期名称是您正在搜索的日期名称;否则,如果有人在非英语会话中运行此名称,它将无法正确匹配


顺便说一句,如果您只使用了
l\u tdoay\u date
值一次,并且在最后没有
dbms\u输出
调试调用,那么您就不需要该变量;您可以在函数调用中使用
case

BEGIN
   CASE TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH')
   WHEN 'MONDAY' THEN
...
您可以在这里使用
if
而不是
case
——这两种方法都有效,但在本例中,如果只检查一个值,您可能不会从使用
case
中获得多少收益


您还可以使用单个查询,将case语句逻辑移动到其
where
子句中,类似于:

   FROM sc_stask
   WHERE name IN ( '111 has started' ,'111 has ended' )
   AND (TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'MONDAY'
     OR TO_CHAR(st_time,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY')
   )

尽管我通常会将最后一部分作为
或TRUNC(st_time)=TRUNC(SYSDATE)
来完成,而不是将两者都转换为字符串。无论如何,使用这种方法,您可能根本不需要PL/SQL块;如果您有它,那么正如@Littlefoot所提到的,您必须选择(其中一个)查询到某物。

两种方法都有效;如果
似乎是更明显的选择,则只检查一个值,但是大小写没有错。不过,您还删除了括号,这实际上是导致错误的原因*8-)事实上,@Alex,在这种情况下,这两种方法都是错误的-没有进入(或者我没有看到,或者我没有注意到其他事情),所以它们无论如何都会失败。请告诉我如何使用into命令,因为我没有创建表或临时表的权限。我只有执行查询的权限。我编辑了我的消息,并为into子句提供了一个示例。请注意,如果查询返回的行数超过一行,则必须执行不同的操作y(例如,循环并使用相同的输入,或返回一个refcursor,或…。@Littlefoot,正如您所看到的,我需要多个列,我已经创建了这些列作为变量并能够插入其中。但是当我试图检索这些变量的值时,我无法获取它。我尝试使用dbms_output.Put_line(v_status);但这是在scriptoutput选项卡中打印输出,而不是在query result选项卡中。splunk考虑到没有输出。此外,当我在splunk中尝试运行查询时,我得到以下错误java.sql.SQLException:ORA-06550:第1行第5列:PLS-00103:遇到符号“文件结束”当期望值时,两个选项中的任何一个都有效;只有一个值被检查
IF
似乎是更明显的选择,但是