Can't create Informix stored procedure using ISQL command?
我在使用InformixSQL的"i sql"命令在IBMInformixDynamicServer10.00.fc9版本上创建这个存储过程时遇到了问题(请参阅本文中JonathanLeffler的回答)。
对于他在
第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中)。