我正在尝试运行一个在其输出中包含静态列的查询。当我通过CLP运行select语句时,select语句有效,但是当我在shell脚本中执行它时,它不起作用:
su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,'','',COL2,'','',COL3L from MYTABLE fetch first 10 rows only"; db2 connect reset;'
当我运行它时,我得到的输出错误是:
SQL0104N An unexpected token "," was found following "select COL1,".
Expected tokens may include: "<select_sublist>". SQLSTATE=42601
SQL1024N A database connection does not exist. SQLSTATE=08003
我甚至尝试将select语句放在变量中并将其插入语句中,但仍然是相同的错误。任何帮助将不胜感激。 -Thx
答案 0 :(得分:2)
你应该像使用反斜杠一样转义单引号:
su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,\'\',\'\',COL2,\'\',\'\',COL3L from MYTABLE fetch first 10 rows only"; db2 connect reset;'
小心,我没有测试它......现在没有手头的外壳。
<强>更新强>
最后,我得到了一个DB2实例..经过一些测试后,我得到了它的工作。 事实证明,以前的语法是错误的。引用单引号的正确方法是(在这种情况下)'\'',如:
su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,'\'','\'',COL2,'\'','\'',COL3L from MYTABLE fetch first 10 rows only"; db2 connect reset;'
这是因为必须关闭整个命令的单引号('),以便为db2查询(\')中的单引号提供转义,然后重新打开以恢复命令引用(')。看起来很奇怪,它有效......
这是我用来测试它的命令:
bash -c 'db2 connect to mydb;db2 -x -v "select 1,'\'','\'',2,'\'','\'',3 from SYSIBM.SYSDUMMY1 fetch first 10 rows only"; db2 connect reset;'