अलग-अलग वर्ण सेट के कारण Oracle आयात समस्या


11

मैं Oracle 11 XE में Oracle 11 निर्यात आयात करने का प्रयास कर रहा हूं।

मुझे निम्नलिखित संदेश मिले:

WE8MSWIN1252 वर्ण सेट और AL16UTF16 NCHAR वर्ण सेट
आयात सर्वर में किए गए XE fehlerhaft आयात में आयात AL32UTF8 वर्ण सेट (संभावित चारसेट रूपांतरण) का उपयोग करता है

किसी भी विचार, मैं इस डंप को Oracle 11 XE में कैसे आयात कर सकता हूं?

संपादित करें:

एक मेज दी

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);

मुझे इस तरह की त्रुटियाँ मिलती हैं

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö

आयात से कुछ पंक्तियाँ गायब हैं।

जवाबों:


8

यदि वह वास्तविक DDL है जिसका उपयोग आप तालिका बनाने के लिए कर रहे हैं, तो आप NLS_LENGTH_SEMANTICS पैरामीटर का उपयोग कर सकते हैं । यदि आप BYTE के डिफ़ॉल्ट के बजाय CHAR पर सेट करते हैं, तो VARCHAR2 (5) को डेटाबेस वर्ण सेट में 5 वर्णों को संग्रहीत करने के लिए पर्याप्त स्थान आवंटित किया जाएगा (संभावित रूप से 20 बाइट्स) बजाय 5 बाइट्स (जो कि सिर्फ एक वर्ण की अनुमति दे सकते हैं) )।

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

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);

मेरे पास तालिका तालिका स्क्रिप्ट है और इसे आपके प्रस्ताव के अनुसार संशोधित कर सकते हैं। यदि पहले से तैयार की गई मेज पर काम करता है, तो सब ठीक हो जाएगा।
bernd_k

@bernd_k - कूल। फिर आप डीडीएल चलाने से पहले या तो NLS_LENGTH_SEMANTICS सेट कर सकते हैं या आप हर VARCHAR2 कॉलम घोषणा में CHAR जोड़ने के लिए DDL को संशोधित कर सकते हैं। जब आप आयात करते हैं, तो आपको केवल सारणीय सारणी कथनों की विफलता को अनदेखा करने के लिए यह बताना होगा क्योंकि तालिकाएँ पहले से मौजूद होंगी।
जस्टिन केव

मैंने अपनी तालिका परिभाषा बदल दी ... VARCHAR2 (60 CHAR) नहीं पूरी नहीं ... और इसका उपयोग IGNORE = Y के साथ किया और आयात को चेतावनी के साथ सफलतापूर्वक समाप्त कर दिया।
bernd_k

4

आपके पास XE पर सेट वर्ण का विकल्प नहीं है, इसलिए आप इसे उस डेटाबेस के अनुरूप नहीं बदल सकते हैं जिसे आप आयात करने का प्रयास कर रहे हैं। क्या निर्यात से पहले स्रोत डेटाबेस को स्थानांतरित करना व्यावहारिक होगा ?

आयात काम करना चाहिए, लेकिन चरित्र सेट रूपांतरण का मतलब हो सकता है कि गैर-अस्की पात्रों के साथ कुछ पाठ कॉलम आयात के बाद समान नहीं दिखेंगे। और पंक्तियों को अस्वीकार किया जा सकता है यदि वे नए वर्ण सेट में बहुत लंबे हैं।

आपके मामले में, आप UTF8 में परिवर्तित हो रहे हैं, जिसका अर्थ है कि एकल बाइट वर्ण के लिए 2 ( या सिद्धांत में अधिक ) रूपांतरण के दौरान विकसित करना संभव है । निर्यात स्कीम को निर्यात स्कीम को समायोजित करने या अलग चरण में डेटा आयात करने से पहले आपको कॉलम का आकार बढ़ाने की आवश्यकता हो सकती है। अन्य संभावित डेटा ट्रंकेशन समस्याओं के लिए यहां देखें


मेरा संपादन देखें। मेरी एकमात्र उम्मीद सबसे पहले विस्तारित चौड़ाई वाली तालिकाओं का निर्माण करना है और आयात से तालिका बनाने की अनदेखी करने वाले डेटा को आयात करना है।
bernd_k

क्या आप impdp का उपयोग कर रहे हैं? यहाँ देखें कैसे
जैक का कहना है कि topanswers.xyz की कोशिश करें

अभी तक नहीं, लेकिन शायद सीखने का एक अच्छा समय।
bernd_k

लेकिन ध्यान दें कि impdp का इस्तेमाल एक्सपैड के साथ बनाए गए निर्यात के साथ ही किया जा सकता है
जैक कहते हैं कि topanswers.xyz

2

सबसे आसान तरीका: (शट डाउन neccesary) :

सबसे पहले, sysdba के रूप में कनेक्ट करें:

sqplus / as sysdba

अगला, निम्नलिखित स्क्रिप्ट निष्पादित करें:

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

इसने मेरे लिए ओरेकल 12 सी स्टैंडर्ड दो संस्करण में काम किया

से लिया गया: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html


0

इसने मेरे लिए काम किया। इसके अलावा:

imp u/p@db file=data.dmp

कुछ इस तरह की कोशिश करें:

imp u/p@db file=<(perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

यह हर बदलता है col1 VARCHAR2(n)करने के लिए col1 VARCHAR2(n CHAR)के साथ शुरू लाइनों में CREATE TABLEdata.dmpयदि आप <(...)अपने शेल में उदाहरण के लिए सक्षम नहीं हैं, तो आप उस पर चलने से पहले भी बदल सकते हैं :

perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp

... लेकिन यह बाश में जरूरी नहीं है और रूपांतरण में या इसके अनुसार बैकअप बनाने में कुछ गलत हो सकता है -i.bk

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.