oracledb无效数字错误
oracledb invalid number error
我正在使用 oracledb (2.3.0) 和节点 (v8.11.3)。我尝试 运行 以下查询,return 结果是 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: 数字无效
我找不到错误的来源。
在您按数字比较 char 类型日期的部分中出错。将 where 子句更改为:
select TO_NUMBER(RESULTS) from V_RESULTS where TO_NUMBER(RESULTS)>=8 AND TO_NUMBER(RESULTS) <=10 AND LAND='AT' where RESULTS>=8 AND RESULTS<=10 AND LAND='AT'.
如果仍然命令有错误,您有无法转换为数字的数据。
有几种可能的原因。您可能只有不代表数字的字符串 - 即根本无法转换为数字。 SQL 如果您只看到结果的第一页并且还没有达到无法转换的结果(可能即使使用您正在使用的过滤器),开发人员可能会给您一种错误的安全感。
不过,鉴于客户端行为的差异,您也可能有非整数值并且对小数点感到困惑,SQL开发人员使用的 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
而不是句点或逗号,在这里不是很有用。
According to this,无论如何您都可以在会话级别覆盖它,例如:
connection.execute(
"ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'",
function (err, result) {
if (err) {
console.error(err.message);
return;
}
console.info(results);
});
我正在使用 oracledb (2.3.0) 和节点 (v8.11.3)。我尝试 运行 以下查询,return 结果是 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: 数字无效
我找不到错误的来源。
在您按数字比较 char 类型日期的部分中出错。将 where 子句更改为:
select TO_NUMBER(RESULTS) from V_RESULTS where TO_NUMBER(RESULTS)>=8 AND TO_NUMBER(RESULTS) <=10 AND LAND='AT' where RESULTS>=8 AND RESULTS<=10 AND LAND='AT'.
如果仍然命令有错误,您有无法转换为数字的数据。
有几种可能的原因。您可能只有不代表数字的字符串 - 即根本无法转换为数字。 SQL 如果您只看到结果的第一页并且还没有达到无法转换的结果(可能即使使用您正在使用的过滤器),开发人员可能会给您一种错误的安全感。
不过,鉴于客户端行为的差异,您也可能有非整数值并且对小数点感到困惑,SQL开发人员使用的 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
而不是句点或逗号,在这里不是很有用。
According to this,无论如何您都可以在会话级别覆盖它,例如:
connection.execute(
"ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'",
function (err, result) {
if (err) {
console.error(err.message);
return;
}
console.info(results);
});