不同字符集倒库的方法
发表于:2007-07-02来源:作者:点击数:
标签:
第一步:EXP 原 US7ASCII数据库中的SCOTT用户。 第二步:EXP 原US7ASCII 数据库中的ZHAOBOYI用户。 第三步:CREATE NEW DATABASE(CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK), 所有的路径与原 数据库相同。 第四步:将ZHS16GBK 中的INIT。ORA COPY
第一步: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(@#<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_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;
COM
MIT;
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)
原文转自:http://www.ltesting.net