Oracle DBA管理包脚本系列(一)

该系列脚本结合日常工作,方便DBA做数据管理、迁移、同步等功能,以下为该系列的脚本,按照功能划分不同的包。

create or replace PACKAGE "PKG_DBMANAGE"
------------------------------------------------------------------------------------------------------
--此处采用调用者权限模型表示该定义的程序在调用者模式下执行而非在定义者模式下执行(默认是在定义者模式下执行的)
--举例:假设该程序定义在模式用户USERONE下,调用者为USERTOW
--SQL>EXEC USERONE.PKG_DBMANAGE.EXECUTE_SQL('CREATE TABLE TEP(X DATE)');
--按照缺省值,发现在调用者下并未找到新建立的表TEP,系统会在定义该过程的用户USERONE下建立该表
--如果你是希望在当前用户下执行,则必须加上AUTHID CURRENT_USER子句
--出于安全性和共享程序使用调用者权限的需求,建议对所有的动态SQL程序加上AUTHID CURRENT_USER子句
--AUTHID只能用在顶级的存储过程、包声明头部、类型上,不能用在包体、包子程序或类型子程序上,否则会报PLS-00157:AUTHID只允许在方案级程序中使用
------------------------------------------------------------------------------------------------------
AUTHID CURRENT_USER
AS
--定义系统用户常量
SYSTEM_USER CONSTANT VARCHAR2(200):='DBSNMP,MGMT_VIEW,OLAPSYS,ORDDATA,ORDSYS,OUTLN,SYS,SYSTEM,SYSMAN,XDB';

--定义错误消息记录类型
TYPE ERRORINFO IS RECORD
(
    CODE NUMBER,
    ERRMSG VARCHAR2(1000)
);
--定义错误消息集合类型
TYPE ERRORLIST IS TABLE OF ERRORINFO;

--自定义异常处理单元
--声明异常
NO_DATA EXCEPTION;
TOOMANY_ROWS EXCEPTION;
CORRECT_DATE_FORMAT EXCEPTION;
CORRECT_NUMBER_FORMAT EXCEPTION;
CORRECT_CHARACTER_FORMAT EXCEPTION;
REFUSE_DATA_FILE EXCEPTION;
REFUSE_OPERATE_DIR EXCEPTION;
NO_DBLINK EXCEPTION;                                             --没有找到链接
CONN_TIMEOUT EXCEPTION;                                            --TNS:连接超时

--将声明异常名称与内部错误代码进行关联
PRAGMA EXCEPTION_INIT(TOOMANY_ROWS,-1422);
PRAGMA EXCEPTION_INIT(NO_DATA,100);
PRAGMA EXCEPTION_INIT(CORRECT_DATE_FORMAT,-1840);
PRAGMA EXCEPTION_INIT(CORRECT_NUMBER_FORMAT,-6502);
PRAGMA EXCEPTION_INIT(CORRECT_CHARACTER_FORMAT,-1861);
PRAGMA EXCEPTION_INIT(REFUSE_DATA_FILE,-01119);
PRAGMA EXCEPTION_INIT(REFUSE_OPERATE_DIR,-29289);
PRAGMA EXCEPTION_INIT(NO_DBLINK,-02019);
PRAGMA EXCEPTION_INIT(CONN_TIMEOUT,-12170);

--功能:根据错误代号获取系统错误消息
FUNCTION SQL_ERROR(pCODE IN NUMBER) RETURN VARCHAR2;

--功能:获取系统所有错误代号和错误消息字典
FUNCTION ALL_SQLERROR RETURN ERRORLIST PIPELINED;

--功能:判断用户是否是系统用户
FUNCTION IS_SYSTEMUSER(pUSER IN VARCHAR2) RETURN BOOLEAN;

--功能:建立用户或者修改用户密码,不存在则新建,存在则修改用户密码
PROCEDURE CREATE_USER(
  pUSERNAME IN VARCHAR2,
  pUSERPWD  IN VARCHAR2
);

--功能:授予用户全部角色、系统权限,仅供测试,不建议在生产环境使用
PROCEDURE GRANT_USER(pUSERNAME IN VARCHAR2);

--功能:建立表空间,不存在则新建,存在则可选是删除重建(当前表空间必须处于离线状态)还是使用已有表空间
PROCEDURE CREATE_TABLESPACE(
    pTABLESPACE       IN VARCHAR2,            --表空间名
    pDATADIR          IN VARCHAR2:=NULL,      --数据文件目录
    pDATAFILE         IN VARCHAR2:=NULL,      --数据文件名称
    pDATASIZE         IN NUMBER:=500,         --数据文件初始大小,单位为MB
    pAUTOEXTENDSIZE   IN NUMBER:=200,         --数据文件增长幅度,单位为MB
    pTABLESACEEXISTS  IN VARCHAR2:='DROP'     --表空间存在是否删除
);

----功能:修改已有表空间属性,如修改表空间大小、增长幅度等
--PROCEDURE UPDATE_TABLESPACE(
--    pTABLESPACE       IN VARCHAR2,            --表空间名
--  pMAXSIZE          IN NUMBER,
--  pONNEXT           IN NUMBER
--);

--功能:建立用户和表空间,并将新建立的表空间指定为新建立用户的默认表空间
PROCEDURE CREATE_USERANDTABLESPACE(
    pUSERNAME         IN VARCHAR2,            --用户名
    pUSERPWD          IN VARCHAR2,            --密码
    pTABLESPACE       IN VARCHAR2,            --表空间名
    pDATADIR          IN VARCHAR2:=NULL,      --数据文件目录
    pDATAFILE         IN VARCHAR2:=NULL,      --数据文件名称
    pDATASIZE         IN NUMBER:=500,         --数据文件初始大小,单位为MB
    pAUTOEXTENDSIZE   IN NUMBER:=200,         --数据文件增长幅度,单位为MB
    pTABLESACEEXISTS  IN VARCHAR2:='DROP'     --表空间存在是否删除
);

--功能:创建或修改数据库链接
PROCEDURE CREATE_DBLINK(
    pHOST       IN VARCHAR2,                  --链接数据库IP
    pLINKDB   IN VARCHAR2,                        --链接数据库名称
    pLINKUSER IN VARCHAR2,                        --链接数据库用户ID
    pLINKPWD  IN VARCHAR2,                        --链接数据库用户登录密码
    pLINKNAME IN OUT VARCHAR2                    --链接名称
);

--功能:创建数据库目录
PROCEDURE CREATE_DIRECTORY(
  FILEPATH    IN VARCHAR2,          --文件全路径
  DIR                 IN OUT VARCHAR2           --目录名称
);

--功能:克隆生成临时表/普通表
PROCEDURE CLONE_TEMP_TB(
  pTBNAME       IN  VARCHAR2,       --表名称
  pCLONETBNAME  IN  VARCHAR2,       --克隆表名称
  IsTemporary   IN  VARCHAR2:='N'   --1:默认为普通表。其他为临时表
);

--功能:克隆生成外部表,外部表结构类型与用户的对象表结构类型一致
PROCEDURE CLONE_EXTERNAL_TB(
  DIR                 IN  VARCHAR2,             --保存外部表数据的文件目录名称
  pTBLIST     IN  VARCHAR2          --表名称,多个表以','分隔
);

--功能:设置用户登入次数、连接数、口令有效期为'无限制'
PROCEDURE SETENVIRONMENT;

--功能:杀死当前运行的所有用户会话进程,强行解除死锁
PROCEDURE KILL_SESSION;

--功能:杀死锁表的用户进程
PROCEDURE KILL_SESSION_LOCK;

--功能:删除用户下所有的结构关系,基于安全和稳定性考虑,暂定部分系统用户对象不允许删除
PROCEDURE DROP_ALL_OBJECT(
  DBUSER  IN VARCHAR2:=USER,
  TAG     IN NUMBER:=0
);

--功能:基于指定用户下删除单个或多个结构(表、视图、函数、过程、类型、包、触发器、序列、数据库链接),但不能删除该包,多个结构名以','分隔
PROCEDURE DROP_OBJECT(
  DBUSER      IN VARCHAR2:=USER,
  pOBJECTNAME IN VARCHAR2
);

--功能:基于指定用户下删除单个主键、外键、约束
PROCEDURE DROP_CONSTRAINT(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2,
  pCONSNAME   IN VARCHAR2
);

--功能:基于指定用户下删除单个索引
PROCEDURE DROP_INDEX(
  DBUSER        IN VARCHAR2:=USER,
  pINDEXNAME    IN VARCHAR2
);

--功能:删除系统自动产生的SYS_PLSQL_类型,此为包中定义类型,当编译包或者调用包中类型或者管道函数时系统会自动生成,可以不用删除.
PROCEDURE DROP_PLSQLTYPE(DBUSER IN VARCHAR2:=USER);

--功能:删除表中的重复记录
PROCEDURE DELETE_DISTINCT(
    DBUSER             IN VARCHAR2:=USER,               --数据库用户名
    pTABLENAME     IN VARCHAR2,                            --表名
    pCOLLIST        IN VARCHAR2:=NULL                    --根据列名来匹配是否重复,多个列以','分隔,为空则表示以表中所有列来匹配,注意:LONG列无法识别是否重复
);

--功能:删除用户下的表记录,pTABLENAME为NULL则删除所有表的记录,不为NULL则删除一个或多个表的记录,多个表以','分隔,pFILTER-过滤条件
PROCEDURE DELETE_TABLE( 
  DBUSER             IN  VARCHAR2:=USER,
  pTABLENAME     IN  VARCHAR2:=NULL,
  pFILTER     IN  VARCHAR2:=NULL 
);

