如何在没有双引号的情况下生成光滑的查询?

Posted

技术标签:

【中文标题】如何在没有双引号的情况下生成光滑的查询?【英文标题】:How can I have slick generates query without double quotes? 【发布时间】:2015-12-09 18:23:37 【问题描述】:

我正在尝试使用 Slick 与 Oracle DB 进行交互。映射为:

trait EntityTable extends DataBaseConfig

  import driver.api._

  class Log(tag: Tag) extends Table[LogEntity](tag,"LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME") 
    def id = column[Option[Long]]("LOG_ID",O.PrimaryKey,O.AutoInc)
    def log = column[String]("LOG_TEXT")

    def * = (LOG_ID, LOG_TEXT) <> ((LogEntity.apply _).tupled, LogEntity.unapply)
  
  protected val getLogs = TableQuery[Log]

从调试器中我看到生成的 SQL 是:

select "LOG_ID", "LOG_TEXT" from "LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME"

这给了我一个

ORA-00972: identifier is too long

还是有更好的方法来处理我无法控制的不同方案中的长表名?谢谢!

【问题讨论】:

【参考方案1】:

在 Oracle 中,名称(表、索引、视图)的长度不能超过 30 个字符。在你的例子中,我猜你有一个错误,而不是

"LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME"

试试这个:

"""LOG_SCHEMA"."A_TABLE_WITH_VERY_LONG_NAME"""

或者这个:

"\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\""

不管表是如何创建的,A_TABLE_WITH_VERY_LONG_NAME 不能超过 30 个字符。

【讨论】:

我使用了"""LOG_SCHEMA"."A_TABLE_WITH_VERY_LONG_NAME""",它生成了"select "LOG_ID", "LOG_TEXT" from "LOG_SCHEMA""。""A_TABLE_WITH_VERY_LONG_NAME"" “\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\"" 怎么样? 另一种选择是使用 LOG_SCHEMA 用户名连接到数据库,而您可以只使用“A_TABLE_WITH_VERY_LONG_NAME”,在这种情况下,您不必使用 schema_name 限定 table_name,或者为 LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME 创建一个 sysnonim 使用 "\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\"" ,它会产生 """LOG_SCHEMA"".""A_TABLE_WITH_VERY_LONG_NAME"""。我无法控制最初提到的 LOG_SCHEMA 用户名。

以上是关于如何在没有双引号的情况下生成光滑的查询?的主要内容,如果未能解决你的问题,请参考以下文章

Impala Shell 查询 -q 在字符串中带有双引号

printf() 在没有双引号的情况下工作,打印随机字符 [重复]

如何在不输入双引号的情况下制作搜索栏?

sql中单引号跟双引号有啥区别?分别用于啥情况?

SQL中啥情况下用引号

在没有插入操作的情况下在 html 文本区域中输入引号和双引号在数据库中失败。可能吗?