在 Oracle 中使用引号运算符插入分号

Posted

技术标签:

【中文标题】在 Oracle 中使用引号运算符插入分号【英文标题】:Using the quote operator in Oracle to insert a semi-colon 【发布时间】:2017-10-20 01:32:00 【问题描述】:

我有以下 SQL 用于更新现有表中的 CSS,

SET DEFINE OFF;

UPDATE SCHEMANAME.template
   SET body = q'[
<style type="text/css">
  #header 
    background-color:#004F5D;
    height:100px;
    position:relative;
  ]'
WHERE name = 'CSS';

模板表的结构如下,

NAME    NOT NULL VARCHAR2(150)
SUBJECT NOT NULL VARCHAR2(4000)
BODY    NOT NULL CLOB
VERSION NUMBER(18)

但是,当我使用收到的 sqlplus 运行更新语句时,

ERROR:
ORA-01756: quoted string not properly terminated

SQL> SP2-0734: unknown command beginning "height:100..." - rest of line ignored.
SQL> SP2-0734: unknown command beginning "position:r..." - rest of line ignored.
SQL> SP2-0042: unknown command "]'" - rest of line ignored.

我正在使用,

SQL*Plus: Release 11.2.0.4.0 Production

对于甲骨文,

Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0  Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

在我看来,好像 sqlplus 对标题块内第一个声明末尾的分号字符感到不安。

我尝试过发布,

SET ESCAPE OFF

在运行更新语句之前,问题仍然存在。

我可以通过将 UPDATE 包装在 BEGIN-END 块中来解决此问题。 这是完成这项工作的唯一方法吗?

quote-operator 是否有 ';' 的问题在一个街区内?

【问题讨论】:

(这与级联样式表有什么关系?这是一个 SQL 问题,无论文本是 CSS 还是克林贡语……标签 css 已删除。) 只是在表格中插入 CSS,感谢您的编辑 CBroe.. 引号运算符对分号没有问题。相反,这是一个特定于 SQL*Plus 的问题。行尾的分号会给它带来麻烦,即使它在带引号的字符串中(q 引号机制或标准单引号没有区别)。 Toad 和 SQL Developer 没有这样的问题。如果您必须使用 SQL*Plus,请尽量避免在末尾使用分号;或逃避它;或使用 CHR(...) 代替分号。等等(谷歌的问题,你会发现其他的想法。) 感谢 mathguy,这是有道理的,过去我们曾使用过 CHR 解决方法。如果您将此作为答案,我会接受。 @CBroe:您可能刚刚添加了 [klingon] 标签。 :-) 【参考方案1】:

它似乎将您的更新声明分成 4 个部分 -

    UPDATE SCHEMANAME.template SET body = q'[ <style type="text/css"> #header background-color:#004F5D;

    height:100px;

    position:relative; ]'

你可以试试下面的查询

update SCHEMANAME.template
   SET body = '"'||chr(13)||'<style type="text/css">'||chr(13)||  '#header '||chr(13)||    'background-color:#004F5D;'||chr(13)||    'height:100px;'||chr(13)||  'position:relative;'||chr(13)||  '"'
WHERE name = 'CSS';

我使用 chr(13) 代替 quote ,换行。

【讨论】:

@mathguy 也提出了这个建议,并且成功了。我希望有一个“更好”的方法,但它看起来只是一个 SQLPlus 的东西。 @James ,正如 mathguy 建议的那样,您只需在更新字符串文字中单独使用 chr 作为分号。这也可以正常工作。

以上是关于在 Oracle 中使用引号运算符插入分号的主要内容,如果未能解决你的问题,请参考以下文章

Oracle OCP 官方PPT学习日志 使用 SQL SELECT 语句检索数据 01

随笔1104

Postgres无法将单引号和分号一起插入问题[重复]

在 perl 5.8.8 中模拟反引号运算符

Oracle 在 case 语句和插入中使用引号的区别

JS编程最佳实践