--功能:截断用户下的表,pTABLENAME为NULL则截断所有表,不为NULL则截断一个或多个表,多个表以','分隔
PROCEDURE TRUNCATE_TABLE(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:修改表列,如添加表列、修改表列类型、删除表列
PROCEDURE UPDATE_SINGLE_TABLE(
    DBUSER                 IN VARCHAR2:=USER,        --用户名
    pTBNAME             IN VARCHAR2,                     --表名
    pOPERATETYPE     IN VARCHAR2,                   --操作类型
    pCOLNAME             IN VARCHAR2,                   --列名
    pCOLTYPE             IN VARCHAR2                     --列类型、是否为空、默认值拼接字符串
);

--功能:重新编译所有类型、视图、触发器、函数、过程、包,但不包括该包
PROCEDURE RECOMPILE_ALL_PROJECT(DBUSER IN VARCHAR2:=USER);

--功能:让索引失效,在进行DML操作的时候可以先让索引失效,再操作,完成之后再重建索引
PROCEDURE UNUSABLE_INDEX(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:重建用户下的索引,pTABLENAME为NULL则重建所有索引,不为NULL则重建一个或多个表的索引,多个表以','分隔
PROCEDURE REBUILD_INDEX(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:禁用用户的所有约束
PROCEDURE DISABLE_CONSTRAINT(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:启用用户的所有约束
PROCEDURE ENABLE_CONSTRAINT(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:禁用用户的主键,在进行DML操作的时候可以先让主键失效,再操作,完成之后再启用主键
PROCEDURE DISABLE_PRIMARYKEY(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:启用用户的主键,pTABLENAME为NULL则启用所有表的主键,不为NULL则启用一个或多个表的主键,多个表以','分隔
PROCEDURE ENABLE_PRIMARYKEY(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:禁用用户的外键
PROCEDURE DISABLE_FOREIGNKEY(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:启用用户的外键
PROCEDURE ENABLE_FOREIGNKEY(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:禁用用户的触发器,在进行DML操作的时候可以先禁用触发器,再操作,完成之后再启用触发器
PROCEDURE DISABLE_TRIGGER(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:启用用户的触发器,pTABLENAME为NULL则启用所有表的触发器,不为NULL则启用一个或多个表的触发器,多个表以','分隔
PROCEDURE ENABLE_TRIGGER(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2:=NULL
);

--功能:基于时间戳闪回表数据,错误则输出错误消息
PROCEDURE FLASHBACK_TABLE(
  DBUSER     IN VARCHAR2:=USER,
  pTBNAME IN VARCHAR2,
  pDATE     IN VARCHAR2
);

--功能:基于时间戳闪回表数据,错误则输出错误消息,此处将闪回所有表
PROCEDURE FLASHBACK_ALL_TABLE(
  DBUSER  IN VARCHAR2:=USER,
  pDATE   IN VARCHAR2
);

--功能:将大文本字段保存到指定目录下的文件中
PROCEDURE CLOB_TO_FILE(
  DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
  CLOBTXT         IN CLOB                              --大文本字段
);

--功能:将字符串(最大长度为32767)保存到指定目录下的文件中,此过程功能同CLOB_TO_FILE
PROCEDURE VARCHAR_TO_FILE(
  DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称,包括后缀名
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
  CLOBTXT         IN VARCHAR2                     --字符串
);

--功能:查询表数据并将表的列的每一行按照顺序写入文件中,此处只支持表中返回单列数据,注意:每一列的值不能超过32767个字节
PROCEDURE CURSOR_TO_FILE(
    DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称,包括后缀名
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
    pRFECUR         IN SYS_REFCURSOR                                --查询游标结果集
);

--功能:读取下一行数据,如果读取到最后一行返回NULL.
PROCEDURE GET_NEXTLINE(
  pFILED         UTL_FILE.FILE_TYPE,
  pTEXT         OUT VARCHAR2,
  pHAVEDATA OUT BOOLEAN
);

--功能:将指定目录下的文件读取到CLOB字段中.注意:如果是使用系统目录,用户必须有访问目录的权限,否则会报ORA-29289:拒绝访问目录的错误.
PROCEDURE FILE_TO_CLOB(
  DIR             IN     VARCHAR2,
  FILENAME     IN     VARCHAR,
  CLOBTXT     OUT CLOB
);
END;
/
create or replace PACKAGE BODY PKG_DBMANAGE 
AS 
FUNCTION SQL_ERROR
--功能:根据错误代号获取系统错误消息
--参数:pCODE-错误代号
--调用:SELECT PKG_DBMANAGE.SQL_ERROR(-01339) FROM DUAL
--日期:2013-03-6
(
  pCODE IN NUMBER
)
RETURN VARCHAR2
IS
    pMSG VARCHAR2(1000);
BEGIN
  pMSG:=SQLERRM(pCODE);
  IF pMSG LIKE '%: Message%' OR pMSG LIKE '%: non-ORACLE%' THEN
    pMSG:='系统未定义该异常!';
  END IF;
  RETURN pMSG;
END;

FUNCTION ALL_SQLERROR
--功能:获取系统所有错误代号和错误消息字典
--参数:
--调用:SELECT * FROM TABLE(PKG_DBMANAGE.ALL_SQLERROR()) 
--日期:2013-03-6
RETURN ERRORLIST PIPELINED
IS 
    pMSG                 VARCHAR2(1000); 
    pERRORINFO     ERRORINFO; 
BEGIN   
  FOR X IN -20000..20000 
    LOOP 
    pMSG:=SQLERRM(X);
    IF pMSG NOT LIKE '%: Message%' AND pMSG NOT LIKE '%: non-ORACLE%' THEN 
      pERRORINFO.CODE:=X;
      pERRORINFO.ERRMSG:=pMSG;
      PIPE ROW(pERRORINFO); 
    END IF; 
  END LOOP;
  RETURN;
END; 

FUNCTION IS_SYSTEMUSER 
--功能:判断用户是否是系统用户
--参数:
--调用:SELECT * FROM TABLE(PKG_DBMANAGE.ALL_SQLERROR()) 
--日期:2013-03-6 
(
    pUSER IN VARCHAR2
)
RETURN BOOLEAN
IS
    RTN BOOLEAN:=FALSE;
BEGIN
    IF INSTR(','||SYSTEM_USER||',',','||TRIM(pUSER)||',',1)>0 THEN   --如果传递的用户名在系统用户常量中存在返回TRUE
        RTN:=TRUE;
    END IF;
    RETURN RTN;
END;

PROCEDURE CREATE_USER
--功能:建立用户或者修改用户密码,不存在则新建,存在则修改用户密码
--参数:pUSERNAME-用户名称,pUSERPWD-用户密码
--调用:EXEC PKG_DBMANAGE.CREATE_USER('DKGLL','3221160');
--日期:2013-03-8
(
    pUSERNAME IN VARCHAR2,
    pUSERPWD     IN VARCHAR2
)
AS
    pCOUNT PLS_INTEGER;
BEGIN
  IF pUSERNAME IS NOT NULL AND pUSERPWD IS NOT NULL THEN                                    --用户名、密码均不能为空
    SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_USERS WHERE UPPER(USERNAME)=UPPER(pUSERNAME);  --查询用户是否存在
    IF pCOUNT=0 THEN                                                                        --用户不存在则进行添加,存在则使用已有用户
      EXECUTE IMMEDIATE 'CREATE USER '||pUSERNAME||' IDENTIFIED BY '||pUSERPWD;             --创建用户
    ELSE                                                                                    --用户存在则修改用户密码
      EXECUTE IMMEDIATE 'ALTER USER '||pUSERNAME||' IDENTIFIED BY '||pUSERPWD;              --修改用户密码      
    END IF;
  ELSE
    SYS.DBMS_OUTPUT.PUT_LINE('执行出错:用户名、密码名称不能为空!');
  END IF;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN 
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE GRANT_USER
--功能:授予用户最高权限,仅供测试,可用'sysdba'用户登录进行授权操作,不建议在生产环境使用
--参数:pUSERNAME-用户名称
--调用:EXEC PKG_DBMANAGE.GRANT_USER('DKGLL');
--日期:2013-03-6
(
  pUSERNAME IN VARCHAR2
)
AS
    pNEWUSER VARCHAR2(200):=UPPER(pUSERNAME);
BEGIN 
  -- 解锁
  EXECUTE IMMEDIATE 'ALTER USER '||pNEWUSER||' ACCOUNT UNLOCK';
  -- ROLES
  EXECUTE IMMEDIATE 'GRANT "OLAP_XS_ADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "WFS_USR_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "DELETE_CATALOG_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "HS_ADMIN_SELECT_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "CWM_USER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "SPATIAL_WFS_ADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OLAP_DBA" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OWB$CLIENT" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "RESOURCE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "APEX_ADMINISTRATOR_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OWB_DESIGNCENTER_VIEW" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "CTXAPP" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "SPATIAL_CSW_ADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "GATHER_SYSTEM_STATISTICS" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "AUTHENTICATEDUSER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "CONNECT" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "HS_ADMIN_EXECUTE_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "LOGSTDBY_ADMINISTRATOR" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVADEBUGPRIV" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "XDB_WEBSERVICES_WITH_PUBLIC" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "XDBADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "XDB_WEBSERVICES_OVER_HTTP" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "EXP_FULL_DATABASE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "CSW_USR_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OLAPI_TRACE_USER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVAIDPRIV" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "DBFS_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "ADM_PARALLEL_EXECUTE_TASK" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "AQ_ADMINISTRATOR_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVA_DEPLOY" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OEM_MONITOR" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "XDB_WEBSERVICES" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVAUSERPRIV" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "MGMT_USER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OWB_USER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVA_ADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JMXSERVER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "EXECUTE_CATALOG_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "SCHEDULER_ADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "DATAPUMP_IMP_FULL_DATABASE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "WM_ADMIN_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "ORDADMIN" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "AQ_USER_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "DATAPUMP_EXP_FULL_DATABASE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "SELECT_CATALOG_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "RECOVERY_CATALOG_OWNER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OLAP_USER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "DBA" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "JAVASYSPRIV" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "XDB_SET_INVOKER" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "IMP_FULL_DATABASE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "HS_ADMIN_ROLE" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "EJBCLIENT" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT "OEM_ADVISOR" TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'ALTER USER '||pNEWUSER||' DEFAULT ROLE "OLAP_XS_ADMIN","WFS_USR_ROLE","DELETE_CATALOG_ROLE",
    "HS_ADMIN_SELECT_ROLE","CWM_USER","SPATIAL_WFS_ADMIN","OLAP_DBA","OWB$CLIENT","RESOURCE","APEX_ADMINISTRATOR_ROLE",
    "OWB_DESIGNCENTER_VIEW","CTXAPP","SPATIAL_CSW_ADMIN",    "GATHER_SYSTEM_STATISTICS","AUTHENTICATEDUSER","CONNECT",
    "HS_ADMIN_EXECUTE_ROLE","LOGSTDBY_ADMINISTRATOR","JAVADEBUGPRIV","XDB_WEBSERVICES_WITH_PUBLIC",    "XDBADMIN",
    "XDB_WEBSERVICES_OVER_HTTP","EXP_FULL_DATABASE","CSW_USR_ROLE","OLAPI_TRACE_USER","JAVAIDPRIV","DBFS_ROLE",
    "ADM_PARALLEL_EXECUTE_TASK",    "AQ_ADMINISTRATOR_ROLE","JAVA_DEPLOY","OEM_MONITOR","XDB_WEBSERVICES","JAVAUSERPRIV",
    "MGMT_USER","OWB_USER","JAVA_ADMIN","JMXSERVER","EXECUTE_CATALOG_ROLE",    "SCHEDULER_ADMIN","DATAPUMP_IMP_FULL_DATABASE",
    "WM_ADMIN_ROLE","ORDADMIN","AQ_USER_ROLE","DATAPUMP_EXP_FULL_DATABASE","SELECT_CATALOG_ROLE","RECOVERY_CATALOG_OWNER",
    "OLAP_USER","DBA","JAVASYSPRIV","XDB_SET_INVOKER","IMP_FULL_DATABASE","HS_ADMIN_ROLE","EJBCLIENT","OEM_ADVISOR"';
  
  -- SYSTEM PRIVILEGES
  EXECUTE IMMEDIATE 'GRANT ALTER TABLESPACE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY TRIGGER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE USER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY OUTLINE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT FLASHBACK ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY SEQUENCE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY LIBRARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ADMINISTER SQL MANAGEMENT OBJECT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UPDATE ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UPDATE ANY CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE TRIGGER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY EVALUATION CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE TABLESPACE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DEBUG CONNECT SESSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY DIRECTORY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE SEQUENCE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ON COMMIT REFRESH TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY SEQUENCE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY SQL PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY SQL PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ADMINISTER ANY SQL TUNING SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ADVISOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY OPERATOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY DIRECTORY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY INDEX TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT BECOME USER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MANAGE TABLESPACE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ROLLBACK SEGMENT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE OPERATOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER PUBLIC DATABASE LINK TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY INDEXTYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY CLASS TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY MATERIALIZED VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY TRANSACTION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ANALYZE ANY DICTIONARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE EXTERNAL JOB TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT INSERT ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE LIBRARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE JOB TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY OPERATOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY RULE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY LIBRARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY SEQUENCE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP PUBLIC SYNONYM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE CLUSTER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT FORCE ANY TRANSACTION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UPDATE ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE EVALUATION CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY CUBE BUILD PROCESS TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY OPERATOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP USER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY INDEXTYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY EDITION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT LOCK ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CHANGE NOTIFICATION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT READ ANY FILE GROUP TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY RULE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXEMPT IDENTITY POLICY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ROLLBACK SEGMENT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE RULE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SYSOPER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT INSERT ANY MEASURE FOLDER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SYSDBA TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ANALYZE ANY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY EDITION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY TRIGGER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MANAGE ANY FILE GROUP TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY RULE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ROLLBACK SEGMENT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT FLASHBACK ARCHIVE ADMINISTER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY RULE SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY SEQUENCE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY RULE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY LIBRARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT FORCE TRANSACTION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY JOB TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY ROLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DELETE ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY CLUSTER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UPDATE ANY CUBE BUILD PROCESS TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY INDEXTYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ADMINISTER SQL TUNING SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY PROGRAM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER DATABASE LINK TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT GRANT ANY PRIVILEGE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MERGE ANY VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY EVALUATION CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY OPERATOR TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT COMMENT ANY MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY ROLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE CUBE BUILD PROCESS TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY RULE SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY TRIGGER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UNDER ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT BACKUP ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE SYNONYM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY CUBE BUILD PROCESS TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER DATABASE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY LIBRARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE RULE SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXEMPT ACCESS POLICY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY CLUSTER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY INDEX TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXECUTE ANY EVALUATION CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER RESOURCE COST TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY CLUSTER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE PUBLIC SYNONYM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY INDEX TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY MINING MODEL TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT GLOBAL QUERY REWRITE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY RULE SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE MEASURE FOLDER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ROLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT RESTRICTED SESSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER USER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY SYNONYM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY OUTLINE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ENQUEUE ANY QUEUE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY EVALUATION CONTEXT TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DEQUEUE ANY QUEUE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT QUERY REWRITE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT EXPORT FULL DATABASE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE PUBLIC DATABASE LINK TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT RESUMABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UNDER ANY VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY OUTLINE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY EDITION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY ASSEMBLY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY INDEXTYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY MATERIALIZED VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE INDEXTYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY SQL PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER SYSTEM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY SYNONYM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT GRANT ANY ROLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE MATERIALIZED VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY RULE SET TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MANAGE SCHEDULER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP TABLESPACE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT SELECT ANY DICTIONARY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT IMPORT FULL DATABASE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DELETE ANY MEASURE FOLDER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DELETE ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT AUDIT SYSTEM TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY MATERIALIZED VIEW TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DEBUG ANY PROCEDURE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE PROFILE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY MEASURE FOLDER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT UNDER ANY TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT COMMENT ANY TABLE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER ANY DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE ANY TYPE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP ANY MEASURE FOLDER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT DROP PUBLIC DATABASE LINK TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE CUBE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT CREATE DATABASE LINK TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT INSERT ANY CUBE DIMENSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ALTER SESSION TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MANAGE ANY QUEUE TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT ADMINISTER DATABASE TRIGGER TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT AUDIT ANY TO '||pNEWUSER||' WITH ADMIN OPTION';
  EXECUTE IMMEDIATE 'GRANT MANAGE FILE GROUP TO '||pNEWUSER||' WITH ADMIN OPTION';
  COMMIT;
  EXCEPTION
    WHEN OTHERS THEN 
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'用户授权时出错:' ||SQLERRM);
    ROLLBACK; 
END; 

PROCEDURE CREATE_TABLESPACE
--功能:建立表空间,不存在则新建,存在则可选是删除重建(当前表空间必须处于离线状态)还是使用已有表空间
--参数:见下方说明
--调用:EXECUTE PKG_DBMANAGE.CREATE_TABLESPACE('TBS1');
--日期:2013-03-8
(
  pTABLESPACE       IN VARCHAR2,          --表空间名
  pDATADIR          IN VARCHAR2:=NULL,    --数据文件目录
  pDATAFILE         IN VARCHAR2:=NULL,    --数据文件名称
  pDATASIZE         IN NUMBER:=500,       --数据文件初始大小,单位为MB
  pAUTOEXTENDSIZE   IN NUMBER:=200,       --数据文件增长幅度,单位为MB
  pTABLESACEEXISTS  IN VARCHAR2:='DROP'   --表空间存在是否删除
)
AS
    pCOUNT                             PLS_INTEGER;
    pNEWDATADIR                 VARCHAR2(200):=pDATADIR;  --保存修正后的数据目录名
    pNEWDATAFILE                 VARCHAR2(200):=pDATAFILE;    --保存修正后的数据文件名
    pFILENAME                     VARCHAR2(400):=NULL;
    pNEWDATASIZE                 NUMBER(5);                --保存修正后的数据文件初始大小,此处限制大小在100M-10G之间,不在此范围取默认值500
    pNEWAUTOEXTENDSIZE     NUMBER(5);                --保存修正后的数据文件增长幅度,此处限制大小在10M-10G之间,不在此范围取默认值200
    pSQLSTR                         VARCHAR2(2000):=NULL;
    pSQLSTR1                         VARCHAR2(200):=NULL;
    pSQLSTR2                         VARCHAR2(1000):=NULL;
BEGIN 
  IF pTABLESPACE IS NOT NULL THEN                                                     --表空间名称均不能为空   
    SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_DATA_FILES 
            WHERE UPPER(TABLESPACE_NAME)=UPPER(pTABLESPACE);                                    --查询表空间是否存在
    IF pCOUNT<>0 AND UPPER(pTABLESACEEXISTS)='DROP' THEN                              --表空间存在并且条件为“删除”则删除表空间的对应数据和数据文件
      EXECUTE IMMEDIATE 'DROP TABLESPACE '||pTABLESPACE||' INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINT';
    END IF;
    IF pCOUNT=0 OR (pCOUNT<>0 AND UPPER(pTABLESACEEXISTS)='DROP') THEN    --表空间不存在,或者表空间需要重建  
      IF pDATADIR IS NULL THEN                                                                                --如果参数数据文件目录为空,则取系统目录
        SELECT SUBSTR(FILE_NAME,1,INSTR(FILE_NAME,'SYSTEM',1,1)-1) INTO pNEWDATADIR 
                    FROM SYS.DBA_DATA_FILES WHERE TABLESPACE_NAME='SYSTEM';              --查找系统表空间目录
      END IF;
      IF pDATAFILE IS NULL THEN                                                                               --如果参数数据文件名为空,则取当前表空间名称
        pNEWDATAFILE:=pTABLESPACE||'01.DBF';
      END IF;
      pFILENAME:=pNEWDATADIR||pNEWDATAFILE; 
      SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_DATA_FILES 
                WHERE UPPER(FILE_NAME)=UPPER(pFILENAME);                                          --查询当前数据文件是否存在
      IF pCOUNT<>0 THEN                                                 --如果存在则取用新的名称
        pFILENAME:=pNEWDATADIR||pTABLESPACE||SYS_GUID()||'.DBF';          --用GUID进行编码命名
      END IF; 
      SELECT CASE WHEN pDATASIZE>100 AND pDATASIZE<10000 THEN pDATASIZE ELSE 500 END,
                CASE WHEN pAUTOEXTENDSIZE>100 AND pAUTOEXTENDSIZE<10000 THEN pAUTOEXTENDSIZE ELSE 500 END
        INTO pNEWDATASIZE,pNEWAUTOEXTENDSIZE FROM DUAL;                      --修正数据文件初始大小和数据文件增长幅度
      pSQLSTR1:='CREATE TABLESPACE '||pTABLESPACE||' DATAFILE ''';
      pSQLSTR2:=''' SIZE '||pNEWDATASIZE||'M'||CHR(10)||
            'AUTOEXTEND ON NEXT '||pNEWAUTOEXTENDSIZE||'M'||CHR(10)|| 
            'MAXSIZE UNLIMITED'||CHR(10)|| 
            'LOGGING EXTENT MANAGEMENT LOCAL'||CHR(10)||
            'SEGMENT SPACE MANAGEMENT AUTO';   
      pSQLSTR:=pSQLSTR1||pFILENAME||pSQLSTR2; 
      EXECUTE IMMEDIATE pSQLSTR;
    END IF;
  ELSE
    SYS.DBMS_OUTPUT.PUT_LINE('执行出错:表空间名称不能为空!');
  END IF;
  COMMIT;
  EXCEPTION 
    WHEN REFUSE_DATA_FILE THEN         --此时可能由于存在同名文件导致创建数据文件失败,因此文件名采用guid编码
        pSQLSTR:=pSQLSTR1||pNEWDATADIR||pTABLESPACE||SYS_GUID()||'.DBF'||pSQLSTR2; 
        EXECUTE IMMEDIATE pSQLSTR;
    WHEN OTHERS THEN 
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
        ROLLBACK;
END;

PROCEDURE CREATE_USERANDTABLESPACE
--功能:建立用户和表空间,配置用户管理员等权限,并将新建立的表空间指定为新建立用户的默认表空间
--参数:见下方说明
--调用:EXECUTE PKG_DBMANAGE.CREATE_USERANDTABLESPACE('DKGLL','DKGLL','TBS1');
--日期:2013-03-4
(
  pUSERNAME         IN VARCHAR2,          --用户名   
  pUSERPWD          IN VARCHAR2,          --密码
  pTABLESPACE       IN VARCHAR2,          --表空间名
  pDATADIR          IN VARCHAR2:=NULL,    --数据文件目录
  pDATAFILE         IN VARCHAR2:=NULL,    --数据文件名称
  pDATASIZE         IN NUMBER:=500,       --数据文件初始大小,单位为MB
  pAUTOEXTENDSIZE   IN NUMBER:=200,       --数据文件增长幅度,单位为MB
  pTABLESACEEXISTS  IN VARCHAR2:='DROP'   --表空间存在是否删除
)
AS
    pUSERCOUNT                 PLS_INTEGER;
    pTABLESPACECOUNT     PLS_INTEGER;
BEGIN  
  CREATE_USER(pUSERNAME,pUSERPWD);                                                                --创建用户
  SELECT COUNT(USER_ID) INTO pUSERCOUNT FROM SYS.DBA_USERS WHERE USERNAME=UPPER(pUSERNAME);       --判断用户是否存在,创建成功则进行下一步操作
  IF pUSERCOUNT=1 THEN
    GRANT_USER(pUSERNAME);                                                                        --用户授权 
    CREATE_TABLESPACE(pTABLESPACE,pDATADIR,pDATAFILE,pDATASIZE,pAUTOEXTENDSIZE,pTABLESACEEXISTS);    --建立表空间
    SELECT COUNT(TABLESPACE_NAME) INTO pTABLESPACECOUNT 
            FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME =UPPER(pTABLESPACE);                                                    --判断表空间是否存在,创建成功则进行下一步操作
    IF pTABLESPACECOUNT=1 THEN                                                                    --如果用户和表空间都存在,则进行绑定
      EXECUTE IMMEDIATE 'ALTER USER '||pUSERNAME||' DEFAULT TABLESPACE '||pTABLESPACE;            --修改用户默认表空间为指定表空间 
    ELSE 
      SYS.DBMS_OUTPUT.PUT_LINE('创建表空间失败,将终止下一步用户指定表空间的操作!');
    END IF;
  ELSE
    SYS.DBMS_OUTPUT.PUT_LINE('创建用户失败,将终止下一步用户授权和创建表空间的操作!');
  END IF;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN 
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
    ROLLBACK;
END; 

PROCEDURE CREATE_DBLINK
--功能:创建或修改数据库链接
--参数:见下方说明
--调用: 
/*
DECLARE PLINKNAME VARCHAR2(100);
BEGIN 
  PKG_DBMANAGE.CREATE_DBLINK(
    PHOST => '172.16.3.221',
    PLINKDB => 'TBS1',
    PLINKUSER => 'DKGLL',
    PLINKPWD => 'DKGLL',
    PLINKNAME => PLINKNAME
  );
  DBMS_OUTPUT.PUT_LINE('链接名称:'||PLINKNAME);
END;
*/
--日期:2013-02-10
(
    pHOST       IN VARCHAR2,                  --链接数据库主机地址,如果带有端口,可以写成类似127.0.0.1:1521的形式
    pLINKDB   IN VARCHAR2,                        --链接数据库名称    
    pLINKUSER IN VARCHAR2,                        --链接数据库用户名称
    pLINKPWD  IN VARCHAR2,                        --链接数据库用户登录密码
    pLINKNAME IN OUT VARCHAR2                    --链接名称
)
AS 
    pFULLHOST    VARCHAR2(200);
    pCOUNT         PLS_INTEGER;
    PROCEDURE    ADDDBLINK
    AS
    pLINKCOUNT NUMBER(10);
    BEGIN     
        pLINKNAME:=NVL(UPPER(pLINKNAME),CONCAT('DLINK_',TO_CHAR(SYSTIMESTAMP,'YYMMDDHH24MISSFF3')));  --传递链接名为空则取当前时间命名
        SELECT COUNT(DB_LINK) INTO pLINKCOUNT FROM USER_DB_LINKS WHERE DB_LINK=pLINKNAME;
        IF pLINKCOUNT>0 THEN     --存在重名链接则进行删除 
            EXECUTE IMMEDIATE 'DROP DATABASE LINK '||pLINKNAME;
        END IF;                                
        --链接名只能以字母开头,否则会报"ORA-01729: 需要数据库链接名"的错误
        EXECUTE IMMEDIATE 'CREATE DATABASE LINK '||pLINKNAME||' CONNECT TO '||pLINKUSER||' IDENTIFIED BY '||pLINKPWD||' USING '''||pFULLHOST||'''';
        COMMIT;
    END;
BEGIN      
    pLINKNAME:=UPPER(pLINKNAME);
    pFULLHOST:=UPPER(pHOST||'/'||pLINKDB);
    SELECT COUNT(DB_LINK) INTO pCOUNT FROM USER_DB_LINKS 
        WHERE DB_LINK=NVL(pLINKNAME,DB_LINK) AND UPPER(HOST)=pFULLHOST AND USERNAME=UPPER(pLINKUSER);
    IF pCOUNT=0 THEN                                                                                                     --链接不存在直接创建
        ADDDBLINK;
    ELSE                                                                                                                            --取出存在具有相同主机地址和用户名的链接,此处只取出第一个链接
        SELECT DB_LINK INTO pLINKNAME FROM USER_DB_LINKS 
            WHERE DB_LINK=NVL(pLINKNAME,DB_LINK) AND UPPER(HOST)=pFULLHOST AND USERNAME=UPPER(pLINKUSER) AND ROWNUM=1;
        EXECUTE IMMEDIATE 'SELECT * FROM DUAL@'||pLINKNAME;                         --测试链接是否有效(无此链接、连接超时)    
    END IF;
    EXCEPTION
    WHEN NO_DBLINK OR CONN_TIMEOUT    THEN                                                        --链接不存在或无效,则进行重建
        ADDDBLINK;
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'创建数据库链接失败:' ||SQLERRM||',链接名:'||pLINKNAME);        
        ROLLBACK; 
END;

PROCEDURE CREATE_DIRECTORY
--功能:创建数据库目录
--参数:
--调用:
/*
DECLARE DIR VARCHAR2(100);
BEGIN
  DIR:='DIR1';
  PKG_DBMANAGE.CREATE_DIRECTORY('D:',DIR);
END;
*/
--日期:2014-05-13
(
  FILEPATH    IN VARCHAR2,          --文件全路径
  DIR                 IN OUT VARCHAR2           --目录名称 
)
AS
  pCOUNT  NUMBER(2);
  pSQL    VARCHAR2(2000); 
BEGIN
  SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_DIRECTORIES WHERE UPPER(DIRECTORY_PATH)=UPPER(FILEPATH);
  IF pCOUNT=0 THEN                      --目录不存在则进行创建 
    DIR:=NVL(DIR,'PKG_DBMANAGER_DIR');  --目录名称为空名称则为'PKG_DBMANAGER_DIR'
    pSQL:='CREATE DIRECTORY '||DIR||' AS '''||FILEPATH||''''; 
    EXECUTE IMMEDIATE pSQL;
  ELSE                                  --目录存在则取出第一个符合要求的目录名称
    SELECT DIRECTORY_NAME INTO DIR FROM SYS.DBA_DIRECTORIES WHERE UPPER(DIRECTORY_PATH)=UPPER(FILEPATH) AND ROWNUM=1;
  END IF;
  EXCEPTION
  WHEN PKG_DBMANAGE.REFUSE_OPERATE_DIR THEN
    SYS.DBMS_OUTPUT.PUT_LINE('用户没有创建目录的权限,请先赋予用户操作权限!');
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
        ROLLBACK;
END;

PROCEDURE CLONE_TEMP_TB
--功能:克隆生成临时表/普通表,临时表/普通表结构类型与用户的对象表结构类型一致
--参数:
--调用:EXEC PKG_DBMANAGE.CLONE_TEMP_TB('USR_ROLETAB','TEMP_USR_ROLETAB');
--日期:2014-05-13
(
  pTBNAME       IN  VARCHAR2,         --表名称
  pCLONETBNAME  IN  VARCHAR2,         --克隆表名称
  IsTemporary   IN  VARCHAR2:='N'     --1:默认为普通表。其他为临时表
)
AS
  pSQL      VARCHAR(4000);
  pFORM     VARCHAR2(1000);
  pLINKFORM VARCHAR2(1000);
  pCOUNT    NUMBER(2);
BEGIN
  SELECT COUNT(1) INTO pCOUNT FROM SYS.USER_TABLES WHERE TABLE_NAME=pCLONETBNAME;
  IF pCOUNT=0 THEN        --临时表/普通表不存在则直接进行克隆
    IF IsTemporary<>'N' THEN
      pSQL:='CREATE GLOBAL TEMPORARY TABLE '||pCLONETBNAME||' AS SELECT * FROM '||pTBNAME||' WHERE 1=2';
    ELSE
      pSQL:='CREATE TABLE '||pCLONETBNAME||' AS SELECT * FROM '||pTBNAME||' WHERE 1=2';    
    END IF;
    EXECUTE IMMEDIATE pSQL;
  ELSE                    --临时表/普通表存在判断结构类型是否一致,如果不一致则进行重建
    pSQL:=Q'{SELECT B.COLUMN_NAME AS COLUMNNAME,
      CASE DATA_TYPE
      WHEN 'NUMBER' THEN REPLACE(B.DATA_TYPE||'('||NVL(TO_CHAR(B.DATA_PRECISION),'*')||','||NVL(TO_CHAR(B.DATA_SCALE),'*')||')','(*,*)','')
      WHEN 'VARCHAR2' THEN B.DATA_TYPE||'('||B.CHAR_LENGTH||')'
      ELSE B.DATA_TYPE
      END AS ORACLETYPE FROM }';
    SELECT 'SYS.USER_TABLES A JOIN SYS.USER_TAB_COLUMNS B ON (A.TABLE_NAME=B.TABLE_NAME) WHERE A.TEMPORARY='''||DECODE(IsTemporary,'N','N','Y')||''' AND A.TABLE_NAME='''||pTBNAME||''''
      INTO pLINKFORM FROM DUAL; 
    SELECT 'SYS.USER_TABLES A JOIN SYS.USER_TAB_COLUMNS B ON (A.TABLE_NAME=B.TABLE_NAME) WHERE A.TEMPORARY='''||DECODE(IsTemporary,'N','N','Y')||''' AND A.TABLE_NAME='''||pCLONETBNAME||''''
      INTO pFORM FROM DUAL;
    pSQL:='SELECT COUNT(1) FROM('||pSQL||pLINKFORM||' MINUS '||pSQL||pFORM||')';
    EXECUTE IMMEDIATE pSQL INTO pCOUNT;
    IF pCOUNT <>0 THEN    --表结构或者类型不一致删除重建
      pSQL:='DROP TABLE '||pCLONETBNAME;
      EXECUTE IMMEDIATE pSQL;
      IF IsTemporary<>'N' THEN
        pSQL:='CREATE GLOBAL TEMPORARY TABLE '||pCLONETBNAME||' AS SELECT * FROM '||pTBNAME||' WHERE 1=2';
      ELSE      
        pSQL:='CREATE TABLE '||pCLONETBNAME||' AS SELECT * FROM '||pTBNAME||' WHERE 1=2';
      END IF;
      EXECUTE IMMEDIATE pSQL;
    END IF;
  END IF;
  EXCEPTION
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'克隆临时表出现异常:' ||SQLERRM);
END;

PROCEDURE CLONE_EXTERNAL_TB
--功能:克隆生成外部表,外部表结构类型与用户的对象表结构类型一致
--参数:
--调用:EXEC PKG_DBMANAGE.CLONE_EXTERNAL_TB('PKG_DBMANAGER_DIR','USR_INFOTAB');
--日期:2014-05-13
(
  DIR                 IN  VARCHAR2,             --保存外部表数据的文件目录名称  
  pTBLIST     IN  VARCHAR2          --表名称,多个表以','分隔
)
AS
pCOUNT          PLS_INTEGER;        --查询外部表数量
pSINGLETBNAME   VARCHAR2(50);       --外部表名称
pCOLNAME        VARCHAR2(50);
pORACLETYPE     VARCHAR2(100);
pEXTERNALETYPE  VARCHAR2(200);
pCOLTEXT        VARCHAR2(4000);     --列名称、类型集合文本
pEXTERCOLTEXT   VARCHAR2(4000);     --外部表数据名称、类型集合文本
pSQL            VARCHAR2(4000);     --拼接的SQL语句文本
pFILENAME       VARCHAR2(200);      --外部表数据文本
BEGIN 
  FOR CUR_ITEM IN                   --创建所有外部表
    (
        SELECT TABLE_NAME FROM SYS.USER_TABLES
            WHERE (INSTR(','||pTBLIST||',',','||TABLE_NAME||',',1)>0)
    )
  LOOP  
    pCOLTEXT:='';
    pEXTERCOLTEXT:='';
    pSINGLETBNAME:='EXT_'||CUR_ITEM.TABLE_NAME;
    pFILENAME:=CUR_ITEM.TABLE_NAME||'.txt';       --此处采用表名命名数据文件名称的方式
    SELECT COUNT(1) INTO pCOUNT FROM SYS.USER_TABLES WHERE TABLE_NAME=pSINGLETBNAME;
    IF pCOUNT<>0 THEN                             --如果外部表存在,则进行删除操作
      EXECUTE IMMEDIATE 'DROP TABLE '||pSINGLETBNAME;
    END IF;
    pSQL:='CREATE TABLE "'||pSINGLETBNAME||'"'||CHR(10)||'('||CHR(10);
    FOR X IN
    (
      SELECT B.COLUMN_NAME,B.DATA_TYPE,B.DATA_PRECISION,B.DATA_SCALE,B.CHAR_LENGTH
        FROM SYS.USER_TABLES A JOIN SYS.USER_TAB_COLUMNS B ON (A.TABLE_NAME=B.TABLE_NAME) WHERE A.TABLE_NAME=CUR_ITEM.TABLE_NAME
    ) 
    LOOP
      pCOLNAME:='"'||X.COLUMN_NAME||'"';
      SELECT DECODE(X.DATA_TYPE,
          'DATE','DATE',
          'NUMBER',REPLACE(X.DATA_TYPE||'('||NVL(TO_CHAR(X.DATA_PRECISION),'*')||','||NVL(TO_CHAR(X.DATA_SCALE),'*')||')','(*,*)',''),
          'VARCHAR2',X.DATA_TYPE||'('||X.CHAR_LENGTH||')',
          X.DATA_TYPE),
        DECODE(X.DATA_TYPE,
          'DATE','DATE "YYYY-MM-DD HH24:MI:SS"',
          'NUMBER','CHAR(50)',
          'VARCHAR2','CHAR('||X.CHAR_LENGTH||')',
          'CHAR(255)')
        INTO pORACLETYPE,pEXTERNALETYPE FROM DUAL;
      pCOLTEXT:=pCOLTEXT||'  '||pCOLNAME||' '||pORACLETYPE||','||CHR(10);
      pEXTERCOLTEXT:=pEXTERCOLTEXT||'      '||pCOLNAME||' '||pEXTERNALETYPE||CHR(10)||'        TERMINATED BY "," OPTIONALLY ENCLOSED BY ''"''';
      IF X.DATA_TYPE LIKE 'TIMESTAMP%' THEN
        pEXTERCOLTEXT:=pEXTERCOLTEXT||CHR(10)||'        DATE_FORMAT TIMESTAMP MASK "YYYY-MM-DD HH24:MI:SS.FF3"'||CHR(10);
      ELSE  
        pEXTERCOLTEXT:=pEXTERCOLTEXT||','||CHR(10);
      END IF;
    END LOOP;
    pSQL:=pSQL||RTRIM(RTRIM(pCOLTEXT,CHR(10)),',')||CHR(10)||')'||CHR(10)||
      'ORGANIZATION EXTERNAL'||CHR(10)||
      '('||CHR(10)||
      '  TYPE ORACLE_LOADER'||CHR(10)||
      '  DEFAULT DIRECTORY "'||DIR||'"'||CHR(10)|| 
      '  ACCESS PARAMETERS'||CHR(10)||
      '  ('||CHR(10)||
      '    RECORDS DELIMITED BY NEWLINE CHARACTERSET ZHS16GBK'||CHR(10)||
      '    BADFILE '''||DIR||''':'''||CUR_ITEM.TABLE_NAME||'.bad'''||CHR(10)||
      '    LOGFILE '''||CUR_ITEM.TABLE_NAME||'.log_xt'''||CHR(10)||
      '    READSIZE 1048576'||CHR(10)||
      '    FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY ''"'' LDRTRIM '||CHR(10)|| 
      '    ('||CHR(10)||RTRIM(RTRIM(pEXTERCOLTEXT,CHR(10)),',')||CHR(10)||  
      '    )'||CHR(10)||
      '  )'||CHR(10)||
      '  LOCATION'||CHR(10)||  
      '  ('||CHR(10)||  
      '    "'||DIR||'":'''||pFILENAME||''''||CHR(10)||  
      '  )'||CHR(10)||
      ') REJECT LIMIT UNLIMITED';
    SYS.DBMS_OUTPUT.PUT_LINE('/*SQL语句:*/'||CHR(10)||pSQL);
    --EXECUTE IMMEDIATE pSQL;
  END LOOP;
  EXCEPTION
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'克隆生成外部表出错:' ||SQLERRM||',发生在表:'||pSINGLETBNAME) ;
END;

PROCEDURE SETENVIRONMENT
--功能:设置用户登入次数、连接数、口令有效期为'无限制'
--参数:
--调用:EXEC PKG_DBMANAGE.SETENVIRONMENT;
--日期:2013-03-11
AS
BEGIN
    --将登入次数修改成“无限制”
    EXECUTE IMMEDIATE 'ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED';
    --将连接数修改成“无限制”
    EXECUTE IMMEDIATE 'ALTER SYSTEM SET OPEN_CURSORS=6000 SCOPE=BOTH';
    --将口令有效期默认值180天修改成“无限制”
    EXECUTE IMMEDIATE 'ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED';
    COMMIT;
        EXCEPTION
         WHEN OTHERS THEN
         ROLLBACK;
END;

PROCEDURE KILL_SESSION
--功能:杀死当前运行的所有用户会话进程,强行解除死锁
--参数:无
--调用:EXECUTE PKG_DBMANAGE.KILL_SESSION;
--日期:2013-02-10
AS
BEGIN
  FOR X IN (SELECT  SID,SERIAL# FROM V$SESSION WHERE USERNAME=USER AND AUDSID<>USERENV('SESSIONID') AND TYPE='USER')
    LOOP
  BEGIN
    EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION '''||X.SID||','||X.SERIAL#||''' IMMEDIATE';
    COMMIT;
    EXCEPTION 
      WHEN OTHERS THEN
      NULL;
  END;
  END LOOP;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'中止会话无效:' ||SQLERRM);
END; 

PROCEDURE KILL_SESSION_LOCK
--功能:杀死锁表的用户进程
--参数:无
--调用:EXECUTE PKG_DBMANAGE.KILL_SESSION_LOCK;
--日期:2014-08-22
AS
BEGIN
  FOR X IN 
  (
    SELECT A.SID,A.SERIAL#  FROM  V$SESSION A JOIN(
      SELECT DISTINCT SID,LISTAGG(OBJECT_NAME,',') WITHIN GROUP(ORDER BY 1) OVER(PARTITION BY SID) AS OBJECT_NAME FROM V$LOCK A JOIN USER_OBJECTS B ON A.ID1=B.OBJECT_ID      
    ) B ON A.SID=B.SID
    WHERE USERNAME=USER AND TYPE='USER'
  )
    LOOP
  BEGIN
    EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION '''||X.SID||','||X.SERIAL#||''' IMMEDIATE';
    COMMIT;
    EXCEPTION 
      WHEN OTHERS THEN
      NULL;
  END;
  END LOOP;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'中止会话无效:' ||SQLERRM);
END; 

PROCEDURE DROP_ALL_OBJECT 
--功能:删除用户下所有的结构关系,基于安全和稳定性考虑,暂定部分系统用户对象不允许删除
--参数:DBUSER-数据库用户,TAG-结构类型,见下方说明
--调用:EXECUTE PKG_DBMANAGE.DROP_ALL_OBJECT('DIP','2');
--日期:2013-02-10
(
  DBUSER     IN VARCHAR2:=USER,
  TAG         IN NUMBER:=0
)
--操作均基于指定用户下进行,其他用户不做处理
--0.删除全部
--1.删除实体化视图
--2.删除视图
--3.删除函数
--4.删除过程
--5.删除类型
--6.删除包
--7.删除触发器
--8.删除表(解除主键关系再删除)
--9.删除序列
--10.删除同义词
--11.删除数据库链接
--12.删除聚集
--13.删除目录
--14.删除JAVA程序
--15.清空作业
--16.清空回收站
AS  
    pUSER         VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
    --表、视图、函数、过程、类型、包、触发器、序列、同义词、数据库链接、聚集、目录、JAVA程序
    CURSOR         CUR_OBJECTS
    IS 
        SELECT * FROM SYS.DBA_OBJECTS
            WHERE OWNER=pUSER 
                AND OBJECT_NAME<>'PKG_DBMANAGE'                         --不能删除该包和关联包
                AND OBJECT_NAME||OBJECT_TYPE NOT IN
                (
                    SELECT  OBJECT_NAME||'TABLE'
                        FROM SYS.DBA_OBJECTS
                        WHERE OWNER=pUSER AND OBJECT_TYPE='MATERIALIZED VIEW'
                )
            AND OBJECT_TYPE IN('MATERIALIZED VIEW','VIEW','FUNCTION','PROCEDURE','TYPE','PACKAGE','TRIGGER','TABLE','SEQUENCE','SYNONYM',
                'DATABASE LINK','CLUSTER','DIRECTORY','JAVA SOURCE','JAVA CLASS') AND OBJECT_TYPE=DECODE(TAG,0,OBJECT_TYPE,1,'MATERIALIZED VIEW',
        2,'VIEW',3,'FUNCTION',4,'PROCEDURE',5,'TYPE',6,'PACKAGE',7,'TRIGGER',8,'TABLE',9,'SEQUENCE',10,'SYNONYM',11,'DATABASE LINK',
        12,'CLUSTER',13,'DIRECTORY',14,'JAVA SOURCE')
      ORDER BY DECODE(OBJECT_TYPE,'MATERIALIZED VIEW',1,'VIEW',2,'FUNCTION',3,'PROCEDURE',4,'TYPE',5,'PACKAGE',6,'TRIGGER',7,'TABLE',
        8,'SEQUENCE',9,'SYNONYM',10,'DATABASE LINK',11,'CLUSTER',12,'DIRECTORY',13,'JAVA SOURCE',14);
    --DBMS作业
    CURSOR         CUR_JOBS
    IS
        SELECT * FROM SYS.DBA_JOBS
            WHERE LOG_USER=pUSER AND schema_user=pUSER AND(TAG=0 OR TAG=15) ;
    OBJ_LIST     SYS.DBA_OBJECTS%ROWTYPE;
    JOB_LIST     SYS.DBA_JOBS%ROWTYPE;
    SQLTEXT     VARCHAR2(2000) ;
    pOUTOBJ     VARCHAR2(200) ;
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN (SELECT JOB_NAME FROM SYS.DBA_SCHEDULER_JOBS WHERE OWNER=pUSER AND (TAG=0 OR TAG=15)) 
        LOOP                                                                                                                                                                 --循环删除作业
            SYS.DBMS_SCHEDULER.DROP_JOB('"'||pUSER||'"."'||X.JOB_NAME||'"',FALSE,TRUE);             --强制删除
            pOUTOBJ:=X.JOB_NAME;
            SYS.DBMS_OUTPUT.PUT_LINE('删除作业:'||pOUTOBJ||'成功!');                                                        --输出提示信息
        END LOOP;
        --------------------------------------------
        OPEN CUR_OBJECTS;                                 --循环删除结构关系
        LOOP
            FETCH CUR_OBJECTS INTO OBJ_LIST;
            EXIT WHEN CUR_OBJECTS%NOTFOUND;
                SELECT 'DROP '||OBJ_LIST.OBJECT_TYPE||' "'||DECODE(OBJ_LIST.OBJECT_TYPE,'DATABASE LINK','',pUSER||'"."')||OBJ_LIST.OBJECT_NAME||'"' 
          INTO SQLTEXT FROM DUAL;
                IF (OBJ_LIST.OBJECT_TYPE='TABLE') THEN        --解除主外键关系
          IF (OBJ_LIST.TEMPORARY='Y') THEN
            EXECUTE IMMEDIATE 'TRUNCATE TABLE '||OBJ_LIST.OBJECT_NAME;  --删除临时表时先截断临时表,否则可能报ORA-14452的错误
          END IF;
                    SQLTEXT:=SQLTEXT||' CASCADE CONSTRAINTS';
                ELSIF (OBJ_LIST.OBJECT_TYPE='TYPE') THEN      --解除类型之间依赖
                    SQLTEXT:=SQLTEXT||' FORCE';
                END IF;
                EXECUTE IMMEDIATE SQLTEXT;         
                pOUTOBJ:=OBJ_LIST.OBJECT_NAME;    
                SYS.DBMS_OUTPUT.PUT_LINE('删除'||OBJ_LIST.OBJECT_TYPE||''||pOUTOBJ||'成功!');    --输出提示信息
        END LOOP;
        CLOSE CUR_OBJECTS;
        -------------------------------------------
        OPEN CUR_JOBS;                                    --循环删除DBMS作业
        LOOP
            FETCH CUR_JOBS INTO JOB_LIST;
            EXIT WHEN CUR_JOBS%NOTFOUND; 
            SYS.DBMS_JOB.REMOVE(JOB_LIST.JOB);              --根据作业号删除DBMS作业                
            pOUTOBJ:=JOB_LIST.JOB;
            SYS.DBMS_OUTPUT.PUT_LINE('删除DBMS作业:作业号('||JOB_LIST.JOB||')成功!');                 --输出提示信息
        END LOOP;
        CLOSE CUR_JOBS;    
        --------------------------------------------
        IF (TAG=0 OR TAG=16) THEN 
            EXECUTE IMMEDIATE 'PURGE USER_RECYCLEBIN';      --清空回收站        
            pOUTOBJ:='回收站';
            SYS.DBMS_OUTPUT.PUT_LINE('清理回收站成功!');                                                                            --输出提示信息
        END IF;
    ELSE                                                                                                 --暂定系统对象不允许删除
        NULL;
    END IF;
    COMMIT;
    EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除对象出错:'||SQLERRM||',发生在:'||pOUTOBJ);
    ROLLBACK;
END;

PROCEDURE DROP_OBJECT
--功能:基于指定用户下删除单个或多个结构(表、视图、函数、过程、类型、包、触发器、序列、数据库链接),但不能删除该包
--参数:DBUSER-数据库用户,pOBJECTNAME-结构名,多个结构名以','分隔
--调用:EXECUTE PKG_DBMANAGE.DROP_OBJECT('DIP','VIEW1') 
--日期:2013-02-10
(
  DBUSER             IN VARCHAR2:=USER,
  pOBJECTNAME IN VARCHAR2
)
AS
    pCOUNT             PLS_INTEGER;
    SQLTEXT         VARCHAR2(2000);
  pTRUNCTEXT  VARCHAR2(200);
    pUSER             VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);       --传递用户如果为''或者null则取当前用户进行操作      
    pSIGNLEOBJ     VARCHAR2(200);
BEGIN 
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT regexp_substr(pOBJECTNAME,'[^,]+',1,LEVEL) AS OBJNAME FROM DUAL 
                CONNECT BY LEVEL<=LENGTH(pOBJECTNAME)-LENGTH(REPLACE(pOBJECTNAME,',',''))+1
        ) 
        LOOP
            SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_OBJECTS
                WHERE OWNER=pUSER 
                AND OBJECT_TYPE IN('TABLE','VIEW','FUNCTION','PROCEDURE','TYPE','PACKAGE','TRIGGER','SEQUENCE','DATABASE LINK')
                AND OBJECT_NAME<>'PKG_DBMANAGE'                                              --不能删除该包 
                AND OBJECT_NAME=X.OBJNAME  
        AND NOT EXISTS (                                        --实体化视图默认会建立相同名称的表
          SELECT * FROM  SYS.DBA_OBJECTS WHERE OWNER=pUSER AND OBJECT_NAME=X.OBJNAME AND OBJECT_TYPE='MATERIALIZED VIEW'
        );
            pSIGNLEOBJ:=X.OBJNAME;
            IF pCOUNT=1 THEN 
                SELECT 'DROP '||OBJECT_TYPE||' "'||pUSER||'"."'||pSIGNLEOBJ||'"'||DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','TYPE',' FORCE',''),
          CASE WHEN OBJECT_TYPE='TABLE' AND TEMPORARY='Y' THEN 'TRUNCATE TABLE '||pSIGNLEOBJ ELSE NULL END
                    INTO SQLTEXT,pTRUNCTEXT FROM SYS.DBA_OBJECTS 
                    WHERE OWNER=pUSER AND OBJECT_NAME=pSIGNLEOBJ
                                          AND OBJECT_TYPE IN('TABLE','VIEW','FUNCTION','PROCEDURE','TYPE','PACKAGE','TRIGGER','SEQUENCE','DATABASE LINK');
        IF pTRUNCTEXT IS NOT NULL THEN                          --删除临时表时先截断临时表,否则可能报ORA-14452的错误
          EXECUTE IMMEDIATE pTRUNCTEXT;
        END IF;
                EXECUTE IMMEDIATE SQLTEXT;
                SYS.DBMS_OUTPUT.PUT_LINE('删除'||pSIGNLEOBJ||'成功!');        --输出提示信息
            END IF;
        END LOOP;
    ELSE                                                                --暂定系统对象不允许删除
        NULL;
    END IF;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除出错:'||SQLERRM||',发生在:'||pSIGNLEOBJ);
    ROLLBACK;
END;    

--功能:基于指定用户下删除单个主键、外键、约束
PROCEDURE DROP_CONSTRAINT
(
  DBUSER      IN VARCHAR2:=USER,
  pTABLENAME  IN VARCHAR2,
  pCONSNAME   IN VARCHAR2
)
AS
  pCOUNT      PLS_INTEGER; 
  pSQLTEXT    VARCHAR2(2000):='';
    pUSER             VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);       --传递用户如果为''或者null则取当前用户进行操作      
BEGIN 
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
    SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_CONSTRAINTS WHERE OWNER=pUSER AND TABLE_NAME=pTABLENAME AND CONSTRAINT_NAME=pCONSNAME;
    IF pCOUNT=1 THEN
      pSQLTEXT:='ALTER TABLE "'||pUSER||'"."'||pTABLENAME||'" DROP CONSTRAINT "'||pCONSNAME||'"'; 
      EXECUTE IMMEDIATE pSQLTEXT; 
    END IF;  
    ELSE                                                                --暂定系统对象不允许删除
        NULL;
    END IF;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除出错:'||SQLERRM||',发生在:'||pCONSNAME);
    ROLLBACK;
END;

--功能:基于指定用户下删除单个索引
PROCEDURE DROP_INDEX
(
  DBUSER        IN VARCHAR2:=USER,
  pINDEXNAME    IN VARCHAR2
)
AS
  pCOUNT      PLS_INTEGER; 
  pSQLTEXT    VARCHAR2(2000):='';
    pUSER             VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);       --传递用户如果为''或者null则取当前用户进行操作      
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
    SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_INDEXES WHERE OWNER=pUSER AND INDEX_NAME=pINDEXNAME;
    IF pCOUNT=1 THEN
      pSQLTEXT:='DROP INDEX "'||pUSER||'"."'||pINDEXNAME||'"'; 
      EXECUTE IMMEDIATE pSQLTEXT;  
    END IF;  
    ELSE                                                                --暂定系统对象不允许删除
        NULL;
    END IF;
  COMMIT;
  EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除出错:'||SQLERRM||',发生在:'||pINDEXNAME);
    ROLLBACK;
END;

PROCEDURE DROP_PLSQLTYPE
--功能:删除系统自动产生的SYS_PLSQL_类型,此为包中定义类型,当编译包或者调用包中类型或者管道函数时系统会自动生成,可以不用删除.
--参数:DBUSER-数据库用户
--调用:EXECUTE PKG_DBMANAGE.DROP_PLSQLTYPE;
--日期:2013-03-28
(
    DBUSER IN VARCHAR2:=USER
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);   
    pSIGNLEOBJ     VARCHAR2(200);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN (SELECT OBJECT_NAME FROM SYS.DBA_OBJECTS WHERE OWNER=pUSER AND OBJECT_TYPE='TYPE' AND OBJECT_NAME LIKE 'SYS_PLSQL_%') 
        LOOP
            pSIGNLEOBJ:=X.OBJECT_NAME;
            EXECUTE IMMEDIATE 'DROP TYPE "'||pUSER||'"."'||pSIGNLEOBJ||'" FORCE';  
            SYS.DBMS_OUTPUT.PUT_LINE('删除SYS_PLSQL_类型:'||pSIGNLEOBJ||'成功!');        --输出提示信息
        END LOOP;
    ELSE                                                                --暂定系统对象不允许删除
        NULL;
    END IF;
    COMMIT;
    EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除SYS_PLSQL_类型出错:'||SQLERRM||',发生在:'||pSIGNLEOBJ);
        ROLLBACK;
END; 

PROCEDURE DELETE_DISTINCT 
--功能:删除表中的重复记录
--参数:DBUSER-数据库用户,pTABLENAME-表名,多个表名以','分隔
--调用:EXEC PKG_DBMANAGE.DELETE_DISTINCT(USER,'EMPLOYEES');
--日期:2013-04-17
(
    DBUSER             IN VARCHAR2:=USER,               --数据库用户名
    pTABLENAME     IN VARCHAR2,                            --表名
    pCOLLIST        IN VARCHAR2:=NULL                    --根据列名来匹配是否重复,多个列以','分隔,为空则表示以表中所有列来匹配,注意:LONG列无法识别是否重复
)
AS
    pUSER         VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);   
    pALLCOL        VARCHAR2(4000):=pCOLLIST;
    pSQLTEXT     VARCHAR2(4000);
BEGIN
    --删除表中重复记录有很多方式实现,如1:取出行号不在重复记录的最大或最小行号中的记录、2:添加标示列、3:取出不重复记录通过临时表中转
    --方式1实现代码大致如下:
    /*DELETE FROM TABLENAME A WHERE NOT EXISTS(   
        SELECT * FROM (
            SELECT MAX(ROWID) OVER(PARTITION BY COL1,COL2..) AS MAXROWID FROM TABLENAME
        ) WHERE MAXROWID=A.ROWID
    )*/
    --比较rowid大小,只保留相同列中的一条记录,实现代码大致如下:
    /*DELETE FROM TABLENAME A WHERE EXISTS(
        SELECT * FROM TABLENAME WHERE COL1=A.COL1 AND COL2=A.COL2.. ROWID>A.ROWID
    )*/ 
    -- 以下采用方式1进行处理    
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        IF pALLCOL IS NULL THEN
            SELECT LISTAGG(COLUMN_NAME,',') WITHIN GROUP(ORDER BY COLUMN_ID) INTO pALLCOL 
                FROM SYS.DBA_TAB_COLUMNS WHERE OWNER=pUSER AND TABLE_NAME=pTABLENAME;
        END IF;
        IF pALLCOL IS NOT NULL THEN
            pSQLTEXT:='DELETE FROM "'||pUSER||'".'||pTABLENAME||' A WHERE NOT EXISTS('||CHR(10)||   
            '    SELECT * FROM ('||CHR(10)||
            '        SELECT MAX(ROWID) OVER(PARTITION BY '||pALLCOL||') AS MAXROWID FROM "'||pUSER||'".'||pTABLENAME||CHR(10)||
            '    ) WHERE MAXROWID=A.ROWID'||CHR(10)||
            ')'; 
            EXECUTE IMMEDIATE pSQLTEXT;
        ELSE
            SYS.DBMS_OUTPUT.PUT_LINE(pTABLENAME||'表不存在!');
        END IF;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
    COMMIT;
    EXCEPTION 
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除表'||pTABLENAME||'重复记录出错:'||SQLERRM);
        ROLLBACK;
END;

PROCEDURE DELETE_TABLE
--功能:删除用户下的表记录,pTABLENAME为NULL则删除所有表的记录,不为NULL则删除一个或多个表的记录,多个表以','分隔,pFILTER-过滤条件
--参数:DBUSER-数据库用户,pTABLENAME-表名,多个表名以','分隔
--调用:EXEC PKG_DBMANAGE.DELETE_TABLE(USER,'EMPLOYEES');
--日期:2013-02-28
(
  DBUSER             IN  VARCHAR2:=USER,
  pTABLENAME     IN  VARCHAR2:=NULL,
  pFILTER     IN  VARCHAR2:=NULL
) 
AS
    pUSER         VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
    pSQLTEXT     VARCHAR2(2000);
    pRFECUR        SYS_REFCURSOR;
    pTBTYPE        SYS.DBA_TABLES.TABLE_NAME%TYPE;
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        DISABLE_TRIGGER(DBUSER,pTABLENAME);                                          --禁用触发器  
        DISABLE_PRIMARYKEY(DBUSER,pTABLENAME);                                       --禁用主键   
        pSQLTEXT:='SELECT DISTINCT TABLE_NAME FROM SYS.DBA_TABLES TA WHERE (INSTR('',''||'''||
            pTABLENAME||'''||'','','',''||TABLE_NAME||'','',1)>0 OR '''||pTABLENAME||
            ''' IS NULL) AND TA.TEMPORARY=''N'' AND OWNER='''||pUSER||'''';    --临时表不做处理
    IF pFILTER IS NOT NULL THEN
      pSQLTEXT:=pSQLTEXT||' AND '||pFILTER;                           --过滤不删除的表记录,如:'TABLE_NAME NOT LIKE ''OF%'''
    END IF;
        OPEN pRFECUR FOR pSQLTEXT;                                                                                         
        LOOP
            FETCH pRFECUR INTO pTBTYPE;
            EXIT WHEN pRFECUR%NOTFOUND;
            EXECUTE IMMEDIATE 'DELETE FROM "'||pUSER||'".'||pTBTYPE;               --删除数据 
            SYS.DBMS_OUTPUT.PUT_LINE('删除表:'||pTBTYPE||'数据成功!');                --输出提示信息
        END LOOP;
        CLOSE pRFECUR;
        ENABLE_PRIMARYKEY(DBUSER,pTABLENAME);                                        --启用主键
        ENABLE_TRIGGER(DBUSER,pTABLENAME);                                           --启用触发器
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;  
  COMMIT;
    EXCEPTION 
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'删除表:'||pTBTYPE||'数据出错:'||SQLERRM);
        ROLLBACK; 
