【问题标题】:How do I ignore ampersands in a SQL script running from SQL Plus?如何忽略从 SQL Plus 运行的 SQL 脚本中的 & 符号?
【发布时间】:2010-09-12 04:52:57
【问题描述】:

我有一个 SQL 脚本,它创建一个包,其中包含一个与号 (&) 的注释。当我从 SQL Plus 运行脚本时,系统会提示我输入以 & 开头的字符串的替代值。如何禁用此功能以使 SQL Plus 忽略与号?

【问题讨论】:

    标签: sql oracle sqlplus


    【解决方案1】:

    这可能对你有用:

    set define off
    

    否则&符号需要在字符串的末尾,

    'StackOverflow &' || ' you'
    

    编辑:保存时我很高兴...这是从 blog 引用的。

    【讨论】:

    • 您也可以在 glogin.sql 站点配置文件设置文件或 login.sql 用户配置文件设置文件中指定此项
    • 如果您对替换变量不感兴趣,这是最简单的解决方案。
    • 永远是救生解决方案 :) 谢谢。
    【解决方案2】:

    如果您有时使用替换变量,您可能不想关闭定义。在这些情况下,您可以将 & 符号从其等效数字转换为 || Chr(38) || 中的值,或将其作为单个字符附加为 || '&' || 中的值。

    【讨论】:

    • 具体场景是一个包,它的源在注释中包含一个&。我不知道如何使用连接或替换。
    • JoshL,你是对的,我只是为了完整性而列出了这个。它与您的问题有关,即使它没有直接回答您的具体问题。
    • 它实际上帮助了我。
    【解决方案3】:

    我用下面的代码解决了:

    set escape on
    

    并在左侧的 & 旁边放一个 \ 'value_\&_intert'

    攻击

    【讨论】:

    • 这对我有用。我正在使用命令comment on column tablename.columnname is 'war ' || chr(38) || ' peace',但它给了我错误ORA-01780: string literal required
    【解决方案4】:

    您可以通过使用SET DEFINE <1_CHARACTER> 将执行脚本时查找的特殊字符设置为另一个值

    默认情况下,DEFINE功能本身是开启的,并且设置为&

    它可以被关闭 - 如前所述 - 但也可以通过将其设置为不同的值来避免它。非常清楚您将其设置为什么标志。在下面的示例中,我选择了 # 字符,但该选择只是一个示例。

    SQL> select '&var_ampersand #var_hash' from dual;
    Enter value for var_ampersand: a value
    
    'AVALUE#VAR_HASH'
    -----------------
    a value #var_hash
    
    SQL> set define #
    SQL> r
      1* select '&var_ampersand #var_hash' from dual
    Enter value for var_hash: another value
    
    '&VAR_AMPERSANDANOTHERVALUE'
    ----------------------------
    &var_ampersand another value
    
    SQL>
    

    【讨论】:

    • 我最近自己也使用过这种方法。我喜欢它,因为它不需要我更改 PL/SQL 包的内容。
    【解决方案5】:

    set define off

    我也试过了……

    设置定义 }

    我可以在文本中插入几条包含“&”字符的记录,但不能使用“}”字符 所以我决定使用“set define off”,一切正常。

    【讨论】:

      【解决方案6】:

      根据this nice FAQ 有几个解决方案。

      如果您可以修改评论,您还可以使用反斜杠字符 \ 转义与号。

      【讨论】:

      • 反斜杠转义在 SQL*Plus 或 SQLDeveloper 中不起作用
      • @JimTough 在用set escape on激活它之后会发生
      【解决方案7】:

      我有一个 CASE 语句,其中 WHEN column = 'sometext & more text' THEN ....

      我把它换成了 WHEN 列 = 'sometext' || CHR(38) || '更多文字' THEN ...

      你也可以使用 WHEN 列 LIKE 'sometext _ more text' THEN ...

      (_ 是单个字符的通配符)

      【讨论】:

        猜你喜欢
        • 2014-09-01
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 2010-12-17
        • 2016-07-19
        • 1970-01-01
        相关资源
        最近更新 更多