Oracle 中的 TO_NUMBER 函数出现奇怪的问题

2023-12-06

如果记录数超过特定数量 n,则在 varchar2 列的 where 子句中执行 to_number 函数时,我遇到间歇性问题。我使用 n 是因为没有发生这种情况的确切记录数。在一个 DB 上,它发生在 n 为 100 万之后,而在另一个 DB 上,n 为 0.1。百万。

例如。我有一个包含 1000 万条记录的表,例如 Table Country,其中 field1 varchar2 包含数字数据和 Id

如果我做一个查询作为例子

select * 
from country 
where to_number(field1) = 23
and id >1 and id < 100000

这有效

但是如果我进行查询

select * 
from country 
where to_number(field1) = 23 
and id >1 and id < 100001

无法显示无效号码

接下来我尝试查询

select * 
from country
where to_number(field1) = 23 
and id >2 and id < 100001

又可以用了

由于我只得到无效的数字,这很令人困惑,但在日志文件中它说

Memory Notification: Library Cache Object loaded into SGA
Heap size 3823K exceeds notification threshold (2048K)
KGL object name :with sqlplan as (
    select c006 object_owner, c007 object_type,c008 object_name
      from htmldb_collections
     where COLLECTION_NAME='HTMLDB_QUERY_PLAN'
       and c007 in ('TABLE','INDEX','MATERIALIZED VIEW','INDEX (UNIQUE)')),
ws_schemas as(
    select schema 
      from wwv_flow_company_schemas
     where security_group_id = :flow_security_group_id),
t as(
        select s.object_owner table_owner,s.object_name table_name,
               d.OBJECT_ID
          from sqlplan s,sys.dba_objects d

看起来它与SGA大小有关,但谷歌在这方面没有给我太多帮助。

有人对 TO_NUMBER 或大数据 oracle 函数的这个问题有任何想法吗?


其中 field1 varchar2 包含数字数据

这不是一个好的做法。数字数据应保存在 NUMBER 列中。原因很简单:如果我们不强制执行强数据类型,我们可能会发现 varchar2 列中包含非数字数据。如果发生这种情况,那么像这样的过滤器

where to_number(field1) = 23 

会失败ORA-01722: invalid number.

我不能肯定地说这就是您的场景中发生的情况,因为我不明白为什么 ID 过滤器中明显微不足道的更改会改变查询的成功。查看不同版本的查询的执行计划将会很有帮助。但我认为这更有可能是你的数据问题而不是 SGA 中的错误。

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

Oracle 中的 TO_NUMBER 函数出现奇怪的问题 的相关文章

  • 从函数内的 SELECT 返回一个变量

    我正在尝试创建一个返回 varchar 的函数 其中一个字段形成一个选择 即聚合字段 我收到下一个错误 ORA 01422 exact fetch returns more than requested number of rows 我的理
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 如何获取 Oracle 上 SYSDATE 的 UTC 值

    可能是一个经典 您知道在 Oracle 上检索 SYSDATE 的 UTC 值的简单技巧吗 最好也能在第 8 版上工作 现在我有自定义函数 Cheers Stefan 您可以使用 SELECT SYS EXTRACT UTC TIMESTA
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 循环预定义值

    有没有办法在 oracle 中执行 for every 如下所示 begin for VAR in 1 2 5 loop dbms output put line The value VAR end loop end 我知道你可以这样做 b
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • SQL WHERE 取决于星期几

    我需要检查不同日期的记录 具体取决于当前是一周中的哪一天 在周五 我需要它查看整个下周 直到下周日 在其他任何一天 它都应该检查当前周 直到下周日 我目前有以下内容 但由于语法错误而无法工作 是否可以做一个CASE WHEN里面一个WHER
  • 删除连接中不存在的记录

    想象两个表 A 和 B A B 1 2 2 3 6 5 4 7 9 11 13 23 9 现在我想从 A 中删除 B 中不存在的记录 例如从 A 中删除 1 6 和 4 我最初的想法是您可以 否定 联接的结果 DELETE FROM A W
  • JDBC 和多线程

    我正在尝试使用多线程方法运行一些查询 但是我认为我做错了什么 因为我的程序需要大约五分钟来运行一个简单的选择语句 例如 SELECT FROM TABLE WHERE ID 123 我的实现如下 我使用一个连接对象 在我的运行方法中 pub
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • Big Query - 将数组/json 对象转置为列

    这个问题是这两个问题的延续 Bigquery 将数组转置为列 https stackoverflow com q 64346504 7463780 大查询 将特定字段转置为列 https stackoverflow com q 643983
  • 如何将逗号分隔的列值与另一个表作为行连接

    我试图通过首先转换我正在成功执行的 SupplierId 列中的逗号分隔值来连接两个表 然而 当我尝试通过外键 DCLink 加入另一个带有供应商名称的表 Vendors 时 问题就出现了 这就是我的意思 原始表的 select 语句 SE
  • Oracle SQL 分析查询 - 类似递归电子表格的运行总计

    我有以下数据 由A值 排序依据MM 月 The B列计算为GREATEST current value of A previous value of B 0 以类似电子表格的方式 我怎样才能计算B使用 SQL 查询 我尝试使用分析函数 但未
  • 如果字符串包含数字,则仅返回字符串中的数字

    例如 字符串是abc123CD需要找到一种只读方法numbers在字符串中i e select a postgres function abc123CD Result 123 My try select substring abc123CD
  • PostgreSQL 位图堆扫描索引非常慢,但仅索引扫描很快

    我创建了一个包含 43kk 行的表 并用值 1 200 填充它们 因此 表中每个数字大约为 220k create table foo id integer primary key val bigint insert into foo se
  • 使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?

    我正在这样做 students Student find gt all return this gt render process array students gt students 然后在视图中 foreach students as

随机推荐