对于Informix,SQLCMD版本输出对于不同的RHEL版本是不同的

时间:2018-04-27 17:00:28

标签: informix

我们正在使用" sqlcmd"用于使用Informix DB。我们的脚本使用" info列为"命令提取列并准备/运行查询。

然而,转移到RHEL7,最新版本的SQLCMD将会出现不同的输出模式。

Eg: RHEL6
$ echo "info columns for <table>" | dbaccess 2>&1 | head
1|<column 1>|258|4|0
2|<column 2>|7|4|0
3|<column 3>|0|2|0
... etc

RHEL7
$ echo "info columns for <table>" | dbaccess 2>&1 | head
colno              1
colname            <column 1>
coltype            258
collength          4
extended_id        0

colno              2
colname            <column 2>
coltype            7
collength          4

版本如下:

RHEL 6
$ dbaccess -V
dbaccess: SQLCMD Version 87.00 (2010-10-21)
IBM Informix CSDK Version 3.50, IBM Informix-ESQL Version 3.50.FC7
GNU Readline 6.0
(C) Copyright Jonathan Leffler 1987-2010
Licenced under GNU General Public Licence Version 2

RHEL 7
$ dbaccess -V
dbaccess: SQLCMD Version 90.02 (2016-07-28)
IBM Informix CSDK Version 4.10, IBM Informix-ESQL Version 4.10.FC2DE
GNU Readline 6.2
(C) Copyright Jonathan Leffler 1987-2016
Licenced under GNU General Public Licence Version 2

我们是否有解决方案使sqlcmd向后兼容?这是一些国旗驱动?我们必须支持RHEL6和RHEL7。

1 个答案:

答案 0 :(得分:1)

我只是轻度偏见 - 我写了SQLCMD (1)

您在版本90.02中显示的输出反映了“&#39;块”的添加。模式输出格式更好地模拟DB-Access,当您通过名称sqlcmd使用dbaccess时,默认情况下会启用该格式。

所以,是的,行为改变了。 SQLCMD 90.02现在比87.00更接近模拟DB-Access。

问题也与RHEL 6与RHEL 7没有直接关系;它与SQLCMD的版本有关。

我不确定是否有一种简单的方法可以恢复原来的行为。使用dbaccess -F select stores -并不会覆盖现代版本中的默认值;以命令运行format select;。这是一个轻微的麻烦,但并不完全令人惊讶。我希望在命令行参数处理的其余部分之前设置名称dbaccess隐含的格式模式,以便命令行选项覆盖隐含格式。通过dbaccess -C运行SQLCMD会将其恢复为sqlcmd模式,但这意味着它不会像DB-Access那样解释数据库名称和文件名参数。 (例如,在dbaccess模式下,如果您不首先添加.sql扩展名,则会在文件名中添加sqlcmd扩展名,如DB-Access所做的那样; -d不这样做。)

最好的&#39;解决方案是修改脚本以直接使用SQLCMD。但是,这意味着更改的不仅仅是命令名称;您必须在数据库名称前添加.sql,并在文件名中添加SQLCMD_FORMAT个后缀。

可以更改SQLCMD以添加一个环境变量,例如select,如果未在命令行上显式覆盖,则该变量生效。将其设置为.sqlcmdrc将恢复旧的输出格式。另一种可能性是添加对包含要在启动时执行的命令的jlss.h文件的支持。我不相信我想补充一点。

我建议通过电子邮件(请参阅SQLCMD文档或我的SO资料)与我联系,讨论从这里发生的事情 - 请在主题行中包含SQLCMD。

顺便提一下,作为一个短期的解决方法,在RHEL 7上使用SQLCMD 87.00没有什么可以阻止你的。或者,你可能会发现你需要编辑memmem()删除或更新const的声明 - 它在87.00代码中,因为我当时并不知道该功能在某些平台上可用 - 它既不是C11也不是POSIX 2017的一部分。 从返回类型中删除{{1}}。当我使用GCC 7.3.0在macOS 10.13.4(High Sierra)上编译87.00时,我得到了一些其他的编译警告,但它们并没有坏处(不管它们是多么不合适)。但是,2010年的代码并不一定能在更现代的系统上进行干净的编译。

(1)该链接可能需要向IIUG注册。这是免费的,并不需要大量的电子邮件 - 通常每周少于一封,我估计 - 除非您选择订阅某些讨论渠道。