DB2 通过客户端和 CLI 表现不同

DB2 behaves differently through client and CLI

这个问题我遇到过几次。所以我很好奇为什么 DB2 在从 Squirrel 和 CLI 执行相同的命令时表现不同。我正在使用 Windows 10 和 DB2 LUW 版本 9.7

我面临的这个特殊问题与时间戳格式有关:

当我 运行 它来自 Squirrel 但不是来自 CLI 时,此插入有效:

INSERT INTO TABLE_A(CREATION_TIME) VALUES ({ts '2018-04-16 17:03:22.066000'})

我使用 "Copy as SQL INSERT-VALUES statement" 从 Squirrel 生成了插入语句。 coltype 是 TIMESTAMP。

总的来说,还有其他的区别。例如语句 REORG TABLE TABLE_A 仅适用于 CLI,但不适用于 Squirrel。

有人能告诉我这种不同行为的来源吗?是否有一些文档可以帮助我理解这种现象?

表达式 {ts '2018-04-16 17:03:22.066000'} 无效 SQL。但它对 JDBC 驱动程序有效 escape sequence。这就是为什么它在 SQuirrel(使用 JDBC)中有效但在本机客户端中无效的原因。

一种可移植的、不依赖于接口的时间戳编写方式是:

timestamp '2018-04-16 17:03:22.066000'

REORG TABLE 在命令行工作但在 Squirrel (jdbc) 中不工作的原因是 REORG TABLE 不是 SQL。 jdbc 应用程序 运行 SQL,它们不直接 运行 Db2 命令。

但是,可以使用存储过程 SYSPROC.ADMIN_CMD 通过 jdbc 间接 运行 REORG。

您可以查看文档和示例 here

关于时间戳和日期文字值,命令行(bash/ksh/db2cmd.exe/ 或交互式 CLP)都接受 有效 时间戳文字。 命令行的时间戳文字如下所示 '2018-04-20-11.18.14.695148'

如果您想在命令行上查看格式:请在连接到数据库时使用 db2 values current timestampdb2 values current datedb2 values current time

命令行编程(脚本)适合管理员,因为您可以在同一个脚本中自由混合 Db2 命令和 SQL。您不能在 java 中 直接 执行此操作,只能通过存储过程间接执行此操作。