2008-10-02 5 views
20

मुझे एक ऐसा घटक लिखना है जो ओरेकल डेटाबेस में SQL सर्वर तालिकाओं (संरचना और डेटा) को फिर से बनाता है। इस घटक को ओरेकल डेटाबेस में नया डेटा भी दर्ज करना होगा और इसे वापस SQL ​​सर्वर में कॉपी करना होगा।ओरेकल खाली स्ट्रिंग को शून्य होने पर मानता है जबकि SQL सर्वर नहीं करता - यह सबसे अच्छा कैसे संभाला जाता है?

एसक्यूएल सर्वर से ओरेकल तक डेटा प्रकारों का अनुवाद करना कोई समस्या नहीं है। हालांकि, ओरेकल और एसक्यूएल सर्वर के बीच एक महत्वपूर्ण अंतर एक प्रमुख सिरदर्द पैदा कर रहा है। SQL सर्वर NULL मान से भिन्न होने के लिए एक खाली स्ट्रिंग ("") मानता है, इसलिए char कॉलम को NOT NULL के रूप में परिभाषित किया जा सकता है और फिर भी डेटा में रिक्त तार शामिल हैं।

ओरेकल एक खाली स्ट्रिंग एक NULL मूल्य के रूप में ही मानते हैं, इसलिए यदि एक char स्तंभ NOT NULL के रूप में परिभाषित किया गया है, तो आप एक खाली स्ट्रिंग नहीं डाल सकते। यह मेरे घटक को तोड़ने का कारण बनता है जब भी NOT NULL चार कॉलम में मूल SQL सर्वर डेटा में रिक्त स्ट्रिंग होती है।

अब तक मेरा समाधान किसी भी दर्पण ओरेकल तालिका परिभाषाओं में NOT NULL का उपयोग नहीं करना है, लेकिन मुझे एक और मजबूत समाधान की आवश्यकता है। यह एक कोड समाधान होना चाहिए, इसलिए उत्तर "एसक्यूएल 2 ओरेकल उत्पाद का उपयोग नहीं कर सकता"।

आप इस समस्या को कैसे हल करेंगे?

संपादित करें: यहां एकमात्र समाधान है जो मैं अब तक आया हूं, और यह समस्या को स्पष्ट करने में मदद कर सकता है। चूंकि ओरेकल एक पूर्ण नल कॉलम में अनुमति नहीं देता है, इसलिए मेरा घटक SQL सर्वर से आने वाले किसी भी मान को रोक सकता है और इसे "@" (उदाहरण के लिए) के साथ प्रतिस्थापित कर सकता है।

जब मैं अपनी ओरेकल तालिका में एक नया रिकॉर्ड जोड़ता हूं, तो मेरे कोड को "@" लिखना पड़ता है यदि मैं वास्तव में एक "" डालना चाहता हूं, और जब मेरा कोड नई पंक्ति को SQL सर्वर पर वापस कॉपी करता है, तो उसे अवरोध करना पड़ता है "@" और इसके बजाय "" लिखें।

मुझे उम्मीद है कि एक और शानदार तरीका है।

संपादित करें 2: क्या यह संभव है कि एक आसान समाधान है, जैसे ओरेकल में कुछ सेटिंग जो इसे अन्य सभी प्रमुख डेटाबेस के समान रिक्त तारों के इलाज के लिए प्राप्त करती है? और यह सेटिंग ओरेकल लाइट में भी उपलब्ध होगी?

+0

आपके संपादन 2 के संबंध में: इन सभी कॉलम के लिए एक सीएलओबी का उपयोग करने में एक भयानक समाधान है। ओरेकल न्यूल और खाली सीएलओबी के बीच अंतर करता है। प्रदर्शन प्रभाव को कम करने के लिए आप तालिका में सीएलओबी इनलाइन स्टोर कर सकते हैं। मैं यह नहीं करूँगा (नीचे मेरा वास्तविक जवाब देखें)। –

+0

@WW .: आप पूरी तरह से सही हैं - यह एक भयानक समाधान है। – MusiGenesis

+1

