首页 > 解决方案 > oracledb无效号码错误

问题描述

我正在使用带有节点(v8.11.3)的 oracledb(2.3.0)。我尝试运行以下查询,该查询在 sqlDeveloper 中返回结果

select TO_NUMBER(RESULTS) from V_RESULTS where RESULTS>=8 AND RESULTS<=10 AND LAND='AT'

当我使用 oracledb 运行它时:

oracledb.getConnection(
        config.db_connection,
        function (err, connection) {
            if (err) {
                return;
            }

            connection.execute(query,
                function (err, result) {
                    if (err) {
                        console.error(err.message);
                        return;
                    }

                   console.info(results);
                });

        })

我收到以下错误:ORA-01722:无效号码

我无法找到错误的来源。

标签: node.jsoracleexpressnode-oracledb

解决方案


有几个可能的原因。您可能只有不代表数字的字符串 - 即根本无法转换为数字。如果您只看到结果的第一页并且还没有到达还不能转换的结果(甚至可能使用您正在使用的过滤器),SQL Developer 可能会给您一种错误的安全感。

但是,鉴于客户端行为的差异,您也可能有非整数值并且对小数感到困惑,因为 SQL Developer 使用的 NLS 设置与从您的语言环境中获取的节点不同。您可以通过调整该值来演示相同的问题:

alter session set nls_numeric_characters = '.,';

with t (n) as (
            select '1' from dual
  union all select '1.5' from dual
)
select n, to_number(n)
from t;

N   TO_NUMBER(N)
--- ------------
1              1
1.5          1.5

alter session set nls_numeric_characters = ',.';

with t (n) as (
            select '1' from dual
  union all select '1.5' from dual
)
select n, to_number(n)
from t;

Error report -
ORA-01722: invalid number

如果发生这种情况,您可以更改您的语言环境或明确设置您的 NLS 环境,或者您可以通过提供格式模型来指定要使用的小数分隔符:

with t (n) as (
            select '1' from dual
  union all select '1.5' from dual
)
select n, to_number(n, '999.999')
from t;

N   TO_NUMBER(N,'999.999')
--- ----------------------
1                        1
1.5                    1,5                   

这需要对允许的前导和尾随数字的数量有所了解。

您也可以NLS_NUMERIC_CHARACTERSto_number()调用过程中进行覆盖,但前提是您无论如何都提供了一种格式 - 这样您就可以使用D句点或逗号来代替,这在这里并不是很有用。

根据 this,您无论如何都可以在会话级别覆盖它,例如:

        connection.execute(
            "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'",
            function (err, result) {
                if (err) {
                    console.error(err.message);
                    return;
                }

               console.info(results);
            });

推荐阅读