END;

PROCEDURE TRUNCATE_TABLE
--功能:截断用户下的表,pTABLENAME为NULL则截断所有表,不为NULL则截断一个或多个表,多个表以','分隔
--参数:DBUSER-数据库用户,pTABLENAME-表名,多个表名以','分隔
--调用:EXECUTE PKG_DBMANAGE.TRUNCATE_TABLE(USER,'ALM_ALARMDEVICE');
--日期:2013-02-28
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
) 
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
    pTB        VARCHAR2(200);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        DISABLE_TRIGGER(pUSER,pTABLENAME);                           --禁用触发器  
        DISABLE_PRIMARYKEY(pUSER,pTABLENAME);                        --禁用主键     
        FOR X IN 
        (
            SELECT TABLE_NAME FROM SYS.DBA_TABLES TA 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) 
                    AND TA.TEMPORARY='N' AND OWNER=pUSER                                --临时表不做处理 
        )                                                                                                                    
        LOOP                                                     
            pTB:=X.TABLE_NAME;
            EXECUTE IMMEDIATE 'TRUNCATE TABLE "'||pUSER||'".'||pTB; --截断表
            SYS.DBMS_OUTPUT.PUT_LINE('截断表:'||pTB||'数据成功!');        --输出提示信息
        END LOOP;
        ENABLE_PRIMARYKEY(pUSER,pTABLENAME);                         --启用主键
        ENABLE_TRIGGER(pUSER,pTABLENAME);                            --启用触发器  
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;  
  COMMIT;
    EXCEPTION 
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'截断表:'||pTB||'数据出错:'||SQLERRM);
        ROLLBACK; 
