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=''.,''');

使用涵盖您可能需要处理的任何字符串值的格式掩码 - 我猜这些值通常来自用户或过程参数。当然,这假设字符串值总是有一个句点作为小数点分隔符。

db<>fiddle