node.js - 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:无效号码
我无法找到错误的来源。
解决方案
有几个可能的原因。您可能只有不代表数字的字符串 - 即根本无法转换为数字。如果您只看到结果的第一页并且还没有到达还不能转换的结果(甚至可能使用您正在使用的过滤器),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_CHARACTERS
在to_number()
调用过程中进行覆盖,但前提是您无论如何都提供了一种格式 - 这样您就可以使用D
句点或逗号来代替,这在这里并不是很有用。
根据 this,您无论如何都可以在会话级别覆盖它,例如:
connection.execute(
"ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'",
function (err, result) {
if (err) {
console.error(err.message);
return;
}
console.info(results);
});
推荐阅读
- reactjs - 如何在 React useState 中访问元素的名称
- discord.js - Discord.js - 你如何获得频道的 ID?
- python - 来自 python 的 12 个月移动平均线
- python - 查找熊猫数据框中列之间的父子关系
- python - 如何将函数的字符串输出转换为输入或可运行的 shell 命令?
- javascript - 悬停效果仅在悬停在卡片上半部分时触发
- javascript - 想从关系树中删除关系,但我不知道我错在哪里
- android - 为什么flutter release apk会崩溃?
- r - cor.test 的奇怪问题——去掉结果中的 [[1]]、[[2]] 等
- vhdl - 为什么 vhdl 不能识别这个端口?