一尘不染

无法使用ISQL命令创建Informix存储过程?

sql

我无法建立在IBM Informix Dynamic
Server的版本10.00.FC9此存储过程(见乔纳森·莱弗勒的答案,这个职位在这里使用从Informix SQL的“ISQL”命令)。

(对于他附近的两个示例,我在char上均出现错误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;

前任。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;

它们是由Jonathan Leffler(Informix
Magician非凡的专家)设计的,旨在解决我在链接文章中提出的问题。预期的返回结果是将保存军事时间的INT数据类型转换为2:30 pm类型的格式。


阅读 266

收藏
2021-03-17

共1个答案

一尘不染

此问题是DB-Access与ISQL。

ISQL具有一种扭曲的幽默感,并认为SQL的语法仍与Informix OnLine 4.10(或当时的INFORMIX-OnLine
4.10)保持一致。具体来说,它不知道存储过程是由多个用分号分隔的语句组成的,并且错误地假定SQL语句以第一个分号结尾而不是字符串或注释。

解决方法:

  • 使用DB-Access代替ISQL创建存储过程。
  • IIUG软件存档中获取SQLCMD并改用它。
  • 使用SQLCMD软件中的’mkproc’创建存储过程。

其中,最简单的方法是使用DB-Access(又名dbaccess-在服务器软件所在的$ INFORMIXDIR / bin中找到)。

2021-03-17