END; 

PROCEDURE UPDATE_SINGLE_TABLE
--功能:修改表列,如添加表列、修改表列类型、删除表列
--参数:见下方说明
--调用:EXECUTE PKG_DBMANAGE.UPDATE_SINGLE_TABLE('DKGLL','usr_infotab','-','username',null) 
--日期:2013-01-10
(
    DBUSER                 IN VARCHAR2:=USER,        --用户名
    pTBNAME             IN VARCHAR2,                     --表名
    pOPERATETYPE     IN VARCHAR2,                   --操作类型
    pCOLNAME             IN VARCHAR2,                   --列名
    pCOLTYPE             IN VARCHAR2                     --列类型、是否为空、默认值拼接字符串
)
AS
    pCOUNT             PLS_INTEGER;
    SQLTEXT         VARCHAR2(2000):='';
    pUSER             VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);   --传递用户如果为''或者null则取当前用户进行操作 
    pOPERATE         PLS_INTEGER;
    pDATA_TYPE    VARCHAR2(20);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
    SELECT DECODE(UPPER(pOPERATETYPE),'1',1,'+',1,'ADD',1,'2',2,'ALTER',2,'MODIFY',2,'3',3,'-',3,'CUT',3,'DROP',3) INTO pOPERATE FROM DUAL;
    SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_TAB_COLUMNS WHERE OWNER=pUSER AND TABLE_NAME=UPPER(pTBNAME) AND COLUMN_NAME=UPPER(pCOLNAME);  
    IF pOPERATE=1 THEN                  --添加列
    BEGIN
      IF pCOUNT=0 THEN                  --列不存在则允许添加,否则跳过
        SQLTEXT:='ALTER TABLE "'||pUSER||'".'||pTBNAME||' ADD '||pCOLNAME||' '||pCOLTYPE;    
      END IF;
    END;
    ELSIF pOPERATE=2 THEN               --修改列类型  
    BEGIN  
      IF pCOUNT=1 THEN                  --列存在则允许修改,否则跳过 
      BEGIN
        SELECT DATA_TYPE INTO pDATA_TYPE FROM SYS.DBA_TAB_COLUMNS 
                    WHERE OWNER=pUSER AND TABLE_NAME=UPPER(pTBNAME) AND COLUMN_NAME=UPPER(pCOLNAME); 
        IF UPPER(pCOLTYPE) LIKE 'CLOB%' AND pDATA_TYPE LIKE '%CHAR%' THEN  --如果原始列为字符串类型修改为CLOB类型,需通过LONG类型中转 
          SQLTEXT:='ALTER TABLE "'||pUSER||'".'||pTBNAME||' MODIFY '||pCOLNAME||' LONG;';
        END IF; 
        SQLTEXT:=SQLTEXT||'ALTER TABLE "'||pUSER||'".'||pTBNAME||' MODIFY '||pCOLNAME||' '||pCOLTYPE;   
      END;
      END IF;
    END;
    ELSIF pOPERATE=3 THEN               --删除列 
    BEGIN      
      IF pCOUNT=1 THEN                  --列存在则允许删除,否则跳过
        SQLTEXT:='ALTER TABLE "'||pUSER||'".'||pTBNAME||' DROP COLUMN '||pCOLNAME;    
      END IF;
    END;
    END IF; 
    EXECUTE IMMEDIATE SQLTEXT;
    REBUILD_INDEX(pUSER);                            --重建索引
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;  
    COMMIT;
    EXCEPTION
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
        ROLLBACK;