पवित्र गाय। एसक्यूएल सर्वर के पास मूर्खता का अपना हिस्सा है, लेकिन यह शुद्ध बकवास है। (क्या यह अभी भी 2014+ ओरेकल के साथ है, और इसके लिए एक "एएनएसआई न्यूल" सेटिंग जोड़ा गया है? एसक्यूएल सर्वर के पास इस तरह के कुछ "एएनएसआई न्यूल" हैंडलिंग जैसे कुछ मुद्दे थे।) – user2864740

उत्तर

10

मुझे इसके लिए एक आसान समाधान नहीं दिख रहा है।

हो सकता है कि आप अपने मूल्यों को एक या अधिक रिक्त स्थान -> ' ' के रूप में स्टोर कर सकें, जो ओरेकल में न्यूल नहीं हैं, या अतिरिक्त फ़ील्ड/टेबल और एडाप्टर परत के माध्यम से इस विशेष मामले का ट्रैक रखें।

3

क्या आपको SQL सर्वर सिस्टम में खाली स्ट्रिंग्स को अनुमति देना है? यदि आप SQL सर्वर सिस्टम में बाधा डाल सकते हैं जो रिक्त तारों को अस्वीकार करता है, तो शायद यह सबसे आसान समाधान है।

+0

मेरी इच्छा है। SQL सर्वर डेटाबेस मेरे नियंत्रण में नहीं है। – MusiGenesis

1

यदि आप डेटा माइग्रेट कर रहे हैं तो आपको खाली स्ट्रिंग के लिए एक जगह को प्रतिस्थापित करना पड़ सकता है। बहुत सुरुचिपूर्ण नहीं, लेकिन व्यावहारिक। यह ओरेकल का एक बुरा "फीचर" है।

+2

मैं अपने प्रश्न का शीर्षक देना चाहता था "क्यों पृथ्वी पर ओरेकल नल के साथ खाली तारों को बराबर करता है?" – MusiGenesis

+1

कुछ वर्षों से इस बारे में सोचने के बाद, मुझे लगता है कि ओरेकल इसे सही मिला। SQL सर्वर प्रोग्रामर के परिप्रेक्ष्य से NULL को परिभाषित करता है: प्रोग्रामर के लिए, एक खाली स्ट्रिंग अभी भी * कुछ * है, और अधिकांश कोड भाषाओं में शून्य चर से बहुत अलग है। ओरेकल इसे अंत उपयोगकर्ता से परिभाषित करता है (इस मामले में डेटाबेस डिजाइनर द्वारा प्रतिनिधित्व) परिप्रेक्ष्य; यदि, एक डीबी डिजाइनर के रूप में, मैं एक कॉलम निर्दिष्ट नहीं करता हूं, तो मैं ऐसा करता हूं ताकि उपयोगकर्ता (प्रोग्रामर समेत) प्रत्येक पंक्ति के लिए वास्तविक मूल्य डाल सकें। मैं वास्तव में एक टेबल के एक उदाहरण के बारे में नहीं सोच सकता जिसे मैंने कभी बनाया है ... – MusiGenesis

+1

... लोग मेरे नल में खाली तार (जैसे ज़िप कोड, सामाजिक सुरक्षा संख्या, आदि) डाल रहे हैं खेत। मुझे नहीं लगता कि मुझे यह भी पता था कि SQL सर्वर * जब तक मैं इस प्रश्न को नहीं पढ़ता तब तक नल फ़ील्ड में रिक्त स्थान की अनुमति देता है। टीएल; डीआर: एसक्यूएल सर्वर हैक प्रोग्रामर को डीबी डिजाइनरों के इरादे को रोकने की अनुमति देता है। – MusiGenesis

9

मेरे ठेठ समाधान प्रभावित स्तंभों में सभी स्ट्रिंग मूल्यों के लिए मजबूर कर 0 से अधिक लंबाई के लिए एसक्यूएल सर्वर में एक बाधा को जोड़ने के लिए होगा:

CREATE TABLE Example (StringColumn VARCHAR(10) NOT NULL) 

