为什么SET DEFINE OFF不适用于冒号(:)字符?

时间:2017-05-09 17:32:53

标签: oracle sqlplus

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

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

我相信这种情况正在发生,因为我有一些更新语句,其中包含字符串中的冒号:

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

所以它将它们视为绑定变量。我的印象是SET DEFINE OFF会使得它在引用的字符串中将任何内容视为字符而不解释其中的任何内容,包括感知的绑定变量。

显然事实并非如此 - 所以在这种情况下,我该怎么做?我必须手动逃避这些吗?

感谢。

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

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

2 个答案:

答案 0 :(得分:1)

Set Define Off是一个SQLPlus命令,它可以防止SQLPlus将&视为特殊字符。 &也特定于SQLPlus,并且没有任何意义。

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

另一方面,:是真正的绑定变量,只有Oracle SQL引擎才能识别并查找要绑定的值。 SQLPlus不会将:识别为绑定元字符,并将其作为SQL引擎传递给它。

答案 1 :(得分:0)

我无法复制您的问题。我创建了一个名为dually的表,其中包含一个单个字符的列。当我尝试运行update语句时,不允许替换。

SQL> UPDATE brianl.dually
  2         SET dummy   = ':x';
       SET dummy   = ':x'
                     *
ERROR at line 2:
ORA-12899: value too large for column "BRIANL"."DUALLY"."DUMMY" (actual: 2,
maximum: 1)

您是否尝试过连接?

UPDATE ADDRESS SET ADDRESS_STREET_LINE1 = 'Moh' || ':' || Chandawala'