不同字符集倒庫的方法

whisperrr發表於2021-08-27

  第一步: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('

  ');

  end if;

  END LOOP;

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

  htp.p('

  ');

  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('

  ');

  END fupdate_clob_text;


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

相關文章