【问题标题】:How do I specify a literal number with a limited precision in an Oracle Database query?如何在 Oracle 数据库查询中指定精度有限的文字数字?
【发布时间】:2021-02-05 16:59:22
【问题描述】:

如何在 Oracle PL/SQL 查询的 SELECT 子句中指定精度有限的文字数字? CAST 是唯一的方法吗?

我想这样做,但列的类型最终为 NUMBER,而我希望类型匹配 l.changed_rows_log_id,即 NUMBER(18,0)

SELECT COALESCE(l.changed_rows_log_id, 1) AS Col1 FROM mytable l;

如果我把它留在那里,消费进程可能会在类型 NUMBER 上犹豫不决,因为它可能包含非常大的数字——所有这些都是因为文字 1

相反,我不得不尴尬地这样做。有没有更好的办法?

SELECT CAST(COALESCE(l.changed_rows_log_id, 1) AS NUMBER(18,0)) AS Col1 FROM mytable l; 

【问题讨论】:

  • 这只会让你觉得尴尬,直到你习惯它。事实上,这是做你想做的事情的常见方式。
  • 问题不在于您的表存储的数字大于表达式的data typeint (-2147483648 to 2147483647) 的限制吗? NUMBER(18,0) 也可以存储超出限制的整数。
  • 不完全是,但我看到我写问题时的错误造成的混乱。我已经编辑了我的问题,因为它确实是 Java 中的 64 位整数 (long)。
  • .. changed_rows_log_id 中导致溢出的值是什么?我的意思是,客户端的混乱 不是在制造getInt 而不是getLong?我仍然不明白如何通过转换数据类型来保护客户端。
  • 知道了!元数据检查失败,所以你必须cast向下数据类型,这正是你正在做的;)

标签: sql oracle


【解决方案1】:

似乎除了在问题中使用 CAST 之外别无他法。似乎是 PL/SQL 语法的真正缺点。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2011-11-04
    • 2022-01-04
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多