oracle - 为什么 SET DEFINE OFF 不适用于冒号 ( :) character?

标签 oracle sqlplus

我有一个试图通过 sqlplus 运行的脚本。在脚本的顶部,我设置了“SET DEFINE OFF”。但是,当我运行它时,我收到了这个错误:

SP2-0552:未声明绑定(bind)变量“CHANDAWALA”。

我相信这种情况正在发生,因为我有几个更新语句在字符串中包含冒号,如下所示:

UPDATE ADDRESS SET ADDRESS_STREET_LINE1 = 'Moh: Chandawala'...
UPDATE ADDRESS SET ADDRESS_STREET_LINE1 = 'Moh:chandawala'...

因此它将它们视为绑定(bind)变量。我的印象是 SET DEFINE OFF 会使它把引号字符串中的任何内容都视为字符,而不解释其中的任何内容,包括感知到的绑定(bind)变量。

这显然不是这种情况 - 那么在这种情况下,我应该怎么办?我必须手动转义这些吗?

谢谢。

编辑 - 在 When or Why to use a "SET DEFINE OFF" in Oracle Database 发布的问题对我没有帮助,因为那个人试图逃避变量替换的符号,而不是冒号作为绑定(bind)变量。我正在寻找一种方法来告诉客户忽略带引号的字符串中的任何内容(包括冒号)。

编辑 - 好的,听起来 Oracle 不应该将其解释为引号内的绑定(bind)变量。那么现在的问题是,它为什么要这样做?

最佳答案

Set Define Off 是一个 SQLPlus 命令,它防止 SQLPlus 将 & 视为特殊字符。 & 也是特定于 SQLPlus 的,在它之外没有任何意义。

defineon时,SQLPlus用实际值替换替换变量,然后将其传递给Oracle SQL引擎。

另一方面,: 是真正的绑定(bind)变量,只有 Oracle SQL 引擎才能识别并查找要绑定(bind)的值。 : 不被 SQLPlus 识别为绑定(bind)元字符,而是按原样传递给 SQL 引擎。

关于oracle - 为什么 SET DEFINE OFF 不适用于冒号 ( :) character?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43876365/

相关文章:

java - Hibernate Schema generation 是否可以在没有数据库连接的情况下生成DDL

c# - ORA-01460 触发器在 select 语句上不一致

.net - 为什么 OracleDataAdapter.Fill() 很慢?

Docker 上的 Oracle::ORA-12162: TNS:net 服务名称指定不正确

sql - 如何使用 SQL 打印出圣诞树?

sql - 在数据库中更新/插入/检索重音字符?

shell - 使用反引号时如何在 KornShell 脚本中保留空格?

database - Oracle 索引何时以及为何失效?

sql - 如何在 Oracle SQL Developer 中转义下划线?

oracle - 如何在 sqlplus 中显示错误