【发布时间】:2023-02-22 04:22:21
【问题描述】:
我有一个包含非常冗长查询的过程。当我运行过程时,一个特定的连接给我一个“ORA-01722:无效数字”错误。这是加入:
from adv.hr_giving_ag_cash g
left join aga_allocation_handling ah on ah.allocation_code = g.alloc_code
如果我注释掉连接线,错误就会消失。有几个令人费解的事情:
- 我加入的两个字段(ah.allocation_code 和 g.alloc_code)都是 varchar 类型,并且没有空行或空行。因此,没有必要涉及数字。
- 如果我将查询从过程中复制出来并自行执行,则不会发生错误。
此外,没有从 aga_allocation_handling 表中选择任何内容。最终我会在 where 子句中使用它,但现在它被注释掉了。
我什至不知道如何开始调试它。有人对我有什么想法吗?谢谢!
【问题讨论】:
-
如果在过程外部运行查询有效的事实应该是问题可能来自周围而不是查询内部的线索。只有 2 行并不能使您的问题成为最小的可重现示例。
-
应该完整获取独立查询的结果(因此我使用 CTAS 或
select max(col1), ..., max(colN) from (<your query>)来确保这一点)。否则,它将返回数据中可能有或没有问题的前 N 行。如果您将这两列显式转换为字符串会怎样:to_char(ah.allocation_code) = to_char(g.alloc_code)? -
作为一种调试技术:使用查询结果创建中间表并将
g.alloc_code添加到输出中。然后在上面写一个 PL/SQL 循环分类带有left join到aga_allocation_handling打印获取行数的中间表(行内容在这里无关紧要)。它将为您提供失败行的序号位置,您可以手动验证 -
@astentx 我已经尝试将 to_char 添加到两列,但我仍然收到错误。我明白你关于查询只返回前 N 行的观点,我将检查在获取所有行时是否发生错误。
-
正如我的猜测,您的问题不是由该特定连接引起的。我认为 join 只会改变你的查询结果,这可能会导致其他比较表达式/类型转换变得无效(例如,NULL 数据值)
标签: sql oracle stored-procedures