当前位置导航:炫浪网>>网络学院>>编程开发>>Oracle教程

不同字符集倒库的方法


  第一步: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行中的U
  S7ASCII 不同处改掉。
  第九步:相应的做ZHAOBOYI 用户。
  第十步:在ZHS16GBK中,执行SYS 用户的OWALOAD。SQL ,对HTP。P授权。
  第十一步:做IMP,把原有的数据库倒入到新的数据库。
  第十二步:解决大字段问题。
  首先在原数据库中执行存储过程 fwrite_clob_NIU,将含有大字段的表生成到文件中,接着
  ,在新数据库中编译执行fupdate_clob_text,
  将大字段倒回到新数据库中。
  附录:
  1。存储过程:FWRITE——CLOB——NIU
  procedure    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 Win
  dows 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('

The file '||p_Filename||'  generated!

');
   end if;
     END LOOP;
     
   EXCEPTION
    WHEN NO_DATA_FOUND THEN
     htp.p('

The file '||p_Filename||'  Failed!

');
    end;
  END fwrite_clob_niu;
  附录二:存储过程fupdate_clob_text
  procedure    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 W
  indows 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('

The file '||p_Filename||'  Failed!

');
  
      
  END fupdate_clob_text;
  附录三:新数据库字符集
  NLS——LANG
  SIMPLIFIED CHINESE_CHINA.ZHS16GBK
  原数据库字符集
  AMERICAN_AMERICA.US7ASCII.
  
相关内容
赞助商链接