代码之家  ›  专栏  ›  技术社区  ›  CheeseConQueso

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

  •  2
  • CheeseConQueso  · 技术社区  · 16 年前

    我在IBMInformix动态服务器10.00.fc9版本上创建这个存储过程时遇到了问题(请参阅JonathanLeffler对本文的回答)。 here )使用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;
    

    它们是由JonathanLeffler(InformixMagicianExtraordinaire)设计的,旨在解决我在链接帖子中提出的问题。预期的返回是将保存军事时间的int数据类型转换为2:30 pm类型的格式。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Jonathan Leffler    16 年前

    这个问题是数据库访问和ISQL。

    ISQL有一种扭曲的幽默感,认为SQL的语法仍然与InformixOnline4.10(或者,在当时,InformixOnline4.10)的当前语法相匹配。具体来说,它不知道存储过程由多个用分号分隔的语句组成,MIS假定SQL语句以第一个分号结束,而不是以字符串或注释结束。

    解决办法:

    • 使用db access而不是isql来创建存储过程。
    • 从获取sqlcmd IIUG Software Archive 用它来代替。
    • 使用sqlcmd软件中的“mkproc”创建存储过程。

    其中,最简单的方法是使用db access(也称为db access,位于服务器软件所在的$informisdir/bin中)。