Snažím se importovat export Oracle 11 do Oracle 11 XE.
Zobrazuji následující zprávy:
import v XE fehlerhaftu import proveden v WE8MSWIN1252 znakové sadě a AL16UTF16 NCHAR znakové sadě
importní server používá znakovou sadu AL32UTF8 (možná převod znakové sady)
Nějaké nápady, jak mohu importovat tento výpis do Oracle 11 XE?
pravit:
Daný stůl
CREATE TABLE BDATA.Artikel(
Key VARCHAR2(3) NOT NULL,
Name VARCHAR2(60) NOT NULL,
Abkuerzung VARCHAR2(5) NOT NULL
);
Mám takové chyby
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ö
Některé řádky v importu chybí.
Pokud je to skutečný DDL, který používáte k vytvoření tabulky, můžete použít parametr NLS_LENGTH_SEMANTICS . Pokud to nastavíte na hodnotu CHAR, nikoli na výchozí hodnotu BYTE, bude VARCHAR2 (5) přiděleno dost místa pro uložení 5 znaků v sadě znakových databází (potenciálně až 20 bajtů) namísto 5 bajtů (což by mohlo umožnit pouze 1 znak) ).
Bohužel, změna NLS_LENGTH_SEMANTICS
pravděpodobně nebude moc užitečné, pokud se při vytváření tabulky spoléháte na proces importu - soubor výpisu neodmyslitelně přidá klíčové slovo CHAR nebo BYTE, takže by skutečně vydal příkaz
CREATE TABLE BDATA.Artikel(
Key VARCHAR2(3 BYTE) NOT NULL,
Name VARCHAR2(60 BYTE) NOT NULL,
Abkuerzung VARCHAR2(5 BYTE) NOT NULL
);
Vy nemáte na XE na výběr znakovou sad , takže ji nemůžete změnit tak, aby vyhovovala databázi, kterou se pokoušíte importovat. Bylo by praktické před exportem migrovat zdrojovou databázi?
Import by měl fungovat, ale převod znakové sady může znamenat, že některé textové sloupce se znaky mimo ASCII nebudou po importu vypadat stejně. Řádky lze odmítnout, pokud jsou v nové znakové sadě příliš dlouhé.
Ve vašem případě převádíte na UTF8, což znamená, že během převodu na 2 ( nebo více teoreticky ) bude růst jednoho bajtového znaku. Možná budete muset zvětšit velikost sloupce před exportem nebo upravit cílové schéma a importovat data v samostatném kroku. Viz zde pro další možné problémy se zkrácením dat
Nejjednodušší způsob: (je nutné vypnout) :
Nejprve se připojte jako sysdba:
sqplus / as sysdba
Dále spusťte následující skript:
alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;
Fungovalo to pro mě ve verzi Oracle 12c Standard Two Edition
Převzato z: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html
Fungovalo to pro mě. Místo toho:
imp u/[email protected] file=data.dmp
Zkuste něco takového v bash:
imp u/[email protected] file=<(Perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)
To mění každou col1 VARCHAR2(n)
na col1 VARCHAR2(n CHAR)
v řádcích začínajících CREATE TABLE
. Můžete také změnit data.dmp
Před spuštěním imp, pokud nejste schopni <(...)
ve vašem Shell například:
Perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp
... ale v bash to není nutné a něco se může při převodu nebo při vytváření zálohy pokazit, jak je uvedeno v -i.bk
.