如何通过jdbc访问大型机时克服词法错误?

时间:2012-06-06 12:49:05

标签: java sql jdbc mainframe

我能够连接到IMS段并使用where子句和select * queries中的主键执行sql查询。但每当我试图用另一列进行选择时,我就会出现词汇错误。

Select * from table where column-name='something'

这会在线程“main”com.ibm.ims.jdbc.TokenMgrError中出现异常'异常:第1行第42列的词汇错误。遇到:“ - ”(45),之后:“ “'即可。如果我将列名作为名字,那么词汇错误将出现在名字中连字符的位置。我已经尝试通过Prepared Statement这样做,它仍然无法正常工作。

完成以下更改后,我仍然会遇到异常。 从表中选择*,其中'column-name'='something' 引起:com.ibm.ims.jdbc.ParseException:在第1行第36列遇到“”\'column-name \'“”。 期待以下之一:      ...     “(”..

从表中选择*,其中列+' - '+ name ='something' 使用' - '

排除词汇错误

无效的转义序列(有效转义序列是\ b \ t \ n \ f \ r \“\'\),这是我在尝试添加反引号或某些转义序列时得到的消息。

2 个答案:

答案 0 :(得分:5)

在SQL的大多数方言中,-字符不是(无限制)标识符中的合法字符。例如,SQL-92 spec说:

     <identifier> ::=
          [ <introducer><character set specification> ] <actual identifier>

     <actual identifier> ::=
            <regular identifier>
          | <delimited identifier>

     <SQL language identifier> ::=
          <SQL language identifier start>
            [ { <underscore> | <SQL language identifier part> }... ]

     <SQL language identifier start> ::= <simple Latin letter>

     <SQL language identifier part> ::=
            <simple Latin letter>
          | <digit>

(TL; DR - 字母,数字和下划线)

(我毫不犹豫地说所有方言,因为SQL语言的动词与各种标准的偏差很大。)


  

这是否也适用于%,_我也可以看到一些允许使用%,_的转义序列的解决方案。提到的解决方案仍然不适用于连字符。参考:myitforum.com/cs2/blogs/jnelson/archive/2008/08/27/121684.aspx

首先,您找到的引用适用于字符串文字中的转义,而不是标识符名称中的转义。它不适用于这个问题。 (它适用于您的SQL方言吗?)

其次,根据上面的语法,如果您使用的SQL方言符合标准,则应在标识符中允许使用下划线。

第三,标准谈到“分隔标识符”(使用双引号字符作为分隔符)。我不知道这在真正的SQL方言中得到了多大的支持,但我想,即使它存在限制你可以使用哪些字符......以及其他警告。

第四,无论SQL标准说什么,您正在使用的特定方言的文档语法就是您应该关注的内容。 (我只是用它来说明SQL的一般属性...没有你实际使用的方言的任何细节。“大型机”SQL可能有很多东西。)

最后,最好不要在标识符中使用“时髦字符”。使用拉丁字母,数字和下划线...如果您的SQL方言甚至不允许,那么坚持它允许的内容。

阅读供应商的SQL文档!!!

  

@Rob我已经尝试了两种方法但它没有用。

仔细阅读供应商SQL文档。它应该告诉你什么会起作用。如果它说你不能这样做......好吧,你做不到。

答案 1 :(得分:2)

我怀疑您所谓的连字符被数据库解释为减号。

删除 - 或引用它,使其不被解释为减号。