关于sql:无法使用ISQL命令创建Informix存储过程?

Can't create Informix stored procedure using ISQL command?

我在使用InformixSQL的"i sql"命令在IBMInformixDynamicServer10.00.fc9版本上创建这个存储过程时遇到了问题(请参阅本文中JonathanLeffler的回答)。

对于他在RETURNING CHAR(8)附近的两个例子中的每一个,我都得到一个关于(字符的错误。

第1章:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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章:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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类型的格式。


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

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

解决方法:

  • 使用db access而不是isql来创建存储过程。
  • 从IIUG软件存档中获取sqlcmd并使用它。
  • 使用sqlcmd软件中的"mkproc"创建存储过程。

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