使用的Oracle版本:11G R2
这里我们使用测试来进行演示,第一步,先创建测试存储过程,第二步,恢复删除后的存储过程。
SQL创建测试存储过程:SQL>conngel/gel
Connected.
SQL>CREATEORREPLACEPROCEDUREproc_test_drop
2AS
3BEGIN
4FORxIN(SELECTsysdateFROMdual)
5LOOP
6DBMS_OUTPUT.put_line(x.sysdate);
7ENDLOOP;
8ENDproc_test_drop;
9/
Procedurecreated.
SQL>setserveroutputon
SQL>execproc_test_drop;
03-MAR-16
PL/SQLproceduresuccessfullycompleted.
SQL>
SQL>l
1*selecttext,namefromdba_sourcewhereowner=’GEL’andname=’PROC_TEST_DROP’
SQL>/
TEXTNAME
————————————————-——————————
PROCEDUREproc_test_dropPROC_TEST_DROP
ASPROC_TEST_DROP
BEGINPROC_TEST_DROP
FORxIN(SELECTsysdateFROMdual)PROC_TEST_DROP
LOOPPROC_TEST_DROP
DBMS_OUTPUT.put_line(x.sysdate);PROC_TEST_DROP
ENDLOOP;PROC_TEST_DROP
ENDproc_test_drop;PROC_TEST_DROP
8rowsselected.
SQL>showuser
USERis“SYS”
SQL>conngel/gel
Connected.
SQL>dropPROCEDUREproc_test_drop;
Proceduredropped.
SQL>selecttext,namefromdba_sourcewhereowner=’GEL’andname=’PROC_TEST_DROP’;
norowsselected
下面是恢复的方法,紧供大家参考:
方法1:利用闪回查询进行恢复CREATEORREPLACEFORCEVIEW“SYS”.”DBA_SOURCE”(“OWNER”,“NAME”,“TYPE”,“LINE”,“TEXT”)AS
selectu.name,o.name,
decode(o.type#,7,‘PROCEDURE’,8,‘FUNCTION’,9,‘PACKAGE’,
11,‘PACKAGEBODY’,12,‘TRIGGER’,13,‘TYPE’,14,‘TYPEBODY’,
‘UNDEFINED’),
s.line,s.source
fromsys.obj$o,sys.source$s,sys.user$u
whereo.obj#=s.obj#
ando.owner#=u.user#
and(o.type#in(7,8,9,11,12,14)OR
(o.type#=13ANDo.subnameisnull))
unionall
select/*+ordered*/distinctu.name,o.name,‘JAVASOURCE’,s.joxftlno,s.joxf
tsrc
fromsys.obj$o,x$joxfss,sys.user$u
whereo.obj#=s.joxftobn
ando.owner#=u.user#
ando.type#=28
SQL>conn/assysdba
Connected.
SQL>selecttextfromdba_sourceasoftimestampsysdate-5/60/24whereowner=’GEL’andname=’PROC_TEST_DROP’;
TEXT
—————————————————————–
PROCEDUREproc_test_drop
AS
BEGIN
FORxIN(SELECTsysdateFROMdual)
LOOP
DBMS_OUTPUT.put_line(x.sysdate);
ENDLOOP;
ENDproc_test_drop;
8rowsselected.
闪回技术的其中一个功能就是:恢复丢失的数据、撤销不正确的且已经提交的改变。
方法2:通过基表进行恢复SQL>altersessionsetnls_date_format='yyyy-mm-ddhh24:mi:ss';
Sessionaltered.
SQL>selectsysdatefromdual;
SYSDATE
-------------------
-03-0315:39:40
SQL>selectobj#fromobj$asoftimestampto_timestamp('-03-0315:34:00',‘YYYY-MM-DDHH24:MI:SS’)wherename=’PROC_TEST_DROP’;
OBJ#
———-
52148
SQL>
SQL>setlong9999999
SQL>selectsource
2fromsource$asoftimestampto_timestamp('-03-0315:34:00',‘YYYY-MM-DDHH24:MI:SS’)
3whereobj#=52148
4orderbyline;
SOURCE
————————————————————————————————————————–
PROCEDUREproc_test_drop
AS
BEGIN
FORxIN(SELECTsysdateFROMdual)
LOOP
DBMS_OUTPUT.put_line(x.sysdate);
ENDLOOP;
ENDproc_test_drop;
8rowsselected.
SQL>
基表就是存储Oracle信息的底层表,通过基表的数据,也可以做到恢复。
如果觉得《oracle恢复误删字段 Oracle恢复被误删除存储过程的2种方法》对你有帮助,请点赞、收藏,并留下你的观点哦!