我正在使用:
查询oracle 9i数据库SELECT * FROM table WHERE列LIKE'%'|| 'someText'|| '%'ESCAPE'\';
并且失败并显示错误“转义字符必须是长度为1的字符串”(ORA-01425错误),同时在oracle express 10g数据库中成功。
使其成为双反斜杠(ESCAPE'\\')解决了oracle 9i数据库的问题,但为10g数据库生成了相同的ORA-01425错误。
我无法编辑SQL,因为它是通过Telerik OpenAccess ORM自动生成的。
导致上述SQL的Linq代码是:
activity.Name.Contains。( “SomeText” 则会)
我希望两个数据库都能处理ESCAPE'\'...或者,有另一种方法可以按名称或描述搜索表项。
提前致谢!
答案 0 :(得分:2)
不熟悉Linq但是我对你执行查询的位置感到有点困惑 - 你是否只是将生成的代码粘贴到针对两个数据库运行的SQL * Plus中,至少可以解释这种行为?
如果您在SQL * Plus中执行此操作,请在每个环境中执行show escape
;我怀疑9i会报告escape "\" (hex 5c)
,而10g会报告escape off
。这可能表明先前已在9i实例中设置了转义处理,但未在(可能是最近的)10g实例中设置。
如果到目前为止任何相关内容都是相关的,请尝试在10g会话中执行set escape \
并再次尝试\\
版本。并且在9i中尝试执行escape off
并在那里尝试单个\
版本。两者现在都应该有效。
假设你还在我身边,下一个问题是为什么9i有这个设置;可能有一个login.sql或glogin.sql文件自动设置它。您可以将其删除,只要它不会影响其他任何内容,以允许生成的代码不加改变地运行。
如果您要以其他方式执行代码,我认为这些内容都不相关;不确定你是否只是在SQL * Plus中测试和调试生成的代码,并最终在其他地方执行它(再次缺乏对Linq的了解),在这种情况下,这可能是一个短暂的问题。
我也不确定你到底在逃避什么......
答案 1 :(得分:1)
尝试:
SELECT * FROM TABLENAME
WHERE COLUMNNAME LIKE '\%' ESCAPE '\';
LIKE中的ESCAPE符号通常用于允许搜索符号'%'和'_'
答案 2 :(得分:1)
你可以完全避免反斜杠问题。请尝试使用转义字符周围的花括号。
http://download.oracle.com/docs/cd/B10500_01/text.920/a96518/cqspcl.htm
答案 3 :(得分:1)
每次输入或只是特定字符串都会失败吗?问题可能不在于查询,而在于输入。如果存在奇数个反斜杠,Oracle可能会试图逃避不需要转义的东西。
例如,这是有效的,因为它正在逃避'%':
select * from dual where 'test' like '%'||'\'||'%' escape '\';
但这失败了,因为它试图逃避'a',这不需要转义:
select * from dual where 'test' like '%'||'\a'||'%' escape '\';
你可以在传递给函数之前修改字符串并修复奇数反斜杠吗?
答案 4 :(得分:1)
如果有人因同样的问题而停下来......我的问题是我正在处理“NVARCHAR2”字段。我在oracle论坛上收到了关于这个问题的帮助:)
此查询:select * from dual where'dummy',如'%'escape'\';
适用于两者,因为字段'dummy'是varchar2。如果它是nvarchar2,查询中可能(仅可能!)导致问题的部分将是“escape'\'”部分(我的oracle 9i想要转义'\',我的oracle 10g想要'\\')。 / p>
为了解决这个问题,我没有使用ORM的自动生成代码,而是编写了一个存储过程(只有在我搜索字符串时),我在这里处理nvarchar2字段,其中TableName.ColumnName就像N'%' || 'someText'|| N'%'逃脱N'\'
它工作正常:)。
然而,这并没有解释如何使用相同的NVARCHAR2列和相同的SQL查询,两个oracle服务器(我的本地PC和9i上的10g表达式)处理它们的方式不同 - 这仍然是一个问题。所以对于遇到类似问题的人来说,知道它是否是一个nvarchar2问题(我不知道它可能是个问题)可能会很好,并尝试解决它。