मेरे पास कोड का एक छोटा सा स्निपेट है जो कुछ डेटा पकड़ लेता है और ओरेकल डेटाबेस में डालने के लिए SQL कथन उत्पन्न करता है। फिर इन्हें 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

उम्मीद है कि कोई स्रोत पर कुछ प्रकाश डाल सकता है, या मुझे इसे खोजने की कोशिश करने के लिए सही दिशा में इंगित कर सकता है।

0
Hugo Almeida 7 जिंदा 2022, 14:26
समस्या को दोहरा नहीं सकता db<>fiddle
 – 
MT0
7 जिंदा 2022, 14:36
1
आप उद्धृत पहचानकर्ताओं का उपयोग क्यों कर रहे हैं? बस कॉलम id और double को नाम दें और INSERT INTO SOME_TABLE (id, double) VALUES(TO_BINARY_DOUBLE('0.0'), TO_BINARY_DOUBLE('1.2')); डीबी<>बेला
 – 
MT0
7 जिंदा 2022, 14:40

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा प्रतीत होता है कि आपके पास अपने सहकर्मियों के लिए भिन्न NLS सेटिंग्स हैं; विशेष रूप से NLS_NUMERIC_CHARACTERS। उस सेट के साथ '.,' कोड काम करता है; इसके साथ ',.' पर सेट किया गया है (अर्थात एक अवधि के बजाय दशमलव विभाजक के रूप में अल्पविराम की अपेक्षा) यह आपके द्वारा देखी जाने वाली त्रुटि को फेंक देता है।

आप या तो अपने जावा वातावरण को अपने सहयोगियों से मिलाने के लिए बदल सकते हैं, जिसमें संभवतः आपके पीसी या जेवीएम झंडे के माध्यम से लोकेल बदलना शामिल होगा; या इसे फ़ंक्शन कॉल में ओवरराइड करें:

    "#value__id" := TO_BINARY_DOUBLE('0.0', '999D999', 'nls_numeric_characters=''.,''');
    "#value_double" := TO_BINARY_DOUBLE('1.2', '999D999', 'nls_numeric_characters=''.,''');

एक प्रारूप मास्क का उपयोग करना जिसमें आपको जो भी स्ट्रिंग मानों से निपटना पड़ सकता है - मैं अनुमान लगा रहा हूं कि वे मान सामान्य रूप से उपयोगकर्ता या प्रक्रिया तर्क से आएंगे। बेशक, यह तब मानता है कि स्ट्रिंग मानों में हमेशा दशमलव विभाजक के रूप में एक अवधि होगी।

डीबी<>बेला

0
Alex Poole 7 जिंदा 2022, 14:56
बढ़िया जवाब, यह वास्तव में मुद्दा था। माई मैक जर्मनी के लिए सेट किया गया था जिसमें दशमलव विभाजक के रूप में अल्पविराम है।
 – 
Hugo Almeida
7 जिंदा 2022, 17:09