ALTER TABLE Example 
ADD CONSTRAINT CK_Example_StringColumn CHECK (LEN(StringColumn) > 0) 

लेकिन, जैसा कि आप ने कहा है, आप कोई नियंत्रण नहीं एसक्यूएल डेटाबेस पर।

  1. उपचार रिक्त स्ट्रिंग के रूप में अमान्य मान, उन रिकॉर्ड को छोड़, एक ऑपरेटर को सचेत और कुछ तरह से कि बनाता है यह आसान करने के लिए मैन्युअल रूप से सही/पुनः में रिकॉर्ड लॉग इन करें: जैसे तुम सच में चार विकल्प (मैं इसे देख के रूप में) है -दर्ज।
  2. खाली स्ट्रिंग मान रिक्त स्थान पर कनवर्ट करें।
  3. रिक्त स्ट्रिंग मान को कोड में कनवर्ट करें (यानी "लीगेसी" या "ईएमपीटीई")।
  4. रोलबैक स्थानांतरण जो इन कॉलम में खाली स्ट्रिंग मानों का सामना करते हैं, फिर SQL डेटा डेटाबेस स्वामी पर उनके डेटा को सही करने के लिए दबाव डालें।

नंबर चार मेरी वरीयता होगी, लेकिन हमेशा संभव नहीं है। आपके द्वारा की जाने वाली कार्रवाई वास्तव में ऑरैकल उपयोगकर्ताओं की आवश्यकता पर निर्भर करेगी। अंत में, अगर कुछ भी नहीं SQL डेटाबेस के बारे में किया जा सकता है, मैं ओरेकल व्यापार प्रणाली मालिकों के लिए इस मुद्दे को समझा जाएगा, विकल्प और परिणामों की व्याख्या और उन्हें निर्णय :) बनाने बनाने

नोट: मैं इस मामले में विश्वास करते हैं एसक्यूएल सर्वर वास्तव में "सही" व्यवहार प्रदर्शित करता है।

3

इसका बुरा और अप्रत्याशित साइड इफेक्ट्स हो सकता है .. लेकिन आप बस "'(0)" के बजाय "' डाल सकते हैं।

drop table x 

drop table x succeeded. 
create table x (id number, my_varchar varchar2(10)) 

create table succeeded. 
insert into x values (1, chr(0)) 

1 rows inserted 
insert into x values (2, null) 

1 rows inserted 
select id,length(my_varchar) from x 

ID      LENGTH(MY_VARCHAR)  
---------------------- ---------------------- 
1      1      
2            

2 rows selected 

select * from x where my_varchar is not null 

ID      MY_VARCHAR 
---------------------- ---------- 
1      
+0

यह "बहुत बुरा" है। यह चरम पर एक स्ट्रिंग-ए-सिंगल-स्पेस लेता है। – user2864740

3

नहीं NULL डेटाबेस डेटाबेस की बाधा है जो आपके डेटाबेस में अमान्य डेटा डालने से रोकने के लिए उपयोग की जाती है। यह आपके ओरेकल डेटाबेस में किसी भी उद्देश्य की सेवा नहीं कर रहा है और इसलिए मेरे पास यह नहीं होगा।

मुझे लगता है कि आपको किसी भी ओरेकल कॉलम में NULLS को अनुमति देना जारी रखना चाहिए जो रिक्त स्ट्रिंग वाले ज्ञात SQL सर्वर कॉलम को मिरर करता है।

यदि पूर्ण और खाली स्ट्रिंग के बीच SQL सर्वर डेटाबेस में कोई तार्किक अंतर है, तो आपको ओरेकल में इस अंतर को मॉडल करने के लिए कुछ अतिरिक्त आवश्यकता होगी।

+0

मुझे लगता है कि यह एकमात्र समझदार उत्तर है। असल में यदि SQL सर्वर डेटाबेस के डेवलपर नल कॉलम में रिक्त स्ट्रिंग संग्रहीत कर रहे हैं तो इन कॉलम को ऑरैकल डीबी में शून्य करने की आवश्यकता होगी। तो MusiGenesis शुरुआत से सही जवाब था और समस्या को हल करने के लिए बिल्कुल कुछ भी करने की जरूरत नहीं थी। – MikeKulls

