【问题标题】:how to use set define off in liquibase sql format如何以 liquibase sql 格式使用 set define off
【发布时间】:2017-06-13 15:59:54
【问题描述】:

我有一个要存储在数据库中的 HTML 文件。我为此使用 Liquibase,但在 HTML 中我有很多   实例。

问题是SQL不允许&在没有set define off选项的情况下运行。

我从网上了解到以下解决方案:

  • 我读到我可以使用cdata,但这里我插入的是 Liquibase SQL 格式的 HTML,而不是 XML 格式,所以我认为它没有用。
  • 由于文件中有很多 ,我不能为每个都使用ASCII字符来避免&

Liquibase 执行出错:

SEVERE 6/7/17 11:30 AM:liquibase: Error executing SQL set define off
java.sql.SQLException: ORA-00922: missing or invalid option

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)

我能做些什么来解决这个问题?

【问题讨论】:

  • SQL*Plus(和 SQL Developer)默认情况下会特别对待与符号,用于替换变量,并且他们有 set define 命令来控制该行为。这与 SQL 无关。其他客户可能会模仿这种行为。您是否真的遇到了 Liquibase 问题,如果是,您可以编辑您的问题以显示实际发生的情况吗?
  • @Alex,我添加了 liquibase 错误日志
  • 对,因为set define off is a SQL*Plus client command。如果您从脚本中删除它,Liquibase 是否真的会抱怨您插入的数据 - 它是否与 & 符号有问题?
  • @Alex,我尝试在 SQL 开发人员中执行查询,但它没有执行并要求替换变量。对于 Liquibase,我没有尝试过不设置定义的查询。你的意思是,Liquibase 将在没有它的情况下执行查询?要不要试试?
  • SQL Developer(和 SQL*Plus,ans SQLcl)有替换变量的概念,并且有 set define 命令来控制这些。所以你需要为那些关闭它。 Liquibase 不一样,该命令在那里不相关。当然,在没有 set define off 的情况下在 Liquibase 中尝试一下。

标签: html oracle liquibase


【解决方案1】:

Liquibase 抱怨的set define off 不是SQL,it is a SQL*Plus client command

设置定义[INE] {& | c |开 |关闭}

将用于替换变量前缀的字符设置为 c。

ON 或OFF 控制SQL*Plus 是否将扫描命令以查找替换变量并用它们的值替换它们。 ON 将 c 的值更改回默认的 '&',而不是最近使用的字符。 DEFINE 设置为 OFF 会覆盖 SCAN 变量的设置。

SQL DeveloperSQLcl 也使用它。所有这些客户端都使用它来控制substitution variables 的行为。

Liquibase 显然无法识别该客户端命令,因此应将其从您的脚本中删除。

【讨论】:

  • Alex,感谢您的回复。从我的问题来看,我想使用 & nbsp;在查询但不使用 set define off 时,sql 执行抛出错误 java.sql.SQLException: ORA-01756:quoted string not proper terminate ,所以如果 Liquibase 忽略(set define off)我如何在 liquibase 中包含特殊字符,你呢知道什么吗?
  • @Khushi - 为什么你认为ORA-01756 与& 符号有关?听起来更可能与您处理单引号的方式有关。 (例如,您是否在脚本中转义了单引号以使其在 SQL Developer 中运行,而 Liquibase 也不需要这样做?或者在将脚本从 SQL Devleoper 移动到 Liquibase 时添加/错过了引号?很难猜到没有一个可重现的例子。见MCVE。)
  • 可能是由于分号在 与我得到的保证金相同的错误:0;但是当我改变它时,margin: 0' || CHR(59) || ' , 错误切换到具有   的下一行,相同的查询正在使用(设置定义关闭)在 sql 开发人员上工作。我不认为这是缺少单引号的问题。我不能使用'|| CHR(59) || ' 用于 nbsp 中的每个分号
  • 没有看到你在 Liquibase 中实际做了什么,很难说出发生了什么,听起来你要么没有正确传递字符串,要么 Liquibase 假设分号 - 即使在细绳?? - 是一个语句分隔符。也许问一个新问题,展示你在 Liquibase 中实际在做什么,并用一个小样本来演示这个问题。不过,这似乎与您最初的问题无关。
  • 感谢您的回复。是的,我同意问题的标题不符合我的要求。但我的问题描述说明了一切。我接受你的回答,这澄清了部分内容。
【解决方案2】:

作为 & 在 &(&)nbsp;被认为是 sql 中的替换变量,而 liquibase 忽略了 set define off 语句,所以我使用 ascii 字符在 liquibase 中定义的 sql 查询中使用 & 如下:

&(和号)nbsp;改为'|| '&' || 'nbsp' || CHR(59) || ' 并且查询有效

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2016-03-23
    • 2017-10-08
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多