2

我在使用 Informix SQL 中的“isql”命令在 IBM Informix Dynamic Server 版本 10.00.FC9 上创建此存储过程时遇到了麻烦(请参阅 Jonathan Leffler 对本文的回答

(对于他附近的两个示例中的每一个,我都在字符上遇到错误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 extraordinaire)设计,旨在解决我在链接帖子中提出的问题。预期的返回是将保存军事时间的 INT 数据类型转换为 2:30 pm 类型格式。

4

1 回答 1

2

这个问题是 DB-Access 与 ISQL。

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

解决方法:

  • 使用 DB-Access 而不是 ISQL 创建存储过程。
  • IIUG Software Archive获取 SQLCMD并改用它。
  • 使用 SQLCMD 软件中的“mkproc”创建存储过程。

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

于 2009-10-20T18:00:46.790 回答