不同字符集倒庫的方法 (轉)

gugu99發表於2008-05-25
不同字符集倒庫的方法 (轉)[@more@]

第一步:E原 US7ASCII中的TT。
第二步:EXP 原US7ASCII 資料庫中的ZHAOBOYI使用者。
第三步:CREATE NEW DATABASE(CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK),
所有的路徑與原
資料庫相同。

第四步:將ZHS16GBK 中的INIT。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。 ,對HTP。P授權。
第十一步:做IMP,把原有的資料庫倒入到新的資料庫。
第十二步:解決大欄位問題。
首先在原資料庫中執行過程 fwrite_clob_NIU,將含有大欄位的表生成到中,接著
,在新資料庫中編譯執行fupdate_clob_text,
將大欄位倒回到新資料庫中。
附錄:
1。儲存過程:FWRITE——CLOB——NIU
procedure  fwrite_clob_NIU as
  CURSOR c_lt IS
  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
  L
  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 MS_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.


______________________________________

===================================================================
新浪免費電子 (.sina.com.cn">)
訂閱簡訊頭條新聞,天天獎多款時尚手機! ()
訂閱手機簡訊頂級新聞每天得新款手機大獎! ()

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004557/,如需轉載,請註明出處,否則將追究法律責任。

相關文章