PL SQL包用于备份模式中的所有表

时间:2017-10-18 04:13:50

标签: 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 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;

1 个答案:

答案 0 :(得分:0)

而不是函数,像这样在PACKAGE BODY内编写一个过程。从ALL_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/ sql developer调用为

SET SERVEROUTPUT ON;
variable return_code NUMBER;
EXEC backup_scr.p_backup_scr(:return_code);
PRINT return_code;

注意:您可以在all_tables的选择中为特定架构添加where条件。如果您希望它更通用,那么将模式名称作为procedure参数传递。