END; 

PROCEDURE RECOMPILE_ALL_PROJECT
--功能:重新编译所有类型、视图、触发器、函数、过程、包,但不包括该包
--参数:DBUSER-数据库用户
--调用:EXECUTE PKG_DBMANAGE.RECOMPILE_ALL_PROJECT;
--日期:2013-02-10
(
  DBUSER IN VARCHAR2:=USER
)
AS 
    pUSER         VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
    CURSOR         CUR_OBJECTS IS --类型、视图、触发器、函数、过程、包
        SELECT * FROM SYS.DBA_OBJECTS 
            WHERE OWNER=pUSER 
            AND STATUS='INVALID' AND OBJECT_TYPE IN('TYPE','VIEW','FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY','TRIGGER')
            AND OBJECT_NAME<>'PKG_DBMANAGE' --不能编译该包
            ORDER BY DECODE(OBJECT_TYPE,'TYPE',1,'VIEW',2,'FUNCTION',3,'PROCEDURE',4,'PACKAGE',5,'PACKAGE BODY',6,'TRIGGER',7);
    OBJ_LIST     SYS.DBA_OBJECTS%ROWTYPE;
    SQLTEXT     VARCHAR2(2000);
    pOBJ            VARCHAR2(200);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        OPEN CUR_OBJECTS;
        LOOP
            FETCH CUR_OBJECTS INTO OBJ_LIST;
            EXIT WHEN CUR_OBJECTS%NOTFOUND; 
            pOBJ:=OBJ_LIST.OBJECT_NAME;
            IF OBJ_LIST.OBJECT_TYPE = 'PACKAGE BODY' THEN 
                SQLTEXT:='ALTER PACKAGE "'||pUSER||'"."'||pOBJ||'" COMPILE BODY';
            ELSE 
                SQLTEXT:='ALTER '||OBJ_LIST.OBJECT_TYPE||' "'||pUSER||'"."'||pOBJ||'" COMPILE';
            END IF;   
            EXECUTE IMMEDIATE SQLTEXT;
            SYS.DBMS_OUTPUT.PUT_LINE('编译'||OBJ_LIST.OBJECT_TYPE||''||pOBJ||'成功!');        --输出提示信息
        END LOOP;
        CLOSE CUR_OBJECTS;
    ELSE                                                                --暂定系统对象不允许编译
        NULL;
    END IF;
    COMMIT;
  EXCEPTION 
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'编译出错:'||SQLERRM||',发生在:'||pOBJ);
    ROLLBACK;
