2013-01-14 55 views
1

我正在尝试创建一个SQL报告。这是选择语句:“case”的sql语句的奇怪行为

select 
    -- ticket id 
    '<tr align=left valign=top><td width=95>'||maspid||'</td>'|| 

    -- priority 
    case when instr(masfld017, '<|lang') = 0 then 
     '<td width=90>'||masfld017 
    else 
     '<td width=90>'||substr(masfld017, 1 , instrb(masfld017, '<|lang') - 1) 
    end||'</td>'|| 

    -- customer 
    '<td width=150>'||masfld007||'</td>'|| 

    -- status 
    '<td width=100>'||decode(masfld104, '0', 'Collected', 
      '1', 'Postponed', 
      '2', 'Accepted', 
      '3', 'in Progress', 
      '5', 'Work Around', 
      '7', 'Solved', 
      '8', 'Closed')||'</td>'|| 

    -- subject 
    '<td width=400>'||masfld001||'</td>'|| 

    -- full name 
    '<td width=100>' || replace(replace(masfld037, '<||>'), '</||>')||'</td>'|| 

    -- creation date 
    '<td width=150>'||to_char(to_date(masfld022, 'YYYYMMDDHH24MI'), 'DD.MM.YYYY HH24:MM')||'</td>'|| 

    -- target date 
    '<td width=150>'||to_char(to_date(masfld023, 'YYYYMMDDHH24MI'), 'DD.MM.YYYY HH24:MM')||'</td>'|| 

    -- ticket type 
    '<td width=180>'||decode(masfld040, '9', 'HUS', 
     '8', 'Project', 
     '7', 'Enhancement', 
     '6', 'Complaint', 
     '5', 'Change Request', 
     '4', 'Bug (Do not use)', 
     '3', 'Support', 
     '2', 'Service Request', 
     '1', 'Incident (Problem)', 
     null, 'N/A')||'</td></tr>' 
from 
     k2h.tmaster01 tm inner join k2h.tprofile tp on replace(replace(tm.masfld035, '<||>'), '</||>') = tp.propid 
where 
     masfld024 is null and 
     masfld082 = '&REGION' 

order by case masfld017 
     when 'Emergency'   then 1 
     when 'Critical'   then 2 
     when 'High'    then 3 
     when 'Major Problem'  then 4 
     when 'Major defect'  then 5 
     when 'Semi-major defect' then 6 
     when 'Medium'   then 7 
     when 'Minor Problem'  then 8 
     when 'Low'    then 9 
     end; 

如果我直接用sqldeveloper运行它,我得到一个结果列表。如果报告是由crontab中启动时,出现此错误消息:

SP2-0734: unknown command beginning "case when ..." - rest of line ignored. SP2-0734: unknown command beginning "' 

好像情况command不认可,但是为什么呢?

+0

请发布所有的sql语句。 – danihp

+0

@DanielHilgarth这不是在最初发布的代码中,它只包含'按顺序排列......' –

+0

我包括了整个声明。但为什么它与sqldeveloper一起工作?是的,这是执行相同的陈述。 – doonot

回答

3

是否有可能,在crontab中,你正在运行的SQL直接在外壳 如

sqlplus...<<ESQL 
select.. 
... 
order by case end; 

? 如果是这样,请删除空白行。

,否则你会得到这样的:

SQL> select 
    2 -- ticket id 
    3 '<tr align=left valign=top><td width=95>'||maspid||'</td>'|| 
    4 
SQL> -- priority 
SQL> case when instr(masfld017, '<|lang') = 0 then 
SP2-0734: unknown command beginning "case when ..." - rest of line ignored. 
+0

非常感谢,删除空白行工作。非常感谢你! – doonot

+0

我有同样的问题。一切都在SQL Developer中运行,但在sqlplus中失败。删除空行和缩进解决了这个问题。我的代码看起来不漂亮,但现在运行。 – enigmasck

0

由于某种原因,解析器似乎将case语句解释为PLSQL case语句,而不是SELECT语句语句。也就是说,它没有将表达式视为列的一部分,而是作为PLSQL语句的一部分。 “SP”错误消息引用SQL-Plus而不是语言本身。

我的猜测是select声明之上的内容令该脚本混淆不清。

3

我建议您从SQL命令删除的空间,甚至可能的意见和尝试。 SQL * Plus对嵌入在命令中的空格很挑剔。我甚至在使用double-dash注释和SQL * Plus脚本时遇到了问题。我认为这是空格,但如果是评论,请使用/* ... */评论风格。

+0

正确的答案,但@DanzzaL更快。 – doonot