Oracle NVL 无效号码

hmq*_*esy 6 sql oracle

我有两个 Oracle 12c (12.1.0.2.0) 数据库,其中一个返回'ok'以下查询(使用 SQL Developer 3.2.20.10),而另一个返回ORA-01722: invalid number

select 'ok' from dual where 1 = nvl(1, 'X');
Run Code Online (Sandbox Code Playgroud)

Oracle 文档NVL说:

如果 expr1 是数字,则 Oracle 确定哪个参数具有最高的数字优先级,将另一个参数隐式转换为该数据类型,并返回该数据类型。

为价值观NLS_COMPNLS_SORT并且NLS_LANGUAGE是两个数据库之间是相同的,所以他们不应该导致的2个参数的数值优先级的差别。这两个数据库之间有什么不同会导致一个返回'ok'和一个错误?

Gar*_*ers 5

cursor_sharing 可能是关键因素。

如果谓词“1 = nvl(1, 'X')”始终作为文字执行并优化为 true 或 false,则可以在解析时对其求值。但是,如果强制使用cursor_sharing,则所有三个文字都可以替换为其他值,并且在执行之前无法评估表达式。

我必须使用两个单独的本地表来测试它。

alter session set cursor_sharing=force;
create table me_dual as select * from dual;
select 'ok' from me_dual x where 1 = nvl(1, 'A');
select 'ok' from me_dual x where 1 = nvl(1, 'A')

ERROR at line 1:
ORA-01722: invalid number
                                               *
alter session set cursor_sharing=exact;
create table alt_dual as select * from dual;
select 'ok' from alt_dual x where 1 = nvl(1, 'A');

'O
--
ok
Run Code Online (Sandbox Code Playgroud)


小智 5

将 NVL 的列参数包装在“ to_char ”内解决了“ORA-01722:无效数字”错误的问题:

select 'ok' from dual where 1 = nvl(to_char(1), 'X');
Run Code Online (Sandbox Code Playgroud)