4

我正在查询一个 oracle 9i 数据库:

SELECT * FROM table WHERE column LIKE '%' || '一些文本' || '%' 逃脱 '\';

它失败并出现错误“转义字符必须是长度为 1 的字符串”(ORA-01425 错误),而在 oracle express 10g 数据库中成功。

将其设置为双反斜杠 (ESCAPE '\\') 可以解决 oracle 9i 数据库的问题,但会为 10g 数据库生成相同的 ORA-01425 错误。

我无法编辑 SQL,因为它是通过 Telerik OpenAccess ORM 自动生成的。

导致上述 SQL 的 Linq 代码是:

activity.Name.Contains.("someText")

我希望两个数据库都处理 ESCAPE '\'... 或者,有另一种按名称或描述搜索表项的方法。

提前致谢!

4

5 回答 5

2

不熟悉 Linq,但我对您在哪里执行查询有点困惑 - 您是否只是将生成的代码粘贴到针对两个数据库运行的 SQL*Plus 中,至少可以解释这种行为?

如果您在 SQL*Plus 中执行此操作,请show escape在每个环境中执行;我怀疑 9i 会报告escape "\" (hex 5c),而 10g 会报告escape off。这可能表明先前已在 9i 实例中设置了转义处理,但在(可能是较新的)10g 实例中未设置。

如果到目前为止任何这些都证明是相关的,请尝试set escape \在 10g 会话中执行并\\再次尝试该版本。并在 9i 中尝试做escape off并尝试那里的单一\版本。两者现在都应该工作。

假设你还在我身边,下一个问题是为什么 9i 有这个设置;可能有一个 login.sql 或 glogin.sql 文件自动设置它。只要不影响其他任何内容,您就可以将其删除,以允许生成的代码不加更改地运行。

如果您要以其他方式执行代码,我认为所有这些都无关紧要。不确定您是否只是在 SQL*Plus 中测试和调试生成的代码,最终会在其他地方执行它(再次缺乏 Linq 知识),在这种情况下,无论如何这可能是一个暂时的问题。

我也不确定你到底在逃避什么......

于 2010-09-15T20:22:53.077 回答
1

它是否对每个输入或特定字符串都失败?问题可能不在于查询,而在于输入。如果有奇数个反斜杠,Oracle 可能会尝试转义不需要转义的内容。

例如,这是有效的,因为它正在转义“%”:

select * from dual  where 'test' like '%'||'\'||'%' escape '\';

但这失败了,因为它试图逃避不需要转义的“a”:

select * from dual  where 'test' like '%'||'\a'||'%' escape '\';

您可以在将字符串传递给函数之前修改字符串并修复奇怪的反斜杠吗?

于 2010-09-16T02:32:31.497 回答
1

万一有人遇到同样的问题......我的问题是我正在处理“NVARCHAR2”字段。我在 oracle 论坛中收到了有关此问题的帮助 :)

这个查询: select * from dual where 'dummy' like '%' escape '\';

两者都适用,因为“虚拟”字段是 varchar2。如果它是 nvarchar2,查询中可能(仅可能!)导致问题的部分将是“转义 '\'”部分(我的 oracle 9i 想要转义 '\',我的 oracle 10g 想要 '\\')。

为了克服这个问题,我没有使用 ORM 的自动生成代码,而是编写了一个存储过程(仅在我搜索字符串时),我在其中处理 nvarchar2 字段,如下所示: where TableName.ColumnName like N'%' || '一些文本' || N'%' 转义 N'\'

它工作正常:)

然而,这并不能解释如何拥有相同的 NVARCHAR2 列和相同的 SQL 查询,如何通过两个 oracle 服务器(我本地 PC 上的 10g express 和 9i)对它们进行不同的处理——这仍然是一个问题。因此,对于遇到类似问题的任何人,最好知道它是否是 nvarchar2 问题(我不知道这可能是一个问题),并尝试解决它。

于 2010-10-22T10:40:11.340 回答
1

尝试:

  SELECT * FROM TABLENAME 
  WHERE COLUMNNAME LIKE '\%' ESCAPE '\';

通常 LIKE 中的 ESCAPE 符号用于允许搜索符号 '%' 和 '_'

于 2010-09-02T11:11:23.910 回答
1

您可以完全避免反斜杠问题。尝试在转义字符周围使用花括号。

http://download.oracle.com/docs/cd/B10500_01/text.920/a96518/cqspcl.htm

于 2010-09-03T20:36:07.823 回答