2

जो लोग सोचते हैं कि नल और खाली स्ट्रिंग को समान माना जाना चाहिए। एक खाली स्ट्रिंग से एक शून्य का एक अलग अर्थ है। यह 'अपरिभाषित' और 'खाली होने के लिए जाना जाता है' के बीच का अंतर कैप्चर करता है। एक उदाहरण के रूप में एक रिकॉर्ड स्वचालित रूप से बनाया गया हो सकता है, लेकिन उपयोगकर्ता इनपुट द्वारा कभी मान्य नहीं किया जाता है, और इस प्रकार उम्मीद में एक 'शून्य' प्राप्त होता है कि जब कोई उपयोगकर्ता इसे मान्य करता है, तो यह खाली हो जाएगा। व्यावहारिक रूप से हम तर्क को शून्य पर ट्रिगर नहीं करना चाहते हैं लेकिन एक खाली स्ट्रिंग पर चाह सकते हैं। यह हां/नहीं/अपरिभाषित के 3 राज्य चेकबॉक्स के मामले के समान है।

एसक्यूएल और ओरेकल दोनों को यह पूरी तरह से सही नहीं मिला है। एक खाली को 'शून्य नहीं' बाधा को पूरा नहीं करना चाहिए, और एक खाली स्ट्रिंग की आवश्यकता होती है जिसे शून्य से इलाज किया जाता है।

0

मैंने कुछ समय पहले ओरेकल को मेरे ब्लॉग पर शून्य मूल्यों को कैसे संभाला है, इस बारे में एक स्पष्टीकरण लिखा है। इसे यहां देखें: http://www.psinke.nl/blog/hello-world/ और यदि आपके कोई और प्रश्न हैं तो मुझे बताएं। आप खाली मूल्यों के साथ एक स्रोत से डेटा है और आप एक Oracle डाटाबेस जहां स्तंभों शून्य नहीं हैं करने के लिए कनवर्ट करना आवश्यक है, वहाँ 2 बातें आप कर सकते हैं:

  • ओरेकल स्तंभ से नहीं अशक्त बाधा को दूर
  • अपने डेटा को सहेजने में सक्षम होने के लिए कॉलम में '' या 0 या डमी तिथि रखने के लिए स्वीकार्य है, तो प्रत्येक व्यक्तिगत कॉलम के लिए जांचें।
0

