“ON CONVERSION ERROR”失败并显示“ORA-43918:此参数必须是文字”

2023-12-11

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

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


游标_共享

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

理想情况下,整个系统的 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 错误还有另一个与游标共享无关的潜在原因。似乎存在与转换相关的解析或优化器错误CASE and TO_在某些版本的 Oracle 上运行。

例如,以下 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“ON CONVERSION ERROR”失败并显示“ORA-43918:此参数必须是文字” 的相关文章

随机推荐

  • Deviseomniauthable 因“无法找到有效的路径映射”而破坏 Omniauth 身份验证

    在我的项目中 我有两种类型的用户 求职者和招聘经理 求职者没有模型 他们只能使用从第三方提供商收到的数据来申请工作 同时通过 Omniauth 进行身份验证 招聘经理的信息存储在设计用户模型中 招聘经理还必须能够使用其公司的 Google
  • mysql where语句日期问题

    希望有人能帮忙 我想做的是从数据库中提取任何给定月份的所有结果 是否可以仅使用 mysql 查询 无 php 我使用一个模板应用程序 我唯一的访问权限是通过 mysql where 语句 所以我需要从 2013 04 01 算出月份是什么
  • 求解具有变量约束的非线性方程组

    使用 fsolve 求解非线性方程组的一些假设示例 from scipy optimize import fsolve import math def equations p x y p return x y 2 4 math exp x
  • 不使用主键的映射中流畅的 NHibernate 连接表

    我正在尝试从 2 个不通过主键相关的表创建一个实体 Tables CREATE TABLE employees ssn nvarchar 9 NULL active bit NULL employee id int IDENTITY 1 1
  • Android:如何制作带有 2 行文本和 RadioButton(单选)的 AlertDialog?

    如何制作包含如下行的列表对话框 FIRST LINE OF TEXT o lt this is a RadioButton second line of text 我知道我应该使用自定义适配器 通过这些视图传递行布局 实际上 我已经这样做了
  • 更新文档时出现错误:由于值未定义,转换为字符串失败

    我有一个简单的文档 其中包含名称 必需 和描述 可选 在我的模型中 我使用有效 ID 更新文档 并传递值为未定义的描述 因为我想从文档中删除此属性 但是 我收到以下错误 消息 转换为字符串失败 路径 描述 处的值 未定义 名称 CastEr
  • Magento:如何在客户信息字段中显示客户的电话号码

    我试图让客户的电话号码显示在客户帐户信息部分下 我知道电话号码属于客户地址部分 但我正在尝试重新设计客户帐户信息的外观 我为客户 ID 添加了一个新的自定义字段 并且可以使用以下代码显示它 因为客户 ID 属于 customer entit
  • 在 cakephp 中验证输入文件

    在 cakephp 中 我试图检查文件输入字段是否附加了文件 如果没有则输出错误 我已经在其他领域做到了这一点 但似乎无法让它在该领域发挥作用 这是模型 array notempty uploadeduploaded file gt arr
  • 将输入的数据存储在数组中[重复]

    这个问题在这里已经有答案了 我是 C 初学者 如果我的问题很蹩脚 请不要介意 在我编写的这个程序中 当我第一次使用 for 循环时 我预计数组中仅存储 3 个值 但它存储 4 个值 并且在下一个 for 循环中按预期显示 3 个值 我的问题
  • 如何避免触发器内的 ORA-04091 错误

    我在表 A 上有一个更新后触发器 触发器 A 可以对表 B 进行更改 我在表 B 上还有一个更新后触发器 触发器 B 它不进行任何更改 但查询表 A 以对非规范化进行一些健全性检查 因此触发器 B 可以通过以下两种方式之一触发 如果我直接更
  • 带重定向的 Node.js 包罗万象的路由始终使用 Angular 呈现索引页面,无论 url 是什么

    本质上当我使用包罗万象的路线并使用res redirect 无论我输入的网址如何 它总是会呈现索引 主页 即 Angular 似乎没有 看到 完整的网址 但是如果我放置res render index 在包罗万象的路线中一切正常 我不想重复
  • Python:静态变量装饰器

    我想创建一个如下所示的装饰器 但我似乎想不出可行的实现 我开始认为这是不可能的 但我想我应该先问你们 我意识到在 Python 中还有各种其他方法来创建静态变量 但我发现这些方法很丑陋 如果可能的话 我真的很想使用下面的语法 static
  • 如何查看 SQL Server Management Studio 编辑器中制表位的位置?

    我使用语音识别来听写 SQL 而将事情排列起来很痛苦 如果我能看到制表位在哪里 那会节省我很多时间 Management Studio 支持一项未记录的功能 Visual Studio 也有 它将垂直引导线添加到编辑器窗口的特定列位置 使用
  • 无法在 Linux 机器上通过 ODBC 连接到 informix

    我正在运行 CentOS 7 的虚拟机上工作 并且尝试通过一些 php 使用 ODBC unixODBC 连接到 Informix 数据库 我使用的是 php7 0 并且安装了 unixODBC 2 3 7 以及 informix sdk
  • 创建自定义 MutableState 持有者

    Compose 仅 允许有限数量的状态持有者 包括所有原始数据类型和一些额外的附加组件 但不支持自定义对象或任何更复杂的对象 例如Path 我希望确保对这些类型的更改也能很好地观察到 因此我想为这些类型实现自定义扩展 就像他们添加了muta
  • 如何避免 Java 中未使用的代码抛出 NoClassDefFoundError

    我正在从事的项目是一个支持两个不同平台的API 在运行时 类路径上实际上只有两个平台之一可用 在大多数情况下 我很容易就能编写出这样工作正常的代码 if isPlatformOne PlatformOne doSomething Even
  • Python2 和 Python3:__init__ 和 __new__

    我读过其他问题来解释两者之间的区别 init and new 但我只是不明白为什么在下面的代码中用 python 2 输出 init 和Python3 new init 示例代码 class ExampleClass def new cls
  • 在 iOS 导航栏上放置标签、按钮

    我创建了自定义导航控制器 我想添加 左侧是日期 右侧是后退按钮 后退按钮旁边是标题 我尝试添加一个标签 但不起作用 请告诉我一个方法 UINavigationBar naviBarObj UINavigationBar alloc init
  • gcc 和 g++/gcc-c++ 有什么区别?

    在我看来 gcc 可以处理 c 和 c 项目 那么为什么需要 g gcc c 呢 g 和 gcc c 有什么区别 gcc如果文件具有适当的扩展名 则将 C 源文件编译为 C 将 C 源文件编译为 C 但是它不会自动链接到 C 库中 g 将自
  • “ON CONVERSION ERROR”失败并显示“ORA-43918:此参数必须是文字”

    ON CONVERSION ERROR应允许转换函数处理诸如 ORA 01858 在需要数字的地方发现非数字字符 之类的错误 但是当我使用该功能时 我只会收到不同的错误 SQL gt select to date the date defa