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

我试图理解如何继续使用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 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 for
all_表
中为特定架构添加where条件。如果您希望它更通用,那么将模式名称作为
过程
参数传递。

谢谢Kaushik,但是当我尝试执行时,我得到了包体创建时带有错误的错误,我需要包括create package stmt吗?抱歉,因为我对包裹很陌生。。创建或替换包体备份\u scr作为过程备份\u scr\u sql就足够了?您需要先创建同名的包规范。您还没有创建它吗?感谢Kaushik的帮助!抱歉,我忽略了创建包的代码,现在似乎工作正常,但我使用的UID Scott似乎没有足够的权限执行修复该问题的备份需要。再次感谢您,祝您愉快!好啊如果你找到了你想要的。请对答案进行投票,并将其标记为最佳答案。为什么要在PL/SQL中进行此操作以将数据库备份到数据库中的其他位置?使用
RMAN
(或
EXPDP
EXP
)并备份到外部源。