ठीक है, मुख्य बिंदु जो मैं मानता हूं वह कार्य की अनुपस्थिति है जब कुछ फ़ील्ड शून्य हो सकती है, वही फ़ील्ड खाली स्ट्रिंग हो सकती है और व्यावसायिक तर्क इन मानों को अलग करने की आवश्यकता होती है। यदि स्तंभ नहीं NULL बाधा

  • जांच MSSQL है अगर कॉलम पर नज़र डालें (स्तंभ <> '') या इसी तरह की बाधा
  • यदि दोनों हैं

    • जांच MSSQL: तो मैं इस तर्क बनाने चाहते हैं सच है, ओरेकल कॉलम न्यूल बनाओ। यदि कोई भी सत्य है, तो ओरेकल कॉलम न्यूल बनाएं। यदि कोई भी सत्य नहीं है, तो INVALID डिज़ाइन अपवाद बढ़ाएं (या शायद इसे अनदेखा करें, अगर यह इस एप्लिकेशन द्वारा स्वीकार्य है)।

      एमएसएसक्यूएल से ओरेकल तक डेटा भेजते समय, कुछ खास नहीं करें, सभी डेटा सही स्थानांतरित हो जाएंगे। MSSQL में डेटा पुनर्प्राप्त करते समय, किसी भी गैर-शून्य डेटा को इस तरह भेजा जाना चाहिए। शून्य तारों के लिए आपको यह तय करना चाहिए कि इसे शून्य या खाली स्ट्रिंग के रूप में डाला जाना चाहिए या नहीं। ऐसा करने के लिए आपको फिर से टेबल डिज़ाइन की जांच करनी चाहिए (या पिछले परिणाम याद रखना चाहिए) और देखें कि इसमें पूर्ण बाधा नहीं है या नहीं। यदि है - खाली स्ट्रिंग का उपयोग करें, यदि नहीं है - न्यूल का उपयोग करें। सरल और चालाक।

      कभी-कभी, यदि आप अज्ञात और अप्रत्याशित एप्लिकेशन के साथ काम करते हैं, तो आप इसके विभिन्न रूपों के कारण {खाली स्ट्रिंग} बाधा के अस्तित्व की जांच नहीं कर सकते हैं। यदि ऐसा है, तो आप या तो सरलीकृत तर्क का उपयोग कर सकते हैं (ओरेकल कॉलम हमेशा निरर्थक बनाते हैं) या जांचें कि क्या आप बिना त्रुटि के एमएसएसक्यूएल तालिका में खाली स्ट्रिंग डाल सकते हैं।

    2

    मैं ऑरैकल पक्ष पर एक अतिरिक्त कॉलम के साथ जाऊंगा। क्या आपका कॉलम नल की अनुमति देता है और दूसरा कॉलम है जो यह पहचानता है कि SQL-सर्वर पक्ष को पंक्ति के लिए शून्य-मान या खाली-स्ट्रिंग मिलनी चाहिए या नहीं।

    0

    हालांकि, अधिकांश भाग के लिए, मैं अन्य प्रतिक्रियाओं के सबसे (किसी के बारे में एक बहस मैं से असहमत में पाने के लिए नहीं जा रहा - नहीं है कि :) के लिए जगह) के साथ सहमत

    मुझे लगता है कि ओपी नोटिस करना निम्नलिखित का उल्लेख किया गया:

    "ओरेकल एक खाली स्ट्रिंग को एक समान मान के समान मानता है, इसलिए यदि कोई चार कॉलम न्यूल के रूप में परिभाषित किया गया है, तो आप रिक्त स्ट्रिंग नहीं डाल सकते हैं।"

    विशेष रूप से CHAR को कॉल करना, और VARCHAR2 नहीं। इसलिए, लंबाई 0 (यानी '') की "खाली स्ट्रिंग" के बारे में बात करना मूक है। यदि उसने चार्ज घोषित किया है, उदाहरण के लिए, CHAR (5), तो बस रिक्त स्ट्रिंग में आने वाली जगह जोड़ें, ओरेकल इसे किसी भी तरह से पैड करने जा रहा है। आप 5 स्पेस स्ट्रिंग के साथ समाप्त हो जाएंगे।

    अब, यदि ओपी का मतलब वचर 2 है, तो हाँ, यह एक अन्य जानवर है, और हाँ, खाली स्ट्रिंग और एनयूएलएल के बीच का अंतर प्रासंगिक हो जाता है।

    SQL> drop table junk; 
    
        Table dropped. 
    
        SQL> 
        SQL> create table junk (c1  char(5) not null); 
    
        Table created. 
    
        SQL> 
        SQL> insert into junk values ('hi'); 
    
        1 row created. 
    
        SQL> 
        SQL> insert into junk values (' '); 
    
        1 row created. 
    
        SQL> 
        SQL> insert into junk values (''); 
        insert into junk values ('') 
              * 
        ERROR at line 1: 
        ORA-01400: cannot insert NULL into ("GREGS"."JUNK"."C1") 
    
    
        SQL> 
        SQL> insert into junk values (rpad('', 5, ' ')); 
        insert into junk values (rpad('', 5, ' ')) 
              * 
        ERROR at line 1: 
        ORA-01400: cannot insert NULL into ("GREGS"."JUNK"."C1") 
    
    
        SQL> 
        SQL> declare 
        2 lv_in varchar2(5) := ''; 
        3 begin 
        4  insert into junk values (rpad(lv_in||' ', 5)); 
        5 end; 
        6/
    
        PL/SQL procedure successfully completed. 
    
        SQL> 
    
    संबंधित मुद्दे

     संबंधित मुद्दे