我几次遇到这个问题。所以我很感兴趣的是,为什么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生成了insert语句。 coltype是TIMESTAMP。
一般来说,还有其他差异。例如声明 REORG TABLE TABLE_A仅适用于CLI,但不适用于Squirrel。
有人可以告诉我这种不同的行为来自哪里,是否有一些文件可以帮助我理解这些现象?
答案 0 :(得分:1)
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 timestamp
或db2 values current date
或db2 values current time
。
命令行中的编程(脚本)适用于管理员,因为您可以在同一脚本中自由混合Db2命令和SQL。您不能在java中直接执行 ,而只能通过存储过程间接执行此操作。
答案 1 :(得分:0)
表达式{ts '2018-04-16 17:03:22.066000'}
不是有效的SQL。但它是JDBC驱动程序的有效escape sequence。这就是为什么它在SQuirrel(使用JDBC)中工作但在本机客户端中不起作用的原因。
编写时间戳的便携式非接口依赖方式是:
timestamp '2018-04-16 17:03:22.066000'