Oracle 用于备份架构中所有表的PL SQL包
我试图理解如何继续使用PL SQL包,我可以使用该包备份特定数据库中的所有表,因为我需要保留此强制备份。在进行备份时,我需要在表名前加上bak_XX 由于我对oracle中的PL SQL不太熟悉,请有人建议我如何开始 多谢各位 我从下面的脚本开始Oracle 用于备份架构中所有表的PL SQL包,oracle,plsql,Oracle,Plsql,我试图理解如何继续使用PL SQL包,我可以使用该包备份特定数据库中的所有表,因为我需要保留此强制备份。在进行备份时,我需要在表名前加上bak_XX 由于我对oracle中的PL SQL不太熟悉,请有人建议我如何开始 多谢各位 我从下面的脚本开始 CREATE OR REPLACE PACKAGE BODY backup_scr AS FUNCTION get_tablenames(db_name VARCHAR2) RETURN VARCHAR2 IS v_dbnames V
CREATE OR REPLACE PACKAGE BODY backup_scr AS
FUNCTION get_tablenames(db_name VARCHAR2) RETURN VARCHAR2 IS
v_dbnames VARCHAR2(150);
BEGIN
SELECT OBJECT_NAME || ','
INTO v_dbnames
FROM SYS.ALL_OBJECTS
WHERE UPPER(OBJECT_TYPE) = 'PACKAGE';
RETURN v_dbnames;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
WHEN TOO_MANY_ROWS THEN
RETURN NULL;
END;
在
包体中编写一个过程,而不是函数,如下所示。从所有_tables
中获取表列表,循环浏览并动态运行CREATE TABLE
以创建备份表
包装规格。
create or replace PACKAGE backup_scr AS
PROCEDURE p_backup_scr (
p_ret_code OUT NUMBER
) ;
END backup_scr ;
/
身体
CREATE OR REPLACE PACKAGE BODY backup_scr AS
PROCEDURE p_backup_scr (
p_ret_code OUT NUMBER
)
IS
BEGIN
FOR tabs IN (
SELECT
owner,
table_name
FROM
all_tables
) LOOP
BEGIN
dbms_output.put_line('CREATING BACKUP OF '
|| tabs.owner
|| '.'
|| tabs.table_name);
EXECUTE IMMEDIATE 'CREATE TABLE BAK_'
|| tabs.table_name
|| ' AS SELECT * FROM '
|| tabs.owner
|| '.'
|| tabs.table_name;
dbms_output.put_line('COMPLETED SUCCESSFULLY');
p_ret_code := 0;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
p_ret_code := 1;
END;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
p_ret_code := 1;
END p_backup_scr;
END backup_scr;
/
然后,您可以从sqlplus/sqldeveloper
as调用脚本
SET SERVEROUTPUT ON;
variable return_code NUMBER;
EXEC backup_scr.p_backup_scr(:return_code);
PRINT return_code;
注意:您可以在select forall_表
中为特定架构添加where条件。如果您希望它更通用,那么将模式名称作为过程
参数传递。谢谢Kaushik,但是当我尝试执行时,我得到了包体创建时带有错误的错误,我需要包括create package stmt吗?抱歉,因为我对包裹很陌生。。创建或替换包体备份\u scr作为过程备份\u scr\u sql就足够了?您需要先创建同名的包规范。您还没有创建它吗?感谢Kaushik的帮助!抱歉,我忽略了创建包的代码,现在似乎工作正常,但我使用的UID Scott似乎没有足够的权限执行修复该问题的备份需要。再次感谢您,祝您愉快!好啊如果你找到了你想要的。请对答案进行投票,并将其标记为最佳答案。为什么要在PL/SQL中进行此操作以将数据库备份到数据库中的其他位置?使用RMAN
(或EXPDP
或EXP
)并备份到外部源。