2009-10-20 35 views
2

我在使用Informix SQL中的「isql」命令在IBM Informix Dynamic Server 10.00.FC9(請參閱Jonathan Leffler對此帖子的回答here)上創建此存儲過程時遇到問題。無法使用ISQL命令創建Informix存儲過程?

我上(焦炭每個他的兩個例子,一個錯誤附近RETURNING CHAR(8)

前。 1:

CREATE PROCEDURE ampm_time(tm SMALLINT) RETURNING CHAR(8); 
    DEFINE hh SMALLINT; 
    DEFINE mm SMALLINT; 
    DEFINE am SMALLINT; 
    DEFINE m3 CHAR(3); 
    DEFINE a3 CHAR(3); 
    LET hh = MOD(tm/100 + 11, 12) + 1; 
    LET mm = MOD(tm, 100) + 100; 
    LET am = MOD(tm/1200, 2); 
    LET m3 = mm; 
    IF am = 0 
    THEN LET a3 = ' am'; 
    ELSE LET a3 = ' pm'; 
    END IF; 
    RETURN (hh || ':' || m3[2,3] || a3); 
END PROCEDURE; 

ex。 2:

CREATE PROCEDURE ampm_time(tm SMALLINT) RETURNING CHAR(8); 
    DEFINE i2 SMALLINT; 
    DEFINE hh SMALLINT; 
    DEFINE mm SMALLINT; 
    DEFINE am SMALLINT; 
    DEFINE m3 CHAR(3); 
    DEFINE a3 CHAR(3); 
    LET i2 = tm/100; 
    LET hh = MOD(i2 + 11, 12) + 1; 
    LET mm = MOD(tm, 100) + 100; 
    LET i2 = tm/1200; 
    LET am = MOD(i2, 2); 
    LET m3 = mm; 
    IF am = 0 
    THEN LET a3 = ' am'; 
    ELSE LET a3 = ' pm'; 
    END IF; 
    RETURN (hh || ':' || m3[2,3] || a3); 
END PROCEDURE; 

他們在努力解決,我問在鏈接後的問題設計的喬納森·萊弗勒(Informix的魔術師非凡)。預期的回報是將持有軍事時間的INT數據類型轉換爲2:30 pm類型的格式。

+0

鑑於您使用的是IDS 10.00,您可以很好地使用不帶i2變量的SP版本。請注意,ISQL的版本可能是7.32(甚至可能是7.31或7.30);目前的版本是7.50,而7.32並沒有太壞的過時。 –

+0

也許多數民衆贊成爲什麼我認爲informix是v7.3所有這一次...我一直在使用這個系統大約一年了,我不在乎版本,只要事情只是工作 – CheeseConQueso

+0

這可能是你爲什麼是困惑。這也是爲什麼當某人(如我)要求版本時,提供版本號信息有助於將事情變得透徹。 FWIW:升級到ISQL 7.50不能解決'isql不喜歡存儲過程'的問題。此外,請記住IDS 10.00現在是IDS最早支持的版本。你是最新版本之一,但IDS的升級應該在未來一年左右的計劃中。 –

回答

2

這個問題是DB-Access vs ISQL。

ISQL有幽默感,認爲SQL的語法仍然與Informix OnLine 4.10(或那時的INFORMIX-OnLine 4.10)的當前版本匹配。具體而言,它不知道存儲過程由多個由分號分隔的語句組成,並且錯誤地假設SQL語句以第一個分號結尾,而不是在字符串或註釋中。

解決方法:

  • 使用DB-訪問,而不是ISQL來創建存儲過程。
  • IIUG Software Archive獲取SQLCMD並使用它。
  • 使用SQLCMD軟件中的'mkproc'創建存儲過程。

其中,最簡單的就是使用DB-Access(又名dbaccess - 可在服務器軟件所在的$ INFORMIXDIR/bin中找到)。