转换错误失败,并返回"ORA-43918:此参数必须是文字参数(&Q;

quot;ON CONVERSION ERRORquot; fails with quot;ORA-43918: This argument must be a literalquot;(转换错误失败,并返回quot;ORA-43918:此参数必须是文字参数(Q;)
本文介绍了转换错误失败,并返回"ORA-43918:此参数必须是文字参数(&Q;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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设置为FORCE时,ON CONVERSION ERROR功能不起作用。若要避免此错误,请在系统、会话或语句级别更改该参数。

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

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

可以使用提示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时,它假定结果必须以特定的顺序显示,并且不会对该查询块应用那么多的转换。)

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

这篇关于转换错误失败,并返回"ORA-43918:此参数必须是文字参数(&Q;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

SQL to Generate Periodic Snapshots from Transactions Table(用于从事务表生成定期快照的SQL)
MyBatis support for multiple databases(MyBatis支持多个数据库)
Oracle 12c SQL: Missing column Headers in result(Oracle 12c SQL:结果中缺少列标题)
SQL query to find the number of customers who shopped for 3 consecutive days in month of January 2020(查询2020年1月连续购物3天的客户数量)
How to get top 10 data weekly (This week, Previous week, Last month, 2 months ago, 3 month ago)(如何每周获取前十大数据(本周、前一周、上个月、2个月前、3个月前))
Select the latest record for an Id per day - Oracle pl sql(选择每天ID的最新记录-Oracle pl SQL)