END;

PROCEDURE UNUSABLE_INDEX
--功能:让单表或多个表的索引失效,在进行DML操作的时候可以先让索引失效,再操作,完成之后再重建索引
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.UNUSABLE_INDEX
--日期:2013-01-10
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT INDEX_NAME FROM SYS.DBA_INDEXES 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND STATUS='VALID' AND OWNER=pUSER
        ) 
        LOOP                                                                                                                                                     --有效的索引
            EXECUTE IMMEDIATE ' ALTER INDEX "'||pUSER||'".'||X.INDEX_NAME||' UNUSABLE';   --让索引失效
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK; 
END;

PROCEDURE REBUILD_INDEX 
--功能:重建用户下的单表或多个表的索引,pTABLENAME为NULL则重建所有索引,不为NULL则重建一个或多个表的索引,多个表以','分隔
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.REBUILD_INDEX;
--日期:2013-01-10
(  
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT INDEX_NAME FROM SYS.DBA_INDEXES 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND STATUS<>'VALID' AND OWNER=pUSER
        ) 
        LOOP                                                                                                                                                     --无效的索引
            EXECUTE IMMEDIATE ' ALTER INDEX "'||pUSER||'".'||X.INDEX_NAME||' REBUILD';    --重建索引
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END;

PROCEDURE DISABLE_CONSTRAINT
--功能:禁用用户的所有约束
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.DISABLE_PRIMARYKEY
--日期:2013-02-28
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT owner,constraint_name,table_name FROM SYS.all_constraints
                WHERE owner=pUSER AND (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) 
        )
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||X.owner||'".'||X.table_name||' MODIFY CONSTRAINT "'||X.constraint_name||'" DISABLE ';
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN        
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'禁用约束出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE ENABLE_CONSTRAINT
--功能:启用用户的所有约束
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.DISABLE_PRIMARYKEY
--日期:2013-02-28
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT owner,constraint_name,table_name FROM SYS.all_constraints
                WHERE owner=pUSER AND (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) 
        )
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||X.owner||'".'||X.table_name||' MODIFY CONSTRAINT "'||X.constraint_name||'" ENABLE ';
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN        
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'启用约束出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE DISABLE_PRIMARYKEY
--功能:禁用用户的主键,在进行DML操作的时候可以先让主键失效,再操作,完成之后再启用主键
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.DISABLE_PRIMARYKEY
--日期:2013-02-28
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN 
        (
            SELECT TABLE_NAME FROM SYS.DBA_CONSTRAINTS 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND CONSTRAINT_TYPE='P' AND OWNER=pUSER
        ) 
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||pUSER||'"."'||X.TABLE_NAME||'" DISABLE PRIMARY KEY CASCADE'; --禁用主键  
        END LOOP;  
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN        
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'禁用主键出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE ENABLE_PRIMARYKEY
--功能:启用用户的主键,pTABLENAME为NULL则启用所有表的主键,不为NULL则启用一个或多个表的主键,多个表以','分隔
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.ENABLE_PRIMARYKEY
--日期:2013-02-28
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN 
        (
            SELECT TABLE_NAME FROM SYS.DBA_CONSTRAINTS 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND CONSTRAINT_TYPE='P' AND OWNER=pUSER
        ) 
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||pUSER||'"."'||X.TABLE_NAME||'" ENABLE PRIMARY KEY';          --启用主键
        END LOOP; 
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'启用主键出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE DISABLE_FOREIGNKEY
--功能:禁用用户的外键
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.DISABLE_FOREIGNKEY
--日期:2014-04-25
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT  fk.owner,fk.constraint_name,fk.table_name FROM SYS.all_constraints fk,SYS.all_constraints pk
                WHERE fk.CONSTRAINT_TYPE='R' AND pk.owner=pUSER AND fk.r_owner=pk.owner AND fk.R_CONSTRAINT_NAME=pk.CONSTRAINT_NAME 
                    AND (INSTR(','||pTABLENAME||',',','||pk.table_name||',',1)>0 OR pTABLENAME IS NULL) 
        )
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||X.owner||'"."'||X.table_name||'" MODIFY CONSTRAINT "'||X.constraint_name||'" DISABLE';
        END LOOP; 
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN        
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'禁用外键出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE ENABLE_FOREIGNKEY
--功能:启用用户的外键
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.ENABLE_FOREIGNKEY
--日期:2014-04-25
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN
        (
            SELECT  fk.owner,fk.constraint_name,fk.table_name FROM SYS.all_constraints fk,SYS.all_constraints pk
                WHERE fk.CONSTRAINT_TYPE='R' AND pk.owner=pUSER AND fk.r_owner=pk.owner AND fk.R_CONSTRAINT_NAME=pk.CONSTRAINT_NAME 
                    AND (INSTR(','||pTABLENAME||',',','||pk.table_name||',',1)>0 OR pTABLENAME IS NULL) 
        )
        LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE "'||X.owner||'"."'||X.table_name||'" MODIFY CONSTRAINT "'||X.constraint_name||'" ENABLE';
        END LOOP; 
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN        
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'禁用外键出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE DISABLE_TRIGGER
--功能:禁用用户的触发器,在进行DML操作的时候可以先禁用触发器,再操作,完成之后再启用触发器
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.DISABLE_TRIGGER
--日期:2013-02-21
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN 
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN 
        (
            SELECT TRIGGER_NAME FROM SYS.DBA_TRIGGERS 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND STATUS='ENABLED' AND OWNER=pUSER
        ) 
        LOOP                                                                                                                                                --当前已被启用的触发器
            EXECUTE IMMEDIATE 'ALTER TRIGGER "'||pUSER||'".'||X.TRIGGER_NAME||' DISABLE'; --禁用触发器    
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'禁用触发器出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE ENABLE_TRIGGER
--功能:启用用户的触发器,pTABLENAME为NULL则启用所有表的触发器,不为NULL则启用一个或多个表的触发器,多个表以','分隔
--参数:DBUSER-数据库用户,pTABLENAME-表名称,多个表以','分隔
--调用:EXECUTE PKG_DBMANAGE.ENABLE_TRIGGER;
--日期:2013-02-21
(
  DBUSER             IN VARCHAR2:=USER,
  pTABLENAME     IN VARCHAR2:=NULL
)
AS
    pUSER VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN 
        (
            SELECT TRIGGER_NAME FROM SYS.DBA_TRIGGERS 
                WHERE (INSTR(','||pTABLENAME||',',','||TABLE_NAME||',',1)>0 OR pTABLENAME IS NULL) AND STATUS='DISABLED' AND OWNER=pUSER
        ) 
        LOOP
            EXECUTE IMMEDIATE 'ALTER TRIGGER "'||pUSER||'".'||X.TRIGGER_NAME||' ENABLE';  --启用触发器
        END LOOP;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
  COMMIT;
  EXCEPTION
  WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'启用触发器出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE FLASHBACK_TABLE 
--功能:基于时间戳闪回表数据,错误则输出错误消息
--参数:DBUSER-数据库用户,pTBNAME-表名,pDATE-时间戳
--调用:EXECUTE PKG_DBMANAGE.FLASHBACK_TABLE(USER,'EMPLOYEES','2014-04-29 11:00:00')
--日期:2013-01-10
( 
  DBUSER     IN VARCHAR2:=USER,
  pTBNAME IN VARCHAR2,
  pDATE     IN VARCHAR2
)
AS
    pUSER     VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER); 
    pCOUNT     PLS_INTEGER;
BEGIN  
    --检测机制如下:
    --1:首先检查该表是否存在
    --2:如果该表不存在,则检查该表在回收站是否存在,如果在回收站存在则将表闪回到删除以上,否则终止下一步操作
    --3:如果该表存在,则直接闪回表到某一个时间点以前
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_TABLES WHERE OWNER=pUSER AND TABLE_NAME=UPPER(pTBNAME);
        IF pCOUNT=0 THEN                                   --表不存在
            SELECT COUNT(1) INTO pCOUNT FROM SYS.DBA_RECYCLEBIN WHERE OWNER=pUSER AND ORIGINAL_NAME=UPPER(pTBNAME);  --判断该表在回收站是否存在
            IF pCOUNT>0 THEN                                --表在回收站存在
                EXECUTE IMMEDIATE 'FLASHBACK TABLE "'||pUSER||'".'||pTBNAME||' TO BEFORE DROP';                        --将表闪回到删除以前
            END IF;
        END IF;
        IF pCOUNT>0 THEN 
            --修改表允许row movement 
            EXECUTE IMMEDIATE 'ALTER TABLE "'||pUSER||'".'||pTBNAME||' ENABLE ROW MOVEMENT';   
            --闪回表到指定的时间点 
            EXECUTE IMMEDIATE 'FLASHBACK TABLE "'||pUSER||'".'||pTBNAME||' TO TIMESTAMP TO_TIMESTAMP('''||pDATE||''',''YYYY-MM-DD HH24:MI:SS'')'; 
            --修改表禁止row mevement
            EXECUTE IMMEDIATE 'ALTER TABLE "'||pUSER||'".'||pTBNAME||' DISABLE ROW MOVEMENT';   
        END IF;
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
    COMMIT;
    EXCEPTION 
    WHEN OTHERS THEN 
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
    ROLLBACK;
END;

PROCEDURE FLASHBACK_ALL_TABLE
--功能:基于时间戳闪回表数据,错误则输出错误消息,此处将闪回所有表
--参数:DBUSER-数据库用户,pTBNAME-表名,pDATE-时间戳
--调用:EXECUTE PKG_DBMANAGE.FLASHBACK_ALL_TABLE('DKGLL','2014-02-02 10:00:00')
--日期:2013-01-10
( 
  DBUSER     IN VARCHAR2:=USER,
  pDATE     IN VARCHAR2
)
AS
    pUSER                 VARCHAR2(200):=COALESCE(UPPER(DBUSER),USER); 
    pSINGLETBNAME    VARCHAR2(50);
BEGIN
    IF NOT IS_SYSTEMUSER(pUSER) THEN       --如果不是系统用户则进行下一步操作
        FOR X IN(SELECT TABLE_NAME FROM SYS.DBA_TABLES WHERE OWNER=pUSER)
        LOOP
            pSINGLETBNAME:=X.TABLE_NAME;
            FLASHBACK_TABLE(DBUSER,pSINGLETBNAME,pDATE);
        END LOOP;    
    ELSE                                                                --暂定系统对象不允许操作
        NULL;
    END IF;
    EXCEPTION
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'闪回数据库出错:'||SQLERRM||',发生在表:'||pSINGLETBNAME) ;
        ROLLBACK;
END;

PROCEDURE CLOB_TO_FILE
--功能:将大文本字段保存到指定目录下的文件中.
--    注意:如果是使用系统目录,用户必须有访问目录的权限,否则会报ORA-29289:拒绝访问目录的错误.
--    注意:要写入的CLOB字段每行长度不能超过32767个字节,必须进行换行,否则会报'ORA-29285: 文件写入错误'的错误.
--参数:
--调用:
/*
DECLARE CLOBTEXT CLOB;
begin 
  CLOBTEXT:='34535345353533'||CHR(10)||'1232131';
    PKG_DBMANAGE.CLOB_TO_FILE('BACKDIR','SQL脚本.sql','1',CLOBTEXT);
end;
*/
/*
DECLARE t_sql VARCHAR2(4000);l_clob CLOB; 
BEGIN 
    t_sql:='BEGIN PKG_DBMANAGE.FILE_TO_CLOB (''XML_DIR'',''1.txt'',:v1);END;';   --构建调用过程输出参数,定义该过程只有一个输出参数且类型为clob类型 
    EXECUTE IMMEDIATE t_sql USING OUT l_clob;                                    --此处为输出参数,将文件读取到clob字段中
    PKG_DBMANAGE.CLOB_TO_FILE('XML_DIR','clone.txt',1,l_clob);                   --将clob字段写入文件
    UTL_FILE.FCLOSE_ALL;                                                         --关闭所有文件
    COMMIT;
END;
*/ 
--日期:2013-01-22
(
  DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称,包括后缀名
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
  CLOBTXT         IN CLOB                              --大文本字段
)
AS
    pNEWMODE        VARCHAR2(10);
    I                     INTEGER:=1;
    pSTARTINDEX INTEGER:=1;
    pENDINDEX     INTEGER;
    pWRITECOUNT INTEGER;                                
    pTEXT             VARCHAR2(32767);
    pFILED             SYS.UTL_FILE.FILE_TYPE;
BEGIN
    --打开文件,参数1-目录,参数2-文件名称,参数3-模式,'W'-以替换模式进行读写,'R'-只读,'A'-以追加的模式进行读写
    SELECT DECODE(UPPER(pWRITEMODE),1,'W',2,'R',3,'A','W','W','R','R','A','A','W') INTO pNEWMODE FROM DUAL;
    -------------------------------------------------------------------------------------------------------------------
    --注意:此处FOPEN第4个参数为MAX_LINESIZE(表示打开的文件每行的最大字符数,包括换行符).最小值为1,最大值为32767.缺省值为NULL,意味着
    --    由UTL_FILE确定一个对于该操作系统合适的值(历史上这个值一度是1024个字节),经过在32位XP操作系统上反复测试,如果取缺省值NULL,当
    --    行字符大于1024字节时,即报错:'ORA-29285: 文件写入错误',取最大值32767,超过也会报此错误,故应限制每行字符数不能超过32767字节
    -------------------------------------------------------------------------------------------------------------------
  pFILED:=SYS.UTL_FILE.FOPEN(DIR,NVL(FILENAME,'DBMS'||TO_CHAR(CURRENT_DATE,'YYYYMMDDHH24')||'.log'),pNEWMODE,32767);
  LOOP
        --按照换行符读取的当前行结束位置,在CLOBTXT基础上加上||CHR(10)解决当CLOBTXT只有一行数据且无换行符不能写入该行数据到文本的的bug  
    pENDINDEX:=INSTR(CLOBTXT||CHR(10),CHR(10),1,I);
    pWRITECOUNT:=pENDINDEX-pSTARTINDEX;  
    IF pWRITECOUNT>0 THEN
            --从指定位置(pINDEX)读取指定长度(pWRITECOUNT)字符串并保存到字段pTEXT中,注意,pWRITECOUNT不能为0,否则报21560: 参数 2 为空,无效或超出范围的错误
      SYS.DBMS_LOB.READ(CLOBTXT,pWRITECOUNT,pSTARTINDEX,pTEXT);
    ELSIF pWRITECOUNT=0 THEN
      pTEXT:='';                                                                                               --写入空行
    ELSE 
      EXIT;
    END IF;
    SYS.UTL_FILE.PUT_LINE(pFILED,pTEXT);                        --写入文件,按照字节长度写入文件,不能超过32767个字节数        
    I:=I+1;
    pSTARTINDEX:=pENDINDEX+1;                                   --按照换行符读取的下一行起始位置    
  END LOOP;
  SYS.UTL_FILE.FCLOSE(pFILED);                                  --关闭文件
  EXCEPTION 
  WHEN PKG_DBMANAGE.REFUSE_OPERATE_DIR THEN
    SYS.DBMS_OUTPUT.PUT_LINE('用户没有操作该目录的权限,请先赋予用户访问权限!');
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'保存文件时出错:' ||SQLERRM);
        ROLLBACK;
END;

PROCEDURE VARCHAR_TO_FILE
--功能:将字符串(最大长度为32767)保存到指定目录下的文件中.
--    注意:如果是使用系统目录,用户必须有访问目录的权限,否则会报ORA-29289:拒绝访问目录的错误.
--    注意:要写入的CLOB字段每行长度不能超过32767个字节,必须进行换行,否则会报'ORA-29285: 文件写入错误'的错误.
--    说明:此过程功能同CLOB_TO_FILE.
--参数:
--调用:
/*
DECLARE CLOBTEXT CLOB;
BEGIN 
  CLOBTEXT:='34535345353533'||CHR(10)||'1232131';
    PKG_DBMANAGE.VARCHAR_TO_FILE('BACKDIR','SQL脚本.sql','1',CLOBTEXT);
END;
*/ 
--日期:2013-01-22
(
  DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称,包括后缀名
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
  CLOBTXT         IN VARCHAR2                     --字符串
)
AS
    pNEWMODE        VARCHAR2(10);
    pFILED             UTL_FILE.FILE_TYPE;
BEGIN
    --打开文件,参数1-目录,参数2-文件名称,参数3-模式,'W'-以替换模式进行读写,'R'-只读,'A'-以追加的模式进行读写
    SELECT DECODE(UPPER(pWRITEMODE),1,'W',2,'R',3,'A','W','W','R','R','A','A','W') INTO pNEWMODE FROM DUAL;
    -------------------------------------------------------------------------------------------------------------------
    --注意:此处FOPEN第4个参数为MAX_LINESIZE(表示打开的文件每行的最大字符数,包括换行符).最小值为1,最大值为32767.缺省值为NULL,意味着
    --    由UTL_FILE确定一个对于该操作系统合适的值(历史上这个值一度是1024个字节),经过在32位XP操作系统上反复测试,如果取缺省值NULL,当
    --    行字符大于1024字节时,即报错:'ORA-29285: 文件写入错误',取最大值32767,超过也会报此错误,故应限制每行字符数不能超过32767字节
    -------------------------------------------------------------------------------------------------------------------
  pFILED:=SYS.UTL_FILE.FOPEN(DIR,NVL(FILENAME,'DBMS'||TO_CHAR(CURRENT_DATE,'YYYYMMDDHH24')||'.log'),pNEWMODE,32767);
    SYS.UTL_FILE.PUT_LINE(pFILED,CLOBTXT);                   --写入文件,按照字节长度写入文件,不能超过32767个字节数        
    SYS.UTL_FILE.FCLOSE(pFILED);                        --关闭文件   
    EXCEPTION 
  WHEN PKG_DBMANAGE.REFUSE_OPERATE_DIR THEN
    SYS.DBMS_OUTPUT.PUT_LINE('用户没有操作该目录的权限,请先赋予用户访问权限!');
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'保存文件时出错:' ||SQLERRM);
        ROLLBACK;
END;

PROCEDURE CURSOR_TO_FILE
--功能:查询表数据并将表的列的每一行按照顺序写入文件中,此处只支持表中返回单列数据,注意:每一列的值不能超过32767个字节
--参数:
--调用:
/*
DECLARE pRFECUR SYS_REFCURSOR;
BEGIN
    OPEN pRFECUR FOR SELECT CONTEN FROM REMOTEINSERT;
    PKG_DBMANAGE.CURSOR_TO_FILE('BACKDIR','insert脚本.sql',1,pRFECUR);
END;
*/
--日期:2013-04-25
(
    DIR                 IN VARCHAR2:='DATA_PUMP_DIR',        --目录名称(如果不填,则使用当前数据库目录)
  FILENAME         IN VARCHAR:=NULL,                                --保存文件名称,包括后缀名
    pWRITEMODE    IN VARCHAR2:=1,                                    --写入模式,1-'W'-以替换模式进行读写,2-'R'-只读,3-'A'-以追加的模式进行读写
    pRFECUR         IN SYS_REFCURSOR                                --查询游标结果集
)
AS
    pNEWMODE        VARCHAR2(10);
    pFILED             UTL_FILE.FILE_TYPE; 
    pCONTENT          VARCHAR2(32767);                                 --写入文件的每一行最大值不能超过32767个字节
BEGIN 
    --打开文件,参数1-目录,参数2-文件名称,参数3-模式,'W'-以替换模式进行读写,'R'-只读,'A'-以追加的模式进行读写
    SELECT DECODE(UPPER(pWRITEMODE),1,'W',2,'R',3,'A','W','W','R','R','A','A','W') INTO pNEWMODE FROM DUAL;
    -------------------------------------------------------------------------------------------------------------------
    --注意:此处FOPEN第4个参数为MAX_LINESIZE(表示打开的文件每行的最大字符数,包括换行符).最小值为1,最大值为32767.缺省值为NULL,意味着
    --    由UTL_FILE确定一个对于该操作系统合适的值(历史上这个值一度是1024个字节),经过在32位XP操作系统上反复测试,如果取缺省值NULL,当
    --    行字符大于1024字节时,即报错:'ORA-29285: 文件写入错误',取最大值32767,超过也会报此错误,故应限制每行字符数不能超过32767字节
    -------------------------------------------------------------------------------------------------------------------
  pFILED:=SYS.UTL_FILE.FOPEN(DIR,NVL(FILENAME,'数据文件'||TO_CHAR(CURRENT_DATE,'YYYYMMDDHH24')||'.sql'),'W',32767);
    LOOP
        FETCH pRFECUR INTO pCONTENT;                             --取出游标的每一行的值到变量中
    EXIT WHEN pRFECUR%NOTFOUND; 
        SYS.UTL_FILE.PUT_LINE(pFILED,pCONTENT);   --写入文件,按照字节长度写入文件,不能超过32767个字节数        
  END LOOP;
    SYS.UTL_FILE.FCLOSE(pFILED);                --关闭文件   
    EXCEPTION
    WHEN OTHERS THEN
        SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'保存数据到文件中出错:'||SQLERRM) ;
        ROLLBACK;  
END;

PROCEDURE GET_NEXTLINE
--功能:读取下一行数据,如果读取到最后一行返回NULL.
(
  pFILED         UTL_FILE.FILE_TYPE,
  pTEXT         OUT VARCHAR2,
  pHAVEDATA OUT BOOLEAN
)
AS
BEGIN
  SYS.UTL_FILE.GET_LINE(pFILED,pTEXT);         --按行读取文件,并保存到pTEXT中  
  pHAVEDATA:=FALSE;
  EXCEPTION 
  WHEN NO_DATA_FOUND THEN
    pTEXT:=NULL;
    pHAVEDATA:=TRUE;
END;

PROCEDURE FILE_TO_CLOB
--功能:将指定目录下的文件读取到CLOB字段中.注意:如果是使用系统目录,用户必须有访问目录的权限,否则会报ORA-29289:拒绝访问目录的错误.
--参数:DIR-目录名称,FILENAME-文件名称,CLOBTXT-大文本字段
--调用:
/*
DECLARE CLOBTXT CLOB;
BEGIN 
    PKG_DBMANAGE.FILE_TO_CLOB('BACKDIR','1.txt',CLOBTXT);
    DBMS_OUTPUT.PUT_LINE(CLOBTXT);
END;
*/
--日期:2013-01-22
( 
  DIR             IN     VARCHAR2,
  FILENAME     IN     VARCHAR,
  CLOBTXT     OUT CLOB
)
AS
    I                 INTEGER:=1;
    pTEXT         VARCHAR2(32767);                  --一行最多能保存32767个字节
    pHAVADATA BOOLEAN;                          --是否有数据标志
    pFILED         SYS.UTL_FILE.FILE_TYPE;  
BEGIN
    --打开文件,参数1-目录,参数2-文件名称,参数3-模式,'W'-以替换模式进行读写,'R'-只读,'A'-以追加的模式进行读写
  pFILED:=SYS.UTL_FILE.FOPEN(DIR,FILENAME,'R');           
  CLOBTXT:='';
  LOOP             
    GET_NEXTLINE(pFILED,pTEXT,pHAVADATA);        --按行读取文件,并保存到pTEXT中  
    EXIT WHEN pHAVADATA;
    CLOBTXT:=CLOBTXT||TO_CLOB(pTEXT)||CHR(10);--将字符串保存到CLOB中    
    I:=I+1;
  END LOOP;
  SYS.UTL_FILE.FCLOSE(pFILED);                --关闭文件   
    COMMIT;
  EXCEPTION 
  WHEN PKG_DBMANAGE.REFUSE_OPERATE_DIR THEN
    SYS.DBMS_OUTPUT.PUT_LINE('用户没有操作该目录的权限,请先赋予用户访问权限!');
  WHEN OTHERS THEN
    SYS.DBMS_OUTPUT.PUT_LINE(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE||'执行命令时出错:' ||SQLERRM);
        ROLLBACK;
END; 
END;
View Code
原文地址:https://www.cnblogs.com/dkgll/p/2976295.html