2017-10-18 38 views
-1

我想了解如何我可以继续使用PL SQL包,我可以使用备份特定数据库中的所有表,因为我需要保持此强制备份。同时采取备份我需要用bak_XX前缀表名称...PL SQL包以模式中的所有表的备份

有人可以建议,请问我可以开始,因为我不是很熟悉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; 
+0

你为什么要在PL/SQL中这样做来将数据库备份到数据库内的其他地方?使用'RMAN'(或'EXPDP'或'EXP')并备份到外部源。 – MT0

回答

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; 

注意:您可以添加特定的模式WHERE条件在里面选择all_tables。如果您希望它更通用,则将模式名称作为procedure参数传递。

+0

谢谢Kaushik,但当我尝试执行我收到错误,包体创建错误,我需要包括创建包stmt?道歉,因为我对包非常陌生.. 创建或更换包装体backup_scr AS过程backup_scr_sql就足够了吗? – Avancs

+0

您需要先创建包含相同名称的包规范。是不是创建了它? –

+0

谢谢Kaushik的帮助!抱歉,我忽略了创建包的代码,现在看起来工作正常,但似乎我正在使用斯科特的UID没有足够的权限来执行备份需要解决该问题。 再次感谢您,祝您有个美好的一天! – Avancs