我试图了解如何继续使用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;
答案 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
参数传递。