2015-11-24 52 views
1

我在執行Informix中的存儲過程時遇到問題。我正在做一個簡單的查詢,它不起作用。這是查詢:「Order by」在控制檯中工作,但在存儲過程中不起作用

SELECT 
    first 1 field1, 
    date1 
FROM 
    historia_t 
WHERE 
    field3  = 1 
    AND field4 = 1 
    AND date1 BETWEEN (CURRENT - 1 UNITS YEAR) AND CURRENT 
ORDER BY 
    field1 desc 

如果我DBVisualizer工具中執行查詢,我沒有任何問題,但如果我執行在Informix中查詢(存儲過程)我得到的線sintaxis誤差「 AND date1 BETWEEN(當前 - 1年份)和當前「。但是真正的問題在ORDER BY field1 desc;

我不知道爲什麼,但有時存儲過程會在您使用Order by時錯誤地返回錯誤。

注意:字段發明是因爲我認爲它們對於這個問題並不重要。

感謝先進!

+0

如果我把FOR FOR EACH四捨五入的語句,查詢就起作用了。這就好像Informix希望得到幾個結果並迫使我將其放在FOR EACH中。我不明白它...... – Marquake

回答

3

當您通過DB-Access或同等方式運行SELECT語句時,程序將負責創建遊標,打開遊標,提取數據,關閉遊標以及釋放所用資源。

在存儲過程中,您必須管理此處理。 FOREACH循環會自動執行。如果您使用的是動態SQL,則可以使用其他語句。

如果SELECT語句可能返回多行,則需要使用遊標管理。如果SELECT語句只返回一行,則可以指定哪個變量應該接收結果。我注意到,當SELECT返回一行時,ORDER BY是無關緊要的 - 如果你有一個ORDER BY,那麼會強烈推測查詢可能返回多行。

例如,此存儲過程的工作原理(並返回syssynonyms):

create procedure fk2() returning varchar(128) as tabname; 
    define t varchar(128); 
    select tabname into t from informix.systables where tabid = 9; 
    return t; 
end procedure; 

但那裏的多行,你需要:

create procedure fk3() returning varchar(128) as tabname; 
    define t varchar(128); 
    foreach select tabname into t 
       from informix.systables 
      where tabid between 4 and 10 
      order by tabname # No semicolon permitted (don't ask!) 
     return t with resume; 
    end foreach; 
end procedure; 

這將返回:

syscolauth 
sysdepend 
syssynonyms 
syssyntable 
systabauth 
sysusers 
sysviews 
+0

在閱讀了所有的幾段時間後,我解釋了這個解釋。我不知道它是如何工作的,但它很奇怪,因爲它並不明確,儘管它很簡單。非常感謝@JonathanLeffler。 – Marquake

相關問題