select-6ren">
gpt4 book ai didi

oracle - "ON CONVERSION ERROR"失败,返回 "ORA-43918: This argument must be a literal"

转载 作者:行者123 更新时间:2023-12-02 02:23:43 31 4
gpt4 key购买 nike

ON CONVERSION ERROR 应该允许转换函数处理错误,例如“ORA-01858:在需要数字的地方发现了非数字字符”。但是当我使用该功能时,我只会得到一个不同的错误:

SQL> select to_date(the_date default null on conversion error, 'MM/DD/YYYY') the_date
2 from
3 (
4 select '1/1/2021' the_date from dual union all
5 select 'bad date' the_date from dual
6 );
select to_date(the_date default null on conversion error, 'MM/DD/YYYY')
*
ERROR at line 1:
ORA-43918: This argument must be a literal

错误行号和列号没有意义,因为代码已经在使用文字。

最佳答案

CURSOR_SHARING

当参数 CURSOR_SHARING 设置为 FORCE 时,ON CONVERSION ERROR 功能不起作用。为避免此错误,请在系统、 session 或语句级别更改参数。

理想情况下,应将整个系统的 CURSOR_SHARING 设置为 EXACT。但是如果我们有一个不使用绑定(bind)变量的应用程序,我们可能无法运行 alter system set cursor_sharing=exact;

可以使用 alter session set cursor_sharing=exact; 在 session 级别设置参数,但不断更改 session 参数并不总是很方便。

可以使用提示 CURSOR_SHARING_EXACT 在语句级别更改参数:

SQL> select /*+ cursor_sharing_exact */ to_date(the_date default null on conversion error, 'MM/DD/YYYY') the_date
2 from
3 (
4 select '1/1/2021' the_date from dual union all
5 select 'bad date' the_date from dual
6 );

THE_DATE
---------
01-JAN-21

解析器/优化器错误

正如@gouessej 所发现的,ORA-43918 错误还有另一个与游标共享无关的潜在原因。在某些版本的 Oracle 上似乎存在与转换 CASETO_ 函数相关的解析或优化器错误。

例如,以下 SQL 语句在 Oracle 18c 和 19c 上失败:

SQL> select case when v_num is null then 0 else v_num end
2 from
3 (
4 select to_number('120.3' default null on conversion error, '99999D99') as v_num
5 from dual
6 );
select to_number('120.3' default null on conversion error, '99999D99') as v_num
*
ERROR at line 4:
ORA-43918: This argument must be a literal

我认为这是一个解析或优化器错误,因为如果您通过添加像 rownum >= 1 这样的谓词来停止转换,错误就会消失。 (当 Oracle 看到 ROWNUM 时,它假定结果必须按特定顺序显示,并且不会对该查询 block 应用尽可能多的转换。)

SQL> select case when v_num is null then 0 else v_num end
2 from
3 (
4 select to_number('120.3' default null on conversion error, '99999D99') as v_num
5 from dual
6 where rownum >= 1
7 );

CASEWHENV_NUMISNULLTHEN0ELSEV_NUMEND
------------------------------------
120.3

关于oracle - "ON CONVERSION ERROR"失败,返回 "ORA-43918: This argument must be a literal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66037720/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com