2013-01-14 163 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