12

我创建了一个 Oracle PL/SQL 包,其中包含一个标题和一个包含大量代码的正文。

CREATE OR REPLACE PACKAGE BODY...后来,在使用不同的源代码(实际上我打算以不同的包名称保存)重新运行语句后,我最终意外地从该正文中删除了代码。

有什么办法可以从包中恢复旧的替换源代码?

4

2 回答 2

18

您可以通过对 all_source 使用闪回查询来取回它。

例如,我的包体当前是第 2 版,以标准用户身份执行此查询:

SQL> select text
  2  from all_source
  3  where name = 'CARPENTERI_TEST'
  4  and type = 'PACKAGE BODY';

TEXT


package body carpenteri_test
is

procedure do_stuff
is
begin
   dbms_output.put_line('version 2');
end do_stuff;

end carpenteri_test;

10 rows selected.

我知道我在今晚 9:30 左右更改了此设置,因此在以 SYSDBA 用户身份连接后,我运行了以下查询:

SQL> select text
  2  from all_source
  3  as of timestamp
  4  to_timestamp('04-JUN-2010 21:30:00', 'DD-MON-YYYY HH24:MI:SS')
  5  where name = 'CARPENTERI_TEST'
  6  and type = 'PACKAGE BODY';

TEXT
----------------------------------------------------------------------------

package body carpenteri_test
is

procedure do_stuff
is
begin
   dbms_output.put_line('version 1');
end do_stuff;

end carpenteri_test;

10 rows selected.

更多关于闪回的信息可以在这里找到。Tom Kyte 还演示了如何在此处将闪回与 all_source 一起使用。

于 2010-06-04T21:05:00.890 回答
4

除非您启用了 DDL 命令的日志记录/审计或数据库备份,否则答案几乎肯定不是

数据库定义(包括存储过程)应始终被视为源代码,并在代码存储库中维护

于 2010-06-04T18:20:36.747 回答