【问题标题】:How to overcome lexical error while accessing mainframe via jdbc?通过jdbc访问大型机时如何克服词法错误?
【发布时间】:2012-06-06 12:49:04
【问题描述】:

我能够连接到 IMS 段并使用 where 子句中的主键执行 sql 查询并选择 * 查询。但是,每当我尝试对另一列进行选择时,都会出现词法错误。

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

这会给我异常 'Exception in thread "main" com.ibm.ims.jdbc.TokenMgrError: Lexical error at line 1, column 42. Encountered: "-" (45), after :" "'。如果我将列名作为名字,那么在名字中连字符的位置会出现词汇错误。我已经尝试通过 Prepared Statement 执行此操作,但它仍然无法正常工作。

进行以下更改后,我仍然遇到异常。 Select * from table where 'column-name'='something' 原因:com.ibm.ims.jdbc.ParseException:在第 1 行第 36 列遇到“”\'column-name\'“”。 期待其中之一: ... "(" ...

Select * from table where column+'-'+name='something' 带有'-'的词法错误异常

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

【问题讨论】:

  • 尝试用双引号将列名括起来。

标签: java sql jdbc mainframe


【解决方案1】:

在大多数 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 的 general 属性......在没有您实际使用的方言的任何细节的情况下。“大型机”SQL 可能是很多东西。)

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

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

@Rob 我都试过了,但没有成功。

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 我不能删除它,你能告诉我,如何引用它,我已经尝试过我的分享,但可能没有正确
  • @gizgok 在列中添加引号:Select * from table where 'column-name' = 'something',或者Select * from table where [column-name] = 'something'
  • SQL标准报价为",部分数据库使用`
猜你喜欢
  • 2016-06-17
  • 2014-08-21
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多