You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19.26查询报错ORA-01858:WHERE子句使用场景差异问题求助

Oracle 19.26查询报错ORA-01858:WHERE子句使用场景差异问题求助

各位大佬好,我最近在Oracle 19.26版本上碰上个特别费解的问题,想请大家帮忙分析下:

我有两个关联的查询,先看第一个用来拉取活跃表名的Query 1:

SELECT DISTINCT 
    TO_CHAR(p.nm_snapshot_table) 
FROM 
    TABLE_4 p 
JOIN 
    TABLE_5 j ON (j.nm_job = p.nm_snapshot_table AND j.f_active = 'Y');

它的输出结果是:

'TABLE_1'
'TABLE_2'
'TABLE_3'

然后是第二个查询Query 2,用来查这些表的分区日期信息,核心问题就出在WHERE子句的表名指定方式上:

WITH partition_dates AS 
(
    SELECT 
        utp.table_name,
        utp.partition_name,
        utp.partition_position,
        TO_DATE(utp.partition_name, 'YYYYMMDD') AS partition_date
    FROM user_tab_partitions utp
    -- 关键差异点:
    -- 如果我手动写 WHERE utp.table_name IN ('TABLE_1', 'TABLE_2', 'TABLE_3')
    -- 执行完全正常,没有任何报错
    -- 但如果换成子查询关联 WHERE utp.table_name IN (SELECT DISTINCT TO_CHAR(p.nm_snapshot_table) FROM TABLE_4 p JOIN TABLE_5 j ON (j.nm_job = p.nm_snapshot_table AND j.f_active = 'Y'))
    -- 直接触发 ORA-01858: 在要求输入数字的地方找到非数字字符

我现在完全摸不着头脑——明明子查询返回的结果和我手动写的表名看起来一模一样,怎么执行逻辑就差这么多?

目前我自己猜了几个可能的方向,也想听听大家的看法:

  • 会不会Query 1的结果里藏了不可见字符?比如某些表名表面上正常,实际带了空格、控制字符,导致关联后查询的对应表分区名里有非法日期格式?
  • 是不是Oracle解析SQL的顺序问题?用子查询时,Oracle可能先执行日期转换逻辑,再过滤表名?但手动指定表名时是先过滤再转换?
  • 有没有可能Query 1返回的表名里,除了我手动测试的几个,还有其他表的分区名本身就不是合法的YYYYMMDD格式?只是我没注意到?

我接下来打算先逐个测试Query 1返回的所有表名,定位到具体触发报错的表,同时用DUMP函数检查表名有没有隐藏字符。有没有大佬碰到过类似的问题,或者有其他排查思路的,麻烦指点下!

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:00:32