ORA-06502: PL/SQL: 将 TO_BINARY_DOUBLE 与 JDBC 一起使用时出现数字或值错误
ORA-06502: PL/SQL: numeric or value error when using TO_BINARY_DOUBLE with JDBC
我有一小段代码可以获取一些数据并生成 SQL 语句以将它们插入到 Oracle 数据库中。这些然后通过 Oracle 服务器上的 JDBC 驱动程序执行。
我 运行 遇到的问题是,如果这些语句包含 TO_BINARY_DOUBLE 调用,它们总是会失败 对我 而不是对我的其他人团队,据称与我拥有完全相同的驱动程序和环境,这非常奇怪。
CREATE TABLE "SOME_TABLE" (
"_id" BINARY_DOUBLE NOT NULL,
"double" BINARY_DOUBLE,
PRIMARY KEY ("_id")
);
DECLARE
"#value__id" BINARY_DOUBLE;
"#value_double" BINARY_DOUBLE;
BEGIN
"#value__id" := TO_BINARY_DOUBLE('0.0');
"#value_double" := TO_BINARY_DOUBLE('1.2');
INSERT INTO "SOME_TABLE" ("_id", "double")
VALUES(
"#value__id",
"#value_double"
);
END;
错误:
Unable to execute SQL statement batch: error occurred during batching: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 5
希望有人可以阐明来源,或者为我指明正确的方向以尝试找到它。
您的 NLS 设置似乎与您的同事不同;具体来说 NLS_NUMERIC_CHARACTERS
。将其设置为 '.,'
代码即可工作;将其设置为 ',.'
(即期望逗号作为小数点分隔符,而不是句点)它会抛出您看到的错误。
您可以更改您的 Java 环境以匹配您同事的环境,这可能涉及更改区域设置,您的 PC 或通过 JVM 标志;或在函数调用中覆盖它:
"#value__id" := TO_BINARY_DOUBLE('0.0', '999D999', 'nls_numeric_characters=''.,''');
"#value_double" := TO_BINARY_DOUBLE('1.2', '999D999', 'nls_numeric_characters=''.,''');
使用涵盖您可能需要处理的任何字符串值的格式掩码 - 我猜这些值通常来自用户或过程参数。当然,这假设字符串值总是有一个句点作为小数点分隔符。
我有一小段代码可以获取一些数据并生成 SQL 语句以将它们插入到 Oracle 数据库中。这些然后通过 Oracle 服务器上的 JDBC 驱动程序执行。
我 运行 遇到的问题是,如果这些语句包含 TO_BINARY_DOUBLE 调用,它们总是会失败 对我 而不是对我的其他人团队,据称与我拥有完全相同的驱动程序和环境,这非常奇怪。
CREATE TABLE "SOME_TABLE" (
"_id" BINARY_DOUBLE NOT NULL,
"double" BINARY_DOUBLE,
PRIMARY KEY ("_id")
);
DECLARE
"#value__id" BINARY_DOUBLE;
"#value_double" BINARY_DOUBLE;
BEGIN
"#value__id" := TO_BINARY_DOUBLE('0.0');
"#value_double" := TO_BINARY_DOUBLE('1.2');
INSERT INTO "SOME_TABLE" ("_id", "double")
VALUES(
"#value__id",
"#value_double"
);
END;
错误:
Unable to execute SQL statement batch: error occurred during batching: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 5
希望有人可以阐明来源,或者为我指明正确的方向以尝试找到它。
您的 NLS 设置似乎与您的同事不同;具体来说 NLS_NUMERIC_CHARACTERS
。将其设置为 '.,'
代码即可工作;将其设置为 ',.'
(即期望逗号作为小数点分隔符,而不是句点)它会抛出您看到的错误。
您可以更改您的 Java 环境以匹配您同事的环境,这可能涉及更改区域设置,您的 PC 或通过 JVM 标志;或在函数调用中覆盖它:
"#value__id" := TO_BINARY_DOUBLE('0.0', '999D999', 'nls_numeric_characters=''.,''');
"#value_double" := TO_BINARY_DOUBLE('1.2', '999D999', 'nls_numeric_characters=''.,''');
使用涵盖您可能需要处理的任何字符串值的格式掩码 - 我猜这些值通常来自用户或过程参数。当然,这假设字符串值总是有一个句点作为小数点分隔符。