不同字符集倒库的方法

    技术2022-05-11  178

    第一步:EXP 原 US7ASCII数据库中的SCOTT用户。第二步:EXP 原US7ASCII 数据库中的ZHAOBOYI用户。第三步:CREATE NEW DATABASE(CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK),所有的路径与原数据库相同。

    第四步:将ZHS16GBK 中的INIT。ORA COPY INIT。ORA。BAK。第五步:将US7ASCII 中的INIT。ORA COPY ZHS16GBK 修改相应参数。第六步:生成ZHS16GBK 中的SCOTT 用户,授权,EXP ZHS16GBK 中的SCOTT 用户。第七步:  生成ZHS16GBK 中的ZHAOBOYI 用户,EXP ZHS16GBK 中的ZHAOBOYI 用户。第八步:用ULTRAEDIT 分别打开(US7ASCII)以及(ZHS16GBK)SCOTT 用户,将前5行中的US7ASCII 不同处改掉。第九步:相应的做ZHAOBOYI 用户。第十步:在ZHS16GBK中,执行SYS 用户的OWALOAD。SQL ,对HTP。P授权。第十一步:做IMP,把原有的数据库倒入到新的数据库。第十二步:解决大字段问题。首先在原数据库中执行存储过程 fwrite_clob_NIU,将含有大字段的表生成到文件中,接着,在新数据库中编译执行fupdate_clob_text,将大字段倒回到新数据库中。附录:1。存储过程:FWRITE——CLOB——NIUprocedure       fwrite_clob_NIU as    CURSOR c_lt IS    SELECT c.text,c.info_id     FROM info_ctext c  where info_id <= 120    --change7.16 WHERE  info_id <=100     order by info_id asc;/*    1000-1100 F    1100-1600 OK    1600-1630 OK    1629-1640 OK    1640-1660 F    1660-1668 OK    1669 F    1670-1750 OK*/        Str                 VARCHAR2(32767) := Null;    Position            INTEGER         := 1;    New_Position        INTEGER         := 1;Pat varchar2(80) := 'd:/writeclob';--change716 Pat varchar2(80) := '/export/home0/ora8i/doc/ch';    Save_File   utl_file.file_type;     Result      BOOLEAN             := FALSE;Dir_Delimiter   VARCHAR2(200) := '/';--change 7.16    Dir_Delimiter   VARCHAR2(200) := '/';  -- NOTE: Use '/' for Windows NT    p_Filename VARCHAR2(200);    v_offset integer;    v_amount integer;    v_buffer varchar2(30240);BEGIN    v_amount := 30240;    IF SUBSTR( Pat, LENGTH( Pat ), 1 ) != Dir_Delimiter THEN        Pat := Pat || Dir_Delimiter; END IF;    BEGIN      FOR r IN c_lt      LOOP      IF r.text is not null then   p_Filename := r.info_id ||'.dat';   New_Position:=1;   Position:=1;      Save_File := utl_file.fopen( Pat, p_Filename, 'w' );        if DBMS_LOB.INSTR( r.text, CHR(10), Position ) = 0 then         begin              V_OFFSET := 1;              v_buffer := '';         loop             dbms_lob.read(r.text,v_amount,v_offset,v_buffer);              v_offset := v_offset + v_amount;           utl_file.put( Save_File,  v_buffer );           --    htp.p(v_buffer);          -- htp.p('jjjj');       end loop;        exception          when no_data_found then          null;        end;                   -- htp.p('111');          -- Str := DBMS_LOB.SUBSTR( r.text,1)||CHR(10);          -- HTP.P(STR);        end if;           WHILE( New_Position != 0 )        LOOP          New_Position := DBMS_LOB.INSTR( r.text, CHR(10), Position );

              Str := DBMS_LOB.SUBSTR( r.text, New_Position - Position, Position );         -- HTP.P('STR=');         -- HTP.P(STR);          Position := New_Position + 1;

              --change 7.17 IF New_Position != 0 THEN              utl_file.put_line( Save_File, REPLACE( Str, CHR(10), Null ) );          -- else                        --        utl_file.put_line( Save_File,  Str );           -- change 7.17           -- htp.p(new_position);         -- END IF;         END LOOP;  UTL_FILE.FCLOSE(Save_File);  htp.p('<center><h2>The file  '||p_Filename||'    generated!</h2></center>');  end if;      END LOOP;       EXCEPTION   WHEN NO_DATA_FOUND THEN     htp.p('<center><h2>The file  '||p_Filename||'    Failed!</h2></center>');    end;END fwrite_clob_niu;附录二:存储过程fupdate_clob_textprocedure       fupdate_clob_text as    CURSOR c_lt IS    SELECT c.text,c.info_id     FROM info_ctext c -- where info_id = 112   where ((info_id >= 1 and info_id <= 30) or   (info_id >=30 and info_id <= 60) or    (info_id >=60 and info_id <= 90) or   (info_id >=90 and info_id <= 120))           /* --CHANGE 716 WHERE type not in ('B','C','V','A','E') and ((info_id >=10000 and info_id <20000) or    (info_id >=1100 and info_id <1601)  or    (info_id >=1600 and info_id <1630)  or    (info_id >=1660 and info_id <1668) or    info_id >=1670  or    (info_id >=0 and info_id <501))    */    order by info_id asc;/*    1000-1100 F    1100-1600 OK    1600-1630 OK    1629-1640 OK    1640-1660 F    1660-1668 OK    1669 F    1670-1750 OK*/      Tmp             CLOB;      Pat varchar2(80) := 'd:/writeclob';  -- CHANGE 7.16 Pat varchar2(80) := '/export/home0/ora8i/doc/ch';    Save_File   utl_file.file_type;     Result      BOOLEAN             := FALSE;    Dir_Delimiter   VARCHAR2(200) := '/';     -- change 7.16 Dir_Delimiter   VARCHAR2(200) := '/';  -- NOTE: Use '/' for Windows NT    p_Filename VARCHAR2(200);BEGIN    htp.p('我们');        IF SUBSTR( Pat, LENGTH( Pat ), 1 ) != Dir_Delimiter THEN        Pat := Pat || Dir_Delimiter; END IF;      FOR r IN c_lt      LOOP         begin     p_Filename :=to_char(r.info_id)||'.dat';          UPDATE info_ctext SET text = ' '           WHERE info_id=r.info_id;         COMMIT;                         SELECT text INTO Tmp FROM info_ctext          WHERE info_id = r.info_id  FOR UPDATE;

         -- DBMS_LOB.TRIM( Tmp, 0 );

           Result := Load_File( Pat, p_Filename, Tmp );

           IF Result THEN          UPDATE info_ctext SET text = Tmp           WHERE info_id=r.info_id;         COMMIT;        END IF;         end;       END LOOP;     EXCEPTION   WHEN NO_DATA_FOUND THEN     htp.p('<center><h2>The file  '||p_Filename||'    Failed!</h2></center>');

            END fupdate_clob_text;附录三:新数据库字符集NLS——LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK原数据库字符集AMERICAN_AMERICA.US7ASCII.

    ______________________________________

    ===================================================================新浪免费电子邮箱 (http://mail.sina.com.cn)订阅手机短信头条新闻,天天奖多款时尚手机! (http://dailynews.sina.com.cn/c/272235.html)订阅手机短信顶级新闻每天得新款手机大奖! (http://dailynews.sina.com.cn/c/266499.html)

     


    最新回复(0)