sql plus 抢救数据(测),sqlplus
有索引
--执行plsql脚本
DECLARE
TYPE RowIDTab ISTABLE OF ROWID INDEXBY BINARY_INTEGER;
CURSORc1 IS select /*+ index(xifenfei ind_xifenfei) */ rowid
fromchf.xifenfei
whereobject_id isNOT NULL;
r RowIDTab;
rows NATURAL := 20000;
bad_rows number := 0 ;
errors number;
error_code number;
myrowid rowid;
BEGIN
OPENc1;
LOOP
FETCH c1 BULK COLLECT INTOr LIMIT rows;
EXITWHENr.count=0;
BEGIN
FORALL i INr.FIRST..r.LASTSAVE EXCEPTIONS
insertinto chf.xifenfei_new
select/*+ ROWID(A) */ *
fromchf.xifenfei A whererowid = r(i);
EXCEPTION
whenOTHERS then
BEGIN
errors := SQL%BULK_EXCEPTIONS.COUNT;
FORerr1 IN1..errors LOOP
error_code := SQL%BULK_EXCEPTIONS(err1).ERROR_CODE;
if error_code in(1410, 8103) then
myrowid := r(SQL%BULK_EXCEPTIONS(err1).ERROR_INDEX);
bad_rows := bad_rows + 1;
insertinto chf.bad_rows values(myrowid, error_code);
else
raise;
endif;
ENDLOOP;
END;
END;
commit;
ENDLOOP;
commit;
CLOSEc1;
dbms_output.put_line('Total Bad Rows: '||bad_rows);
END;
/
没有索引
--找回记录
setserveroutput on
setconcat off
DECLARE
nrows number;
rid rowid;
dobj number;
ROWSPERBLOCK number;
BEGIN
ROWSPERBLOCK:=1000; --估算最大的一个块中记录条数
nrows:=0;
selectdata_object_id intodobj
fromdba_objects
whereowner = 'CHF'
andobject_name = 'T_XIFENFEI'
-- and subobject_name = '<table partition>' Add this condition if table is partitioned
;
fori in(selectrelative_fno, block_id, block_id+blocks-1 totblocks
fromdba_extents
whereowner = 'CHF'
andsegment_name = 'T_XIFENFEI'
-- and partition_name = '<table partition>' Add this condition if table is partitioned
-- and file_id != <OFFLINED DATAFILE> This condition is only used if a datafile needs to be skipped due to ORA-376 (A)
orderby extent_id)
loop
forbr ini.block_id..i.totblocks loop
forj in1..ROWSPERBLOCK loop
begin
rid := dbms_rowid.ROWID_CREATE(1,dobj,i.relative_fno, br , j-1);
insertinto CHF.T_XIFENFEI_NEW
select/*+ ROWID(A) */ *
fromCHF.T_XIFENFEI A
whererowid = rid;
if sql%rowcount = 1 thennrows:=nrows+1; endif;
if (mod(nrows,10000)=0) thencommit;endif;
exceptionwhenothers thennull;
end;
endloop;
endloop;
endloop;
COMMIT;
dbms_output.put_line('Total rows: '||to_char(nrows));
END;
/
两个不错的博客
http://www.xifenfei.com/4160.html(核心思想利用rowid读取块内容)
http://www.hellodba.com/reader.php?ID=216&lang=CN(核心思想,数据块替换与拷贝+查询)
测试连接成功,说明监听程序工作正常。
(1)若在图形界面方式下,则需在主机字符串(Host string)中指明连接描述符。
如果你采用的是默认安装,没有指明连接描述符,通常为orcl。
(2)在命令行方式下,连接命令的格式是:conn username/password@connect_identifier
username:用户名
password:口令
connect_identifier:连接描述符
如果没有指定连接描述符,则连接到系统环境变量ORACLE_SID所指定的数据库。
如果没有设定ORACLE_SID,则连接到的数据库。
如果你的机器上安装过两个或两个以上数据库,那必须在命令中加上@连接描述符。
有问题再联系。祝一切顺利。
pl/sql 每当oracle client中service name发生变化,都会按照client安装目录下最新的tnsnames.ora,去作为它的读取文件;如果该文件在卸载oracle client后被手工删除或手工改动过后,未在oracle client中修改;则会报“ORA-12514:tns:无法解析指定的连接标识符”错误。
解决方法:
1、用tnsping <service_name>检测 plSQL登陆时database(数据库)别名是否可正确解析,如报“TNS-03505:无法解析名称”,则此database别名有冲突,需更改。
2、手工改动tnsnames.ora后,在oracle client中修改主机名(“对象”--“将数据库添加到树”--“从本地的……”,然后把错误主机名删除或从树中移除)
3、重新打开plSQL,用正确的database别名登陆,即恢复正常
4、如仍有问题,不登陆进入plSQL界面,进入"tools”--"Preferences"--"Oracle"--"Connection",把"home”(oracle主目录名)里的数据清空,应用后,重新启动plSQL即可。
附录:在做以上更改后oracle自带的sqlPLUS,可能会出现不能正常登陆远程服务器的情况;因为其访问的是database下的tnsnames.ora文件,目录与client的不一样,默认为 X(盘符):\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora
解决方法:只需将client下tnsnames.ora中定义的主机字符串(service_name)的命令行复制到database 下的tnsnames.ora内,然后保存就可以了。