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(核心思想,資料區塊替換與拷貝+查詢)
問:用SQL PLUS串連ORACLE資料庫伺服器?
測試連接成功,說明監聽程式工作正常。
(1)若在圖形介面方式下,則需在主機字串(Host string)中指明串連描述符。
如果你採用的是預設安裝,沒有指明串連描述符,通常為orcl。
(2)在命令列方式下,串連命令的格式是:conn username/password@connect_identifier
username:使用者名稱
password:口令
connect_identifier:串連描述符
如果沒有指定串連描述符,則串連到系統內容變數ORACLE_SID所指定的資料庫。
如果沒有設定ORACLE_SID,則串連到的資料庫。
如果你的機器上安裝過兩個或兩個以上資料庫,那必須在命令中加上@串連描述符。
有問題再聯絡。祝一切順利。
在登陸sql plus時老是出現錯誤提示 ora-12154:tns:不可以解析指定的串連標識符
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內,然後儲存就可以了。