Oracle笔记十九:内置包

本文详细介绍了Oracle数据库中的一些内置包,如DBMS_ALERT、DBMS_DDL、DBMS_FLASHBACK、DBMS_JOB、DBMS_LOB等,涵盖了它们的主要功能、语法和实例,帮助读者理解如何使用这些包进行数据库管理和操作。

Oracle内置包

  • 1、DBMS_ALERT
    • 1.1、说明
    • 1.2、DBMS_ALERT.REGISTER
    • 1.3、DBMS_ALERT.REMOVE
    • 1.4、DBMS_ALERT.REMOVEALL
    • 1.5、DBMS_ALERT.SET_DEFAULTS
    • 1.5、DBMS_ALERT.SIGNAL
    • 1.6、DBMS_ALERT.WAITANY
    • 1.7、DBMS_ALERT.WAITONE
    • 1.8、实例
  • 2、DBMS_DDL
    • 2.1、DBMS_DDL.ALTER_COMPILE
    • 2.2、DBMS_DDL.ANALYZE_OBJECT
    • 2.3、DBMS_DDL.IS_TRIGGER_FIRE_ONCE
    • 2.4、DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY
  • 3、DBMS_FLASHBACK
    • 3.1、DBMS_FLASHBACK.DISABLE
    • 3.2、DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER
    • 3.3、DBMS_FLASHBACK.ENABLE_AT_TIME
    • 3.4、DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
    • 3.5、实例
  • 4、DBMS_JOB
    • 4.1、DBMS_JOB.BROKEN
    • 4.2、DBMS_JOB.CHANGE
    • 4.3、DBMS_JOB.INSTANCE
    • 4.4、DBMS_JOB.INTERVAL
    • 4.5、DBMS_JOB.NEXT_DATE
    • 4.6、DBMS_JOB.REMOVE
    • 4.7、DBMS_JOB.RUN
    • 4.8、DBMS_JOB.SUBMIT
    • 4.9、DBMS_JOB.WHAT
  • 5、DBMS_LOB
    • 5.1、DBMS_LOB.APPEND
    • 5.2、DBMS_LOB.CLOSE
    • 5.3、DBMS_LOB.COMPARE
    • 5.4、DBMS_LOB.COPY
    • 5.5、DBMS_LOB.CREATETEMPORARY
    • 5.6、DBMS_LOB.ERASE
    • 5.7、DBMS_LOB.FILECLOSE
    • 5.8、DBMS_LOB.FILECLOSEALL
    • 5.9、DBMS_LOB.FILEEXISTS
    • 5.10、DBMS_LOB.FILEGETNAME
    • 5.11、DBMS_LOB.FILEISOPEN
    • 5.12、DBMS_LOB.FILEOPEN
    • 5.13、DBMS_LOB.FREETEMPORARY
    • 5.14、DBMS_LOB.GETCHUNKSIZE
    • 5.15、DBMS_LOB.GETLENGTH
    • 5.16、DBMS_LOB.INSTR
    • 5.17、DBMS_LOB.ISOPEN
    • 5.18、DBMS_LOB.SUBSTR
    • 5.19、DBMS_LOB.TRIM
    • 5.20、DBMS_LOB.WRITE
  • 6、DBMS_LOGMNR
    • 6.1、DBMS_LOGMNR.ADD_LOGFILE
    • 6.2、DBMS_LOGMNR.COLUMN_PRESENT
    • 6.3、DBMS_LOGMNR.END_LOGMNR
    • 6.4、DBMS_LOGMNR.MINE_VALUE
    • 6.5、DBMS_LOGMNR.START_LOGMNR
    • 6.6、实例
  • 7、DBMS_LOGMNR_D
    • 7.1、DBMS_LOGMNR_D.BUILD
    • 7.2、DBMS_LOGMNR_D.SET_TABLESPACE
  • 8、DBMS_METADATA
    • 8.1、DBMS_METADATA.GET_DDL
      • 8.1.1、实例
      • 8.1.2、使用技巧
  • 9、DBMS_OBFUSCATION_TOOLKIT
    • 9.1、DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT
    • 9.2、DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT
    • 9.3、DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT
    • 9.4、DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT
    • 9.5、DBMS_OBFUSCATION_TOOLKIT.MD5
    • 9.5、实例一
    • 9.6、示例二
  • 10、DBMS_OUTPUT
    • 10.1、DBMS_OUTPUT.DISABLE
    • 10.2、DBMS_OUTPUT.ENABLE
    • 10.3、DBMS_OUTPUT.GET_LINE
    • 10.4、DBMS_OUTPUT.GET_LINES
    • 10.5、DBMS_OUTPUT.NEW_LINE
    • 10.6、DBMS_OUTPUT.PUT
    • 10.7、DBMS_OUTPUT.PUT_LINE
    • 10.8实例
  • 11、DBMS_PIPE
    • 11.1、DBMS_PIPE.CREATE_PIPE
    • 11.2、DBMS_PIPE.NEXT_ITEM_TYPE
    • 11.3、DBMS_PIPE.PACK_MESSAGE
    • 11.4、DBMS_PIPE.PURGE
    • 11.5、DBMS_PIPE.RECEIVE_MESSAGE
    • 11.6、DBMS_PIPE.REMOVE_PIPE
    • 11.7、DBMS_PIPE.RESET_BUFFER
    • 11.8、DBMS_PIPE.SEND_MESSAGE
    • 11.9、DBMS_PIPE.UNIQUE_SESSION_NAME
    • 11.10、DBMS_PIPE.UNPACK_MESSAGE
    • 11.11、实例
  • 12、DBMS_RANDOM
    • 12.1、DBMS_RANDOM.INITIALIZE
    • 12.2、DBMS_RANDOM.RANDOM
    • 12.3、DBMS_RANDOM.SEED
    • 12.4、DBMS_RANDOM.TERMINATE
    • 12.5、DBMS_RANDOM.STRING
  • 13、DBMS_STATS
    • 13.1、DBMS_STATS.CREATE_STAT_TABLE
    • 13.2、DBMS_STATS.DELETE_COLUMN_STATS
    • 13.3、DBMS_STATS.DELETE_DATABASE_STATS
    • 13.4、DBMS_STATS.DELETE_INDEX_STATS
    • 13.5、DBMS_STATS.EXPORT_COLUMN_STATS
    • 13.6、实例
  • 14、DBMS_TRANSACTION
    • 14.1、DBMS_TRANSACTION.ADVISE_COMMIT
    • 14.2、DBMS_TRANSACTION.COMMIT
    • 14.3、DBMS_TRANSACTION.COMMIT_FORCE
    • 14.4、DBMS_TRANSACTION.READ_ONLY
  • 15、UTL_FILE
    • 15.1、UTL_FILE.FCOPY
    • 15.2、UTL_FILE.GET_LINE
    • 15.3、实例
  • 16、UTL_INADDR
    • 16.1、UTL_INADDR.GET_HOST_ADDRESS
    • 16.2、UTL_INADDR.GET_HOST_NAME
  • 17、OWA_UTIL
    • 17.1、OWA_UTIL.WHO_CALLED_ME

1、DBMS_ALERT

1.1、说明

用于生成并传递数据库预警信息
作用:用于生成并传递数据库预警信息.使用包DBMS_ALERT,则必须以SYS登陆,为该用户授予执行权限.
sql>conn sys/oracle as sysdba
sql>grant execute on dbms_alert to scott;

1.2、DBMS_ALERT.REGISTER

说明:用于注册预警事件
语法:dbms_alter.register(name in varchar2);
其中name指定预警事件名称,其值不能超过30字节。
例子:exec dbms_alter.register(‘alter1’);

1.3、DBMS_ALERT.REMOVE

说明:用于删除会话不需要的预警事件.
语法:dbms_alert.remove(name in varchar2);
例子:exec dbms_alert.remove(‘alert1’);

1.4、DBMS_ALERT.REMOVEALL

说明:用于删除当前会话所有已注册的预警事件
语法:dbms_alter.removeall

1.5、DBMS_ALERT.SET_DEFAULTS

说明:用于设置检测预警事件的时间间隔,默认时间间隔为5秒
语法:dbms_alert.set_defaults(sensitivity in number);
例子:dbms_alert.set_defaults(20)

1.5、DBMS_ALERT.SIGNAL

说明:用于指定预警事件所对应的预警消息。只有在提交事务时才会发出预警信号,而当回退事务时不会发出预警信号。
语法:dbms_alert.signal(name in varchar2,message in varchar2);
其中message指定预警事件的消息,长度不超过1800字节。
例子:exec dbms_alert.signal(‘alert1’,‘hello’);
实例:
create or replace trigger tr_upd_sal
after update of sal on emp
begin
dbms_alert.signal(‘sal_upd_alert’,‘修改了雇员工资’);
end;

1.6、DBMS_ALERT.WAITANY

说明:用于等待当前会话的任何预警事件,并且在预警事件发生时输出相应信息.在执行该过程之前,会隐含地发出COMMIT.
语法:
dbms_alter.waitany(name out varchar2,message out varchar2,status out integer,timeout in number default maxwait);
其中status用于返回状态值,返回0表示发生了预警事件,返回1表示超时;timeout用于设置预警事件的超时时间

1.7、DBMS_ALERT.WAITONE

说明:用于等待当前会话的特定预警事件,并且在发生预警事件时输出预警消息.在执行该过程之前,会隐含地发出COMMIT.
dbms_alter.waitone(name out varchar2,message out varchar2,status out integer,timeout in number default maxwait);

1.8、实例

create or replace procedure wait_event(name varchar2) is
message varchar2(200);
status int;
begin
dbms_alert.register(name);
dbms_alert.waitone(name,message,status);
if status=0 then
dbms_output.put_line(message);
end if;
dbms_alert.remove(name);
end wait_event;

set serveroutput on 
begin
for i in 1..5 loop
wait_event('sal_upd_alert');
end loop;
end;

2、DBMS_DDL

提供了在PL/SQL块中执行DDL语句的方法
作用:提供了在PL/SQL块中执行DDL语句的方法,并且也提供了一些DDL的特殊管理方法.

2.1、DBMS_DDL.ALTER_COMPILE

说明:用于重新编译过程、函数和包
语法:dbms_ddl.alter_compile(type varchar2,schema varchar2,name varchar2);
其中type指定对象类型(procedure,function,package,trigger),schema指定对象所在方案,name指定对象名
例子:dbms_ddl.alter_compile(‘PROCUDURE’,NULL,‘ADD_EMP’);

2.2、DBMS_DDL.ANALYZE_OBJECT

作用:用于分析表、索引、簇并生成统计数据
语法:dbms_ddl.analyze_object(type varchar2,schema varchar2,name varchar2,method varchar2,estimate_rows number default null,estmate_percent number default null,method_opt varchar2 default null,partname varchar2 default null);
其中type指定对象类型(table\index\delete),method指定分析方法(compute,estimate,delete),estimate_rows指定要顾忌的行数,estimate_percent指定要顾忌的百分比,
method_opt指定分析选项(for table,for all columns等),partname指定要分析的分区。
例子:exec dbms_ddl.analyze_object(‘TABLE’,null,‘EMP’,‘COMPUTE’);

2.3、DBMS_DDL.IS_TRIGGER_FIRE_ONCE

作用:用于检测特定的DML或DDL触发器是否只执行一次
语法:dbms_ddl.is_trigger_fire_once(trig_owver in varchar2,trig_name in varchar2) return boolean;
其中,trig_owver指定触发器所有者,trig_name指定触发器名,返回true表示只被触发一次。

2.4、DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY

作用:用于设置DML或DDL触发器的触发属性
语法:dbms_ddl.set_trigger_firing_property(trig_owner in varchar2,trig_name in varchar2,fire_once in boolean);
其中,fire_once指定触发器属性,当设置为true时只触发一次,false时总是被触发.

3、DBMS_FLASHBACK

用于激活或禁止会话的flashback特征
作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户,grant execute on dbms_flashback to scott;

3.1、DBMS_FLASHBACK.DISABLE

作用:用于禁止会话的flashback模式
语法:dbms_flashback.disable;

3.2、DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER

作用:用于以系统改变号(scn)方式激活会话的flashback
语法:dbms_flashback.enable_at_system_change_number(query_scn in number);
其中query_scn指定flashback对应的scn值

3.3、DBMS_FLASHBACK.ENABLE_AT_TIME

作用:用于以时间方式激活会话的flashback
语法:dbms_flashback.enable_at_time(query_time in timestamp);
其中query_time指定flashback对应的时间点;

3.4、DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER

作用:用于取得系统的当前scn值
语法:dbms_flashback.get_system_change_number return number;

3.5、实例

1)使用dbms_flashback取得特定scn时间点对应的数据
exec dbms_flashback.enable_at_system_change_number(717402);
select sal from emp where ename=‘scott’;–3600
exec dbms_flashback.disable;
select sal from emp where ename=‘scott’;–3000

2)更新scott工资,并休眠5分钟
update emp set sal=3000 where ename=‘scott’;
commit;
exec dbms_lock.sleep(300);

3)取得SCOTT雇员工资及系统SCN值
select sal from emp where ename=‘scott’;–3600
seelct dbms_flashback.get_system_change_number from dual;–717402

4、DBMS_JOB

用于安排和管理作业队列
作用:用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务
注意:当使用DBMS_JOB管理作业时,必须确保设置了初始化参数job_queue_processes(不能为0)

4.1、DBMS_JOB.BROKEN

说明:用于设置作业的中断标识。当中断了作业之后,作业将不会被运行。
语法:dbms_job.broken(job in binary_integer,broken in boolean,next_date in date default sysdate);
其中broken指定中断标记(true表示中断)
例子:dbms_job.broken(2,true,‘sysdate+1’);

4.2、DBMS_JOB.CHANGE

说明:用于改变与作业相关的所有信息,包括作业操作,作业运行日期以及运行时间间隔等.
语法:
dbms_job.change(
job in binary_integer,what in varchar2,
next_date in date,interval in varchar2,
instance in binary_integer default null,
force in boolean default false);
例子:exec dbms_job.change(2,null,null,‘sysdate+2’);

4.3、DBMS_JOB.INSTANCE

说明:用于改变作业的例程
语法:dbms_job.instance(job in binary_integer,instance in binary_integer,force in boolean default false);
例子:exec dbms_job.instance(2,1);

4.4、DBMS_JOB.INTERVAL

说明:用于改变作业的运行时间间隔
语法:dbms_job.interval(job in binary_integer,interval in varchar2);
例子:exec dbms_job.interval(2,‘sysdate+1/24/60’);

4.5、DBMS_JOB.NEXT_DATE

说明:用于改变作业的下次运行日期
语法:dbms_job.next_date(job in binary_integer,next_date in date);
例子:exec dbms_job.next_date(‘2’,‘sysdate+1’);

4.6、DBMS_JOB.REMOVE

说明:删除作业队列中的特定作业
语法:dbms_job.remove(job in binary_integer);
例子:exec dbms_job.remove(21)–删除21号作业

4.7、DBMS_JOB.RUN

说明:用于运行已存在的作业
语法:dbms_job.run(job in binary_integer,force in boolean default false);
例子:exec dbms_job.run(1);

4.8、DBMS_JOB.SUBMIT

说明:用于建立一个新作业.当建立作业时,需要给作业要执行的操作,作业的下次运行日期及运行时间间隔.
语法:
dbms_out.submit (
job out binary_integer,what in varchar2,
next_date in date default sysdate,
interval in varchar2 default ‘null’,
no_parse in boolean default false,
instance in binary_integer default any_instance,
force in boolean default false);
其中,job用于指定作业编号;what用于指定作业要执行的操作;next_date用于指定作业的下次运行日期;interval用于指定运行作业的时间间隔;
no_parse用于指定是否解析与作业相关的过程;instance用于指定哪个例程可以运行作业;force用于指定是否强制运行与作业相关的例程.
例子1:
exec dbms_job.submit(:jobno,‘dbms_ddl.analyze_object(’‘table’’,’‘scott’’,’‘emp’’,’‘compute’’);’,sysdate,‘sysdate+1’);
exec dbms_job.submit(:v_num,‘a;’,sysdate,‘sysdate + (10/(246060))’)加入作业。间隔10秒钟
exec dbms_job.submit(:v_num,‘a;’,sysdate,‘sysdate + (11/(24*60))’)加入作业。间隔11分钟

4.9、DBMS_JOB.WHAT

说明:用于改变作业要执行的操作
语法:dbms_job.what(job in binary_integer,what in varchar2);
例子:exec dbms_job.what(2,‘dbms_stats.gather_table_stats->(’‘scott’’,’‘emp’’);’);

5、DBMS_LOB

dbms_lob包的使用以及使用dbms_lob包来维护lob数据库类型的基本方法。随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包括一些图片和音像资料或者是超长的文本。比如开发一套旅游信息系统,每一个景点都有丰富的图片、音像资料和大量的文字介绍。这就要求后台数据库要有存储这些数据的能力。ORACLE公司在其Oracle8i中通过提供LOB字段实现了该功能。
  在ORACLE数据库中,LOB大对象类型是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。目前,它又分为两种类型:内部LOB和外部LOB。内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle8i支持三种类型的内部LOB:BLOB(二进制数据)、CLOB(单字节字符数据)、NCLOB(多字节国家字符数据)。其中CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频等。目前,Oracle8i只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。
  ORACL提供了多种使用和维护LOB的方式,如使用PL/SQL DBMS_LOB包、调用OCI(Oracle Call Interface)、使用Proc*C/C++、使用JDBC等。其中最为方便有效的是使用PL/SQL调用DBMS_LOB包
  在Oracle中,存储在LOB中数据称为LOB的值,如使用Select对某一LOB字段进行选择,则返回的不是LOB的值,而是该LOB字段的定位器(可以理解为指向LOB值的指针)

5.1、DBMS_LOB.APPEND

将源LOB中的内容加到目的LOB中
PROCEDURE append(dest_lob IN OUT NOCOPY BLOB,
src_lob IN BLOB);
PROCEDURE append(dest_lob IN OUT NOCOPY CLOB CHARACTER SET any_cs,
src_lob IN CLOB CHARACTER SET dest_lob%charset);
其中,各个参数的含义如下:
dest_lob是被源lob添加到的目标lob的定位器。
src_lob是源lob的定位器。
any_cs用来指定字符集。

5.2、DBMS_LOB.CLOSE

关闭已经打开的LOB

5.3、DBMS_LOB.COMPARE

比较两个同种数据类型的LOB的部分或全部值是否相同
dbms_lob.compare(
lob_1 IN BLOB/CLOB/BFILE,
lob_2 IN BLOB/CLOB/BFILE,
amount IN INTEGER:=4294967295,–要比较的字符数(CLOB),字节数(BLOB)
offset_1 IN INTEGER:=1,–lob_1的起始位置
offset_2 IN INTEGER:=1–lob_2 的起始位置)

5.4、DBMS_LOB.COPY

从源LOB中复制数据到目的LOB

5.5、DBMS_LOB.CREATETEMPORARY

在用户的临时表空间中,建立临时LOB

5.6、DBMS_LOB.ERASE

删除LOB中全部或部分内容

5.7、DBMS_LOB.FILECLOSE

关闭打开的BFILE定位符所指向的OS文件

5.8、DBMS_LOB.FILECLOSEALL

关闭当前会话已经打开的所有BFILE文件

5.9、DBMS_LOB.FILEEXISTS

确定file_loc对应的OS文件是否存在,1:存在。0:不存在

5.10、DBMS_LOB.FILEGETNAME

获取BFILE定位符所对应的目录别名和文件名

5.11、DBMS_LOB.FILEISOPEN

确定BFILE对应的OS文件是否打开

5.12、DBMS_LOB.FILEOPEN

打开文件

5.13、DBMS_LOB.FREETEMPORARY

释放在默认临时表空间中的临时LOB

5.14、DBMS_LOB.GETCHUNKSIZE

当建立包含CLOB/BLOB列的表时,通过指定CHUNK参数可以指定操纵LOB需要分配的字节数(数据库尺寸的整数倍)默认为数据块的尺寸

5.15、DBMS_LOB.GETLENGTH

获取LOB的长度
返回指定 LOB 数据的长度的函数
DBMS_LOB.GETLENGTH(lob_loc IN BLOB/CLOB/BFILE/NCLOB) RETURN INTEGER;

5.16、DBMS_LOB.INSTR

返回特定样式数据从LOB某偏移位置开始出现N次的具体位置。

5.17、DBMS_LOB.ISOPEN

确定LOB是否打开,打开:1,未打开:0

5.18、DBMS_LOB.SUBSTR

DBMS_LOB.SUBSTR(
lob_loc IN BLOB/CLOB/BFILE, – 提取的来源
amount IN INTEGER:=32762, – 提取长度
offset IN INTEGER:=1 – 开始位置
)RETURN RAW/VARCHAR2; – 提取到的内容
实例:
SELECT SUBSTR(DDLSQL,1,INSTR(DDLSQL,’) SEGMENT CREATION’,1)+1)||’;’ ,TABLE_NAME FROM (
select REPLACE(REPLACE(DBMS_LOB.substr(dbms_metadata.get_ddl(‘TABLE’,U.TABLE_NAME)),’"’,’’),‘C##CITIBANK.’,’’)AS DDLSQL ,
U.TABLE_NAME FROM USER_TABLES U ) ;

5.19、DBMS_LOB.TRIM

将LOB值减少到指定的长度

5.20、DBMS_LOB.WRITE

向LOB中写入数据
PROCEDURE WRITE(lob_loc IN OUT BLOB,
amount IN BINARY_INTEGER,
offset IN INTEGER,
buffer IN RAW);
PROCEDURE WRITE(lob_loc IN OUT CLOB CHARACTER SET any_cs,
amount IN BINARY_INTEGER,
offset IN INTEGER,
buffer IN VARCHAR2 CHARACTER SET lob_loc%charset);
各参数的含义为:
lob_loc:要写入的LOB定位器。
amount:写入LOB中的字节数。
offset:指定开始操作的偏移量。
buffer:指定写操作的缓冲区。

6、DBMS_LOGMNR

分析重做日志和归档日志
作用:通过使用包DBMS_LOGMNR和DBMS_LOGMNR_D,可以分析重做日志和归档日志所记载的事务变化,最终确定误操作(例如DROP TABLE)的时间,跟踪用户事务操作,跟踪并还原表的DML操作

6.1、DBMS_LOGMNR.ADD_LOGFILE

作用:用于为日志分析列表增加或删除日志文件,或者建立日志分析列表。
语法:dbms_logmnr.add_logfile(LogFileName in varchar2,Option in binary_integer default addfile);
其中LogFileName指定要增加或删除的日志文件名称,Option指定选项(dbms_logmnr.new建立日志分析列表,dbms_logmnr.addfile增加日志文件,dbms_logmnr.removefile删除文件)

6.2、DBMS_LOGMNR.COLUMN_PRESENT

作用:用于确定列是否出现在数据的redo部分或undo部分
语法:dbms_logmnr.column_present(sql_redo_undo in raw,column_name in varchar2 default ‘’) return number;
其中如果列在redo或undo部分存在,则返回1,否则返回0。

6.3、DBMS_LOGMNR.END_LOGMNR

作用:结束logminer会话
语法:dbms_logmnr.end_logmnr

6.4、DBMS_LOGMNR.MINE_VALUE

作用:用于返回要摘取的列信息,该函数在启动logminer之后调用。
语法:dbms_logmner.mine_value(sql_redo_undo in raw,column_name in varchar2 default ‘’) return varchar2;
其中sql_redo_undo用于指定要摘取的数据(redo_value或undo_value),column_name用于指定要摘取的列(格式:schema.table.column);

6.5、DBMS_LOGMNR.START_LOGMNR

作用:用于启动logmnr会话
语法:dbms_logmnr.start_logmnr(startscn in number default o,endscn in number default 0,
starttime in date default ‘01-jan-1988’,endtime in date default ‘01-jan-2988’,
dictfilename in varchar2 default ‘’,option in binary_integer default 0);
其中startscn指定日志分析的起始scn值,endscn指定日志分析的结束scn值,starttime指定日志分析的起始时间,endtime指定日志分析的结束时间,
dictfilename指定日志分析要使用的字典文件名,option指定logminer分析选项。

6.6、实例

首先建表temp,然后执行dml操作和日志切换操作,生产归档日志
sqlplus /nolog
connect system/manager@test
create table temp(cola number,colb varchar2(10));
alter system swith logfile;
insert into temp values(9,‘A’);
update temp set cola=10;
commit;
alter system switch logfile;
delete from temp;
alter system switch logfile;
1)、建立字典文件
说明:字典文件用于存放表及对象ID号之间的对应关系。从9i开始,字典信息既可被摘取到字段文件中,也可被摘取到重做日志中。摘取字典信息到字典文件方法如下:
(1)、设置字典文件所在目录
alter system set utl_file_dir=“g:\test”
scope=spfile;
(2)、重启Oracle Server
sqlplus /nolog
conn sys/test@test as sysdba
shutdown immediate
startup
(3)、摘取字典信息
begin
dbms_logmnr_d.build(dictionary_filename=>‘dict.ora’,dictionary_location=>‘g:\test\logminer’);
end;

2)、建立日志分析列表
(1)、停止Oracle Server并装载数据库
sqlplus /nolog
conn sys/test@test as sysdba
shutdown immediate
startup mount
(2)、建立日志分析列表
begin
dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=>‘g:\test\arc1\test1.arc’);
end;
(3)、增加其他日志文件(可选)
begin
dbms_logmnr.add_logfile(option=>dbms_logmnr.addfile,logfilename=>‘g:\test\arc1\test12.arc’);
end;

3)、启动LogMiner分析
begin
dbms_logmnr.start_logmnr(dictfilename=>‘g:\test\logminer\dict.ora’,
starttime=>to_date(‘2004-04-03:10:10:00’,‘YYYY-MM-DD:HH24:MI:SS’),
endtime=>to_date(‘2004-04-03:15:30:00’,‘YYYY-MM-DD:HH24:MI:SS’));
end;

4)、查看日志分析结果
说明:日志分析结果只能在当前会话查看。
(1)、显示DML分析结果
select operation,sql_redo,sql_undo from vlogmnrcontentswheresegname=′TEMP′;(2)、显示DDL分析结果selecttocahr(timestamp,′yyyy−mm−ddhh23:mi:ss′)time,sqlredofromvlogmnr_contents where seg_name='TEMP'; (2)、显示DDL分析结果 select to_cahr(timestamp,'yyyy-mm-dd hh23:mi:ss') time,sql_redo from vlogmnrcontentswheresegname=TEMP;2DDLselecttocahr(timestamp,yyyymmddhh23:mi:ss)time,sqlredofromvlogmnr_contents where sql_redo like ‘%create%’ or sql_redo like ‘%create%’;
(3)、显示在用字典文件
select db_name,filename from v$logmnr_dictionary;

5)、结束LogMiner
execute dbms_logmnr.end_logmnr;

7、DBMS_LOGMNR_D

7.1、DBMS_LOGMNR_D.BUILD

作用:用于建立字典文件
语法:dbms_logmnr_d.build(dictionary_filename in varcahr2,dictionary_location in varchar2,options in number);
其中dictionary_filename指定字段文件名,dictionary_location指定文件所在位置,options指定字典要写入位置(store_in_flat_file:文本文件,store_in_redo_log2:重新日志)

7.2、DBMS_LOGMNR_D.SET_TABLESPACE

作用:用于改变logminer表所在的表空间
语法:dbms_logmnr_d.set_tablespace(new_tablespace in default varchar2,dict_tablespace in default varchar2,spill_tablespace in default varchar2);
其中new_tablespace指定logminer表所在的表空间,dict_tablespace指定字典表所在表空间,spill_tablespace指定溢出表所在表空间。

8、DBMS_METADATA

提供提取数据库对象的完整定义的接口
作用:提供提取数据库对象的完整定义的接口。这些定义可以用XML或SQL DDL格式描述。
提供两种类型接口:可编程控制的接口;用于Ad Hoc查询的简单接口。

8.1、DBMS_METADATA.GET_DDL

dbms_metadata包中的get_ddl函数详细参数
GET_DDL函数返回创建对象的原数据的DDL语句,详细参数如下
– object_type —需要返回原数据的DDL语句的对象类型
– name — 对象名称
– schema —对象所在的Schema,默认为当前用户所在所Schema
– version —对象原数据的版本
– model —原数据的类型默认为ORACLE
– transform. - XSL-T transform. to be applied.
– RETURNS: 对象的原数据默认以CLOB类型返回
dbms_metadata包中的get_ddl函数定义
FUNCTION get_ddl ( object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT ‘COMPATIBLE’,
model IN VARCHAR2 DEFAULT ‘ORACLE’,
transform. IN VARCHAR2 DEFAULT ‘DDL’) RETURN CLOB;
注意如果使用sqlplus需要进行下列格式化,特别需要对long进行设置,否则无法显示完整的SQL

set linesize 180
set pages 999
set long 90000

8.1.1、实例

select object_name ,object_type, status from dba_objects t where t.object_name like ‘%DBMS%’
and t.object_type like ‘%PACKAGE BODY%’ order by t.object_name ;
select dbms_metadata.get_ddl(‘TABLE’,U.TABLE_NAME) from user_tables u;
常用示例
1)查看创建用户表的SQL
查看当前用户表的SQL
select dbms_metadata.get_ddl(‘TABLE’,‘EMPLOYEES’) from dual;
查看其他用表或索引的SQL

SELECT DBMS_METADATA.GET_DDL(‘TABLE’,‘DEPT’,‘SCOTT’) FROM DUAL;
2)查看创建用户索引的SQL
查看所需表的索引
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME from user_indexes WHERE table_name=‘EMP’;
查看当前用户索引的SQL
select dbms_metadata.get_ddl(‘INDEX’,‘PK_DEPT’) from dual;

3)查看其他用户索引的SQL
select dbms_metadata.get_ddl(‘INDEX’,‘PK_DEPT’,'SCOTT‘) from dual;
4) 查看创建主键的SQL
查看所需表的约束
SQL> select owner, table_name, constraint_name, constraint_type from user_constraints where table_name=‘EMP’;
查看创建主键的SQL
SELECT DBMS_METADATA.GET_DDL(‘CONSTRAINT’,‘EMP_PK’) FROM DUAL;
查看创建外键的SQL
SQL> SELECT DBMS_METADATA.GET_DDL(‘REF_CONSTRAINT’,‘EMP_FK_DEPT’) FROM DUAL;
5)查看创建VIEW的语句
查看当前用户视图的SQL
SQL> SELECT dbms_metadata.get_ddl(‘VIEW’, ‘MY_TABLES’)

查看其他用户视图的SQL
SQL> SELECT dbms_metadata.get_ddl(‘VIEW’, ‘MY_TABLES’,‘SCOTT‘) FROM DUAL;
查看创建视图的SQL也可以
SQL> select text from user_views where view_name=upper(’&view_name’);
6).取得某个TRIGGER的创建语句
select dbms_metadata.get_ddl(‘TRIGGER’,‘触发器名大写’,‘用户名’) from dual;

8.1.2、使用技巧

1)得到一个用户下的所有表,索引,存储过程,函数的ddl
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)
FROM USER_OBJECTS u
where U.OBJECT_TYPE IN (‘TABLE’,‘INDEX’,‘PROCEDURE’,'FUNCTION‘);
2)得到所有表空间的ddl语句
SELECT DBMS_METADATA.GET_DDL(‘TABLESPACE’, TS.tablespace_name)
FROM DBA_TABLESPACES TS;

得到指定表空间的创建语句
SQL> select dbms_metadata.get_ddl(‘TABLESPACE’,NAME) FROM V$TABLESPACE where name in (‘NSTC_WS’,‘RMANS’);

  1. 得到所有创建用户的ddl
    SELECT DBMS_METADATA.GET_DDL(‘USER’,U.username)
    FROM DBA_USERS U;

4)去除storage等多余参数

EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,‘STORAGE’,false);
5) 输出信息采用缩排或换行格式化
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘PRETTY’, TRUE);
6)确保每个语句都带分号
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘SQLTERMINATOR’, TRUE);
7)关闭表索引、外键等关联(后面单独生成)
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘CONSTRAINTS’, FALSE);

EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘REF_CONSTRAINTS’, FALSE);

EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘CONSTRAINTS_AS_ALTER’, FALSE);
8)关闭存储、表空间属性

EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘STORAGE’, FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘TABLESPACE’, FALSE);
9)关闭创建表的PCTFREE、NOCOMPRESS等属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘SEGMENT_ATTRIBUTES’, FALSE);

9、DBMS_OBFUSCATION_TOOLKIT

用于加密和解密应用数据
作用:用于加密和解密应用数据,另外还可以生成密码检验和.通过加密输入数据,可以防止黑客或其他用户窃取私有数据;而通过结合使用加密和密码检验和,可以防止黑客破坏初加密的数据.
当使用该包加密数据时,要求被加密数据的长度必须为8字节的整数倍.当使用DES算法加密数据时,密钥长度不能低于8字节;当使用DES3算法加密数据时,密钥长度不能低于16字节.

9.1、DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT

作用:用于对使用DES3算法所生成的加密数据进行解密。解密密钥必须要与加密密钥完全一致。
语法1:dbms_obfuscation_toolkit.DES3decrypt(input raw,key raw,decrypted_data out raw);
语法2:dbms_obfuscation_toolkit.DES3decrypt(input_string varchar2,key_string varchar2,encrypted_string out varchar2);

9.2、DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT

作用:用于使用DES3算法对输入数据进行加密,并生成加密格式的数据。密钥不能少于16个字符并且数据数据必须是8字节的整数倍。
语法1:dbms_obfuscation_toolkit.DES3encrypt(input raw,key raw,encrypted_data out raw);
语法2:dbms_obfuscation_toolkit.DES3encrypt(input_string varchar2,key_string varchar2,encrypted_string out varchar2);

9.3、DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT

作用:用于对使用DES算法所生成的加密数据进行解密。当对数据进行
解密时,解密密钥必须要与加密密钥完全一致。
语法1:dbms_obfuscation_toolkit.desdecrypt(input raw,key raw,decrypted_data out raw);
语法2:dbms_obfuscation_toolkit.desdecrypt(input_string varchar2,key_string varchar2,decrypted_string out varchar2);
其中decrypted_data\decrypted_string指定存放解密结果的字符串。

9.4、DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT

作用:用于使用DES算法对输入数据进行加密,并生成加密格式的数据。密钥长度不能低于8字节且输入数据必须是8字节的整数倍。
语法1:dbms_obfuscation_toolkit.DESencrypt(input raw,key raw,encrypted_date out raw);
语法2:dbms_obfuscation_toolkit.DESencrypt(ipput_string varchar2,key_string varchar2,encrypted_string out varchar2);
其中input\input_string指定输入的二进制数据或输入字符串,key\key_string指定加密密钥,encrypted_date\encrypted_string指定存放加密结果的字符串

9.5、DBMS_OBFUSCATION_TOOLKIT.MD5

作用:用于使用md5算法生成密码校验码。可以防止其他用户破坏被传输的加密数据。
语法1:dbms_obfuscation_toolkit.md5(input raw,checksum out raw);
语法2:dbms_obfuscation_toolkit.md5(input_string varchar2,checksum_string out varchar2);
其中checksum_string(checksum)指定存放密码校验码的字符串。

9.5、实例一

declare
encrypted_string varchar2(100);
decrypted_string varchar2(100);
str1 varchar2(8):='中国你好';
key varchar2(16):='ABCDFDSDSASS$1234';
str2 varchar2(100);
str3 varchar2(100);
begin
--DESencrypt
dbms_obfuscation_toolkit.DESencrypt(input_string=>'SCOTTsco',key_string=>'abcd1234',encrypted_string=>encrypted_string);
dbms_output.put_line(encrypted_string);
--DESdecrypt
dbms_obfuscation_toolkit.DESdecrypt(input_string=>encrypted_string,key_string=>'abcd1234',decrypted_string=>decrypted_string);
dbms_output.put_line(decrypted_string);
--DES3encrypt
dbms_obfuscation_toolkit.DES3encrypt(input_string=>str1,
key_string=>key,encrypted_string=>str2);
dbms_output.put_line(str2);
--DES3decrypt
dbms_obfuscation_toolkit.DES3encrypt(input_string=>str2,
key_string=>key,decrypted_string=>str3);
dbms_output.put_line(str3);
--md5
dbms_obfuscation_toolkit.md5(input_string=>str1,checksum_string=>str2);
dbms_output.put_line(str2);
end;

9.6、示例二

说明:为了防止黑客窃取数据,应该对数据进行加密,为防止黑客窜改数据,应该使用密码校验来确保数据的正确性。
下面使用管道发送加密信息并确保消息正确性
(1)、建立过程send_message
说明:用于生产消息的密码校验码、加密信息,并分别发到不同的管道

create or replace procedure send_message(message varchar2) is
flag int;
checksum varchar2(100);
key varchar2(100);
encry_str varchar2(100);
begin
dbms_obfuscation_toolkit.md5(input_string=>message,checksum_string=>checksum);--用MD5为消息生产密码校验码
flag:=dbmspipe.create_pipe('checksum');--建立checksum管道
if flag=0 then
dbms_pipe.pack_message(checksum);
flag:=dbms_pipe.send_message('checksum');--发送校验码
end if;
dbms_obfuscation_toolkit.desencrypt(input_string=>message,key_string=>key,encrypted_string=>encry_str);--加密要发送的消息。
flag:=dbms_pipe.create_pipe('encrypt');--建立encrypt管道
if flag=0 then
dbms_pipe.pack_message(encrypt);
flag:=dbms_pipe.send_message('encrypt');--发送信息
end if;
end;

(2)、建立过程receive_message
说明:用于接收校验码和消息

create or replace procedure receive_message is
flag int;
source_checksum varchar2(100);
dest_checksum varchar2(100);
key varchar2(100):='123456778SAD';
encry_str varchar2(100);
decry_str varchar2(100);
begin
flag:=dbms_pipe.receive_message('encrypt');--接收加密消息
if flag=0 then
dbms_pipe.unpack_message(encry_str);
flag:=dbms_pipe.remove_pipe('encrypt');
end if;
flag:=dbms_pipe.receive_message('checksum');--接收加密消息
if flag=0 then
dbms_pipe.unpack_message(source_checksum);
flag:=dbms_pipe.remove_pipe('checksum');
end if;
dbms_obfuscation_toolkit.desdecrypt(input_string=>encry_str,
key_string=>key,decrypted_string=>decry_str);--使用密钥解密信息
dbms_obfuscation_toolkit.md5(input_string=>decry_str,checksum_string=>dest_checksum);--生产密码校验码
if trim(source_checksum)=trim(dest_checksum) then
dbms_output.put_line(decry_str);
else
dbms_output.put_line('消息被窜改');
end if;
end;

(3)、使用
会话1:exec send_message(‘中国你好’);
会话2:exec scott.receive_message;

10、DBMS_OUTPUT

作用:用于输入和输出信息,使用过程PUT和PUT_LINES可以将信息发送到缓冲区,使用过程GET_LINE和GET_LINES可以显示缓冲区信息。
该包用来输出plsql变量的值,属于系统用户sys。

10.1、DBMS_OUTPUT.DISABLE

说明:该过程用于禁止本包,并清除缓冲区的内容。当本包被禁止,将无法调用本包的其它其余过程和函数。
注意:如果在SQL*PLUS中使用SERVEROUTPUT选项,则没有必要使用该过程。
语法:DBMS_OUTPUT.DISABLE;

10.2、DBMS_OUTPUT.ENABLE

说明:该过程用于激活本包,如果没有被激活,将无法调用本包的其它其余过程和函数。当调用该过程,缓冲区最大尺寸为1000000字节,最小为2000字节,默认为20000字节。
注意:如果在SQL*PLUS中使用SERVEROUTPUT选项,则没有必要使用该过程。
语法:DBMS_OUTPUT.ENABLE(buffer_size in integer default 20000)

10.3、DBMS_OUTPUT.GET_LINE

说明:过程get_line用于取得缓冲区的单行信息,
语法:dbms_output.get_line(line out varchar2,status out integer);
其中line用于取得缓冲区的单行信息(最大255字节),status用于返回过程执行是否成功,0成功1表示没有行;

10.4、DBMS_OUTPUT.GET_LINES

说明:get_lines用于取得缓冲区的多行信息。
语法:dbms_output.get_lines(lines out chararr,numlines in out integer);
lines用于取得缓冲区的多行信息,numlines指定要检索的行数,并返回实际检索的行数

10.5、DBMS_OUTPUT.NEW_LINE

说明:该过程用于在行的尾部追加行结束符。
语法:dbms_output.new_line;

10.6、DBMS_OUTPUT.PUT

说明:过程put则用地分块建立行信息,需要换行需要使用过程new_line追加行结束符。
语法:dbms_output.put(item in number\varchar2\date);

10.7、DBMS_OUTPUT.PUT_LINE

说明:过程put_line用于将一个完整行的信息写入到缓冲区中,会自动在行的尾部追加行结束符;
语法:dbms_output.put_line(item in number\varchar2\date);
当在sql*plus中使用包过程put、put_line时,需要设置serveroutput选项。
例子:
set serveroutput on
begin
dbms_output.put_line(‘伟大的中华民族’);
dbms_output.put(‘中国’);
dbms_output.put(’,伟大的祖国’);
dbms_output.new_line;
end;

10.8实例

1)、例子一
var line varchar2(100);
var status number
begin
dbms_output.enable;
dbms_output.put_line(‘伟大的中华民族’);
dbms_output.put(‘中国’);
dbms_output.put(’,伟大的祖国’);
dbms_output.put.new_line;
dbms_output.get_line(:line,:status);
end;

2)、例子二
declare
type line_table_type is table of varchar2(255) index by binary integer;
line_table line_table_type;
lines number(38):=3;
begin
dbms_output.enable;
dbms_output.put_line(‘伟大的中华民族’);
dbms_output.put(‘中国’);
dbms_output.put(’,伟大的祖国’);
dbms_output.put.new_lines;
dbms_output.get_line(line_table,lines);
end;

11、DBMS_PIPE

类似UNIX系统的管道
说明:Oracle管道类似UNIX系统的管道,但不采用OS机制实现,管道信息被缓存到SGA中,当关闭例程时会丢失管道信息,建立公用管道所有数据库用户都可访问,私有管道只能由建立这访问。
作用:用于在同一例程程的不同会话之间进行管道通信.注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权.
sql>conn sys/oracle as sysdba;
sql>grant execute on dbms_pipe to scott;

11.1、DBMS_PIPE.CREATE_PIPE

作用:该函数用于建立公用管道或私有管道.如果将参数private设置为TRUE,则建立私有管道;如果设置为FALSE,则建立公用管道.
语法:dbms_pipe.create_pipe(pipename in varchar2,maxpipesize in integer default 8192,private in boolean default true) return integer;
其中,pepename指定管道名称,maxpipesize指定管道消息的最大尺寸,private指定管道类型,函数返回0则成功,反之失败。

11.2、DBMS_PIPE.NEXT_ITEM_TYPE

说明:该函数用于确定本地消息缓冲区下一项的数据类型。在调用receive_message之后调用。
语法:dbms_pipe.next_item_type return integer;
其中,如果该函数返回0,则表示管道没有任何消息;如果返回6,则表示下一项的数据类型为number;如果返回9,则表示下一项的数据类型为varchar2;
如果返回11,则表示下一项的数据类型为rowid;如果返回12,则表示下一项的数据类型为date;如果返回23,则表示下一项的数据类型为raw.

11.3、DBMS_PIPE.PACK_MESSAGE

作用:该过程用于将变量写入到本地消息缓冲区。
说明:为了个管道发消息,首先使用过程pack_message将消息写入本地消息缓冲区,然后使用send_message将消息发送到管道。
语法:dbns_pipe.pack_message(item in varchar2/nchar2/number/date);
dbns_pipe.pack_message_raw(item in raw);
dbns_pipe.pack_message_rowid(item in rowid);

11.4、DBMS_PIPE.PURGE

说明:该过程用于清除管道中的内容。
语法:dbms_pipe.purge(pipename in varchar2);

11.5、DBMS_PIPE.RECEIVE_MESSAGE

说明:该函数用于接收管道消息,并将接收到的消息写入到本地消息缓冲区。当接收完管道信息之后,会删除管道消息,管道消息只能被接收一次。
语法:
dbms_pipe.receive_message(pepename in varchar2,timeout in integer default maxwait) return integer;
其中,返回0接受成功,返回1超时,返回2本地缓冲区不能容纳管道消息,返回3发生中断

11.6、DBMS_PIPE.REMOVE_PIPE

作用:该函数用于删除已经建立的管道
语法:dbms_pipe.remove_pipe(pepename in varchar2) return integer;
其中,函数返回0表示成功,否则会显示错误信息。

11.7、DBMS_PIPE.RESET_BUFFER

说明:该过程用于复位管道缓冲区,因为所有管道都共享单个管道缓冲区,所以在使用新管道之前应该复位管道缓冲区。
语法:dbms_pipe.reset_buffer;

11.8、DBMS_PIPE.SEND_MESSAGE

作用:该函数用于将本地消息缓冲区中的内容发送到管道。
语法:dbms_pipe.send_message(pipename in varchar2,timeout in integer defalut maxwait,maxpipesize in integer default 8192) return integer;
其中,timeout指定发送消息的超时时间,0成功1超时3中断。

11.9、DBMS_PIPE.UNIQUE_SESSION_NAME

说明:该函数用于为特定会话返回惟一的名称,并且名称的最长度为30字节,对同一会话其值不变。
语法:dbms_pipe.unique_session_name

11.10、DBMS_PIPE.UNPACK_MESSAGE

作用:该过程用于将消息缓冲区的内容取出来写入到变量中,每次只能取一条,需要取出多条需要多次调用。
说明:在使用函数receive_message接收到管道消息之后,应该使用过程unpack_message取得消息缓冲区的消息。
语法:dbms_pipe.unpack_message(item out varchar2\nchar\number\date);
dbms_pipe.unpack_message_raw(item out raw);
dbms_pipe.unpack_message_rowid(item out rowid);

11.11、实例

1)、综合例子1
declare
falg int;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_rowid rowid;
item_no int;
message varchar2(100);
v_session varchar2(200);
begin
flag := dbms_pipe.create_pipe(‘public_pipe’, 8192, false);
if flag = 0 then
dbms_output.put_line(‘建立公用管道成功’);
end if;
select ename,sal,rowid into v_ename,v_sal,v_rowid from emp where empno=7788;
dbns_pipe.pack_message(v_ename||’,’||v_sal||’,’||v_rowid);
flag :dbms_pipe.send_message(‘PUBLIC_PIPE’);
if flag = 0 then
dbms_output.put_line(‘发送成功’);
end if;
flag := dbms_pipe.receive_message(‘PUBLIC_PIPE’);
if flag = 0 then
dbms_output.put_line(‘成功’);
end if;
item_no := dbms_pipe.next_item_type;
dbms_output.put_line(item_no);
dbms_pipe.unpack_message(message);
dbms_output.put_line(message);
–remove_pipe
flag:=dbms_pipe.remove_pipe(‘PUBLIC_PIPE’);
if flag = 0 then
dbms_output.put_line(‘删除成功’);
end if;
–unique_session_name
v_session:=dbms_pipe.unique_session_name;
dbms_output.put_line(v_session);
end;

2)、综合例子2
使用管道是,一个会话需要将消息发送到管道中,另一个会话则需要接收管道消息。
发送消息到管道需要先将消息写入本地消息缓冲区,然后再发送到管道;
接收消息需要先使用本地消息缓冲区接收管道消息,然后从消息缓冲区取得具体消息。
create or replace procedure send_message(pepename varchar2,message varchar2) is
flag int;
begin
flag:=dbms_pipe.create_pipe(pipename);
if flag=0 then
dbms_pipe.pack_message(message);
flag:=dbms_pipe.send_message(pipename);
end if;
end send_message;

create or replace procedure receive_message(pipename varchar2,message out varchar2) is
flag int;
begin
flag:=dbms_pipe.receive_message(pipename);
if flag=0 then
dbms_pipe.unpack_message(message);
flag:=dbms_pipe.remove_pipe(pipename);
end if;
end receive_message;

会话一:exec send_message(‘pipe1’,‘你好’);
会话二:
var message varchar2(100)
exec scorr.receive_message(‘pipe1’,:message)
print message

12、DBMS_RANDOM

随机数生成器
提供了内置的随机数生成器,可以用于快速生成随机数

12.1、DBMS_RANDOM.INITIALIZE

作用:用于初始化dbms_random包,必须提供随机数种子。
语法:dbms_random.initialize(seed in binary_integer);
其中seed指定随机数种子。

12.2、DBMS_RANDOM.RANDOM

作用:用于生产随机数
语法:dbms_random.randon return binary_integer
实例:
declare
num int;
seed number:=1000000;
begin
dbms_random.initialize(seed);
for i in 1…10 loop
num:=abs(dbms_random.random()/seed);
dbms_output.put_line(num);
end loop;
dbms_random.terminate.
end;

12.3、DBMS_RANDOM.SEED

作用:用于复位随机数种子
语法:dbms_random.seed(seed in binary_integer);

12.4、DBMS_RANDOM.TERMINATE

作用:关闭DBMS_RANDOM包
语法:dbms_random。terminate;

12.5、DBMS_RANDOM.STRING

用法是DBMS_RANDOM.STRING(选项, 返回字符串长度)
选项有如下几种可供选择:
1)‘u’, ‘U’ - returning string in uppercase alpha characters
2)‘l’, ‘L’ - returning string in lowercase alpha characters
3)‘a’, ‘A’ - returning string in mixed case alpha characters
4)‘x’, ‘X’ - returning string in uppercase alpha-numeric characters
5)‘p’, ‘P’ - returning string in any printable characters.
6)Otherwise the returning string is in uppercase alpha characters.

2.以随机生成8位密码这个简单需求为例演示一下各个选项的用法
1)生成由大写字母组成的8位密码
sys@ora10g> select dbms_random.string(‘u’,8) “u_8_password” from dual;
2)生成由小写字母组成的8位密码
sys@ora10g> select dbms_random.string(‘l’,8) “l_8_password” from dual;
3)生成由大小写字母混合出现的8位密码
sys@ora10g> select dbms_random.string(‘a’,8) “a_8_password” from dual;
4)生成由大写字母和数字组成的8位密码
sys@ora10g> select dbms_random.string(‘x’,8) “x_8_password” from dual;
5)生成由任何可打印字符组成的8位密码
sys@ora10g> select dbms_random.string(‘p’,8) “p_8_password” from dual
6)当选项为其他字母的时候返回的内容仍将是大写字母
选项以“8”为例,返回的8位随机字符串内容是由大写字母组成的。
sys@ora10g> select dbms_random.string(‘8’,8) “8_8_password” from dual;

13、DBMS_STATS

用于搜集,查看,修改数据库对象的优化统计信息

13.1、DBMS_STATS.CREATE_STAT_TABLE

作用:用于在特定方案建立统计表
语法:dbms_stats.create_stat_table(ownname varchar2,stattab varchar2,tblspace varchar2 default null);
其中tblspace指定统计表所在表空间。
例子:exec dbms_stats.create_stat_table(‘scott’,‘stattab’);

13.2、DBMS_STATS.DELETE_COLUMN_STATS

作用:用于删除列的统计信息。
语法:dbms_stats.delete_column_stats(ownname varchar2,tabname varchar2,colname varchar2,
partname varchar2 default null,stattab varchar2 default null,statid varchar2 default null,
cascade_parts boolean default true,statown varchar2 default null,no_invalidate boolean default false);
其中cascade_parts指定是否要级联删除分区统计,no_invalidate指定是否要使相关游标无效。
例子:dbms_stats.delete_column_stats(‘scott’,‘emp’,‘ename’);

13.3、DBMS_STATS.DELETE_DATABASE_STATS

作用:用于删除整个数据库的统计信息
语法:dbms_stats.delete_database_stats(stattab varchar2 default null,statid varchar2 default null,
statown varchar2 default null,no_invalidate boolean default false);
例子:exec dbms_stats.delete_database_stats

13.4、DBMS_STATS.DELETE_INDEX_STATS

作用:用于删除索引统计信息
语法:dbms_stats.delete_index_stats(ownname varchar2,indname varchar2,
partname varchar2 default null,stattab varchar2 default null,
statid varchar2 default null,cascade_parts boolean default true,
statown varchar2 default null,no_invalidate boolean default false);
例子:exec dbms_stats.delete_index_stats(‘scott’,‘pk_emp’);

13.5、DBMS_STATS.EXPORT_COLUMN_STATS

作用:用于导出列统计并存储到统计表中。
语法:dbms_stats.export_column_stats(ownname varchar2,tabname varchar2,colname varchar2,
partname varchar2 default null,stattab varchar2,
statid varchar2 default null,statown varchar2 default null);
例子:exec dbms_stats.export_column_stats(‘scott’,‘emp’,‘ename’,stattab=>‘stattab’);

13.6、实例

declare
dist_count number;
density number;
null_count number;
srec dbms_stats.statrec;
avg_col_len number;
numrows number;
numlblks number;
numdist number;
avglblk number;
avgdblk number;
clstfct number;
indlevel number;
avgrlen numer;
begin
--get_column_stats
dbms_stats.get_column_stats('scott','emp','job',distcnt=>dist_count,density=>density,nullcnt=>null_count,srec=>srec,avgclen=>avg_col_len);
dbms_output.put_line('不同列值个数'||dist_count);
dbms_output.put_line('列平均长度'||avg_col_len);
--get_index_stats
dbmns_stats.get_index_stats('scott','PK_EMP',numrows=>numrows,numlblks=>numlblks,
numdist=>numdist,avglblk=>avglblk,avgdblk=>avgdblk,clstfct=>clstfct,indlevel=>indlevel);
dbms_output.put_line('叶块个数'||numlblks);
dbms_output.put_line('索引层次'||indlevel);
--get_table_stats
dbms_stats.get_table_stats('scott','emp',numrows=>numrows,numlblks=>numlblks,avgrlen=>avgrlen);
dbms_output.put_line('表的总计行数'||numrows);
dbms_output.put_line('表所占有的块个数'||numlblks);
dbms_output.put_line('表行的平均水平'||avgrlen);
end;

14、DBMS_TRANSACTION

用于在过程,函数,和包中执行SQL事务处理语句

14.1、DBMS_TRANSACTION.ADVISE_COMMIT

说明:用于建议提交远程数据库的分布式事务,其作用与SQL语句alter seesion advise commit完全相同
语法:dbms_transactino.advise_commit;

14.2、DBMS_TRANSACTION.COMMIT

说明:用于提交当前事务,其作用与sql语句commit完全相同。
语法:dbms_transaction.commit;

14.3、DBMS_TRANSACTION.COMMIT_FORCE

说明:用于强制提交分布式事务,其作用与SQL语句commit force text,number完全相同
语法:dbms_transaction.commit_force(xid varchar2,scn carchar2 default null);

14.4、DBMS_TRANSACTION.READ_ONLY

说明:用于开始只读事务,其作用与SQL语句SET TRANSACTION READ ONLY完全相同,该过程必须是事务开始的第一条语句。
语法:dbms_transactino.read_only

15、UTL_FILE

用于读写OS文件
作用:用于读写OS文件.使用该包访问OS文件时,必须要为OS目录建立相应的DIRECTORY对象…当用户要访问特定目录下的文件时,必须要具有读写DIRECTORY对象的权限.在使用UTL_FILE包之前,应首先建立DIRECTORY对象.
1)、file_type
作用:该类型是utl_file包中所定义的记录类型,其成员是私有的,不能被直接引用。
该类型的定义如下:
type file_type is record(is binary_integer,datatype binary_integer);

15.1、UTL_FILE.FCOPY

作用:用于将源文件的全部或部分内容复制到目标文件中。如果不设置起始行和结束行则复制文件所有内容。
语法:utl_file.fcopy(location ni varcahr2,
filename in varchar2,
dest_dir in varchar2,
dest_file in varchar2,
start_line in pls_integer default 1,
end_line in pls_integer default null);
其中location指定源文件所在目录对应的directory对象,filename指定源文件名,
dest_dir指定目标文件所在目录对应的directory对象,dest_file指定目标文件的名字,
start_line指定起始行号,end_line指定结束行号。
例子:exec utl_file.fcopy(‘USER_DIR’,‘a.txr’,‘USER_DIR’,‘c.txt’);

15.2、UTL_FILE.GET_LINE

作用:用于从已打开文件中读取行内容,行内容会被读取到输出缓冲区
语法:utl_file.get_line(file in file_type,buffer out varchar2,
linesize in number,len in pls_integer default null);
其中buffer用于存储读取信息,linesize指定要读取的最大字节输,len指定实际读取长度。

15.3、实例

declare
handle utl_file.file_type;
buffer varchar2(100);
buffer1 raw(100);
fileexist boolean;
filelen int;
os_block int;
begin
--is_open
if not utl_file.is_open(handle) then
--fopen
bandle:=utl_file.fopen('user_dir','readme.txt','r',1000);
end if;
dbms_output.put_line('打开文件成功');
--get_line
utl_file.get_line(handle,buffer,100);
dbms_output.put_line(buffer);
utl_file.fclose(handle);
--get_line_nchar
handle:=utl.file.fopen_nchar('USER_DIR','a.txt'.'r',1000);
utl_file.get_line_nchar(bandle.buffer);
dbms_output.put_line(buffer);
utl_file.fclose(handle);
--get_raw
handle:=utl_file.fopen('USER_DIR','a.txt'.'r',1000);
utl_file.get_raw(handle,buffer1,100);
dbms_output.put_line(buffer1);
utl_file.fclose(handle);
--put
handle:=utl_file.fopen('USER_DIR','b.txt'.'w',1000);
buffer:='中华';
utl_file.put(handle,buffer);
utl_file.new_line(handle);
buffer:='中国';
utl_file.put_line(handle,buffer);
utl_file.fclose(handle);
--put_nchar
handle:=utl_file.fopen('USER_DIR','b.txt'.'w',1000);
buffer:='中华';
utl_file.put(handle,buffer);
utl_file.new_line(handle);
buffer:='中国';
utl_file.put_line_nchar(handle,buffer);
utl_file.fclose(handle);
--put_raw
handle:=utl_file.fopen('USER_DIR','b.txt'.'w',1000);
buffer:='01f3d5a4c7d8';
utl_file.put_raw(handle,buffer);
utl_file.new_line(handle);
utl_file.fclose(handle);
--putf
handle:=utl_file.fopen('USER_DIR','b.txt'.'w',1000);
utl_file.putf(handle,'%s\n%s\n%s\n','历史','文明','万岁');
utl_file.fclose(handle);
--fseek
bandle:=utl_file.fopen('USER_DIR','a.txt','r');
dbms_output.put_line('文件指针起始位置:'||utl_file.fgetpos(handle));
utl_file.fseek(handle,20);
dbms_output.put_line('文件指针起当前位置:'||utl_file.fgetpos(handle));
utl_file.fclose(handle);
--fgetattr
utl_file.fgetatttr('USER_DIR','readme.txt',fileexist,filelen,os_block);
if fileexist then
dbms_output.put_line('文件尺寸:'||filelen);
dbms_output.put_line('OS块尺寸:'||os_block);
end if;
end;

16、UTL_INADDR

用于取得局域网或Internet环境中的主机名和IP地址

16.1、UTL_INADDR.GET_HOST_ADDRESS

作用:用于取得指定主机所对应的ip地址
语法:utl_inaddr.get_host_address(host in varchar2 default null) return varchar2;
其中host指定主机名
例子:select utl_inaddr.get_host_address(‘liutao’) ip from dual;

16.2、UTL_INADDR.GET_HOST_NAME

作用:用于取得指定IP地址所对应的主机名
语法:utl_inaddr.get_host_name(ip in varchr2 default null) return varchar2;
其中ip指定tcp/ip地址
例子:select utl_inaddr.get_host_name(‘127.0.0.1’) hostname from dual;

17、OWA_UTIL

17.1、OWA_UTIL.WHO_CALLED_ME

返回有关调用它的PL/SQL代码单元的信息(以输出参数的形式)
owa_util.who_called_me(
owner out varchar2
name out varchar2
lineno out number
caller_t out varchar2);
实例:
CREATE OR REPLACE FUNCTION fn_getname
RETURN VARCHAR2
IS
l_owner VARCHAR2 (30);
l_name VARCHAR2 (30);
l_lineno NUMBER;
l_type VARCHAR2 (30);
BEGIN
OWA_UTIL.who_called_me (l_owner, l_name, l_lineno, l_type);
RETURN l_owner || ‘.’ || l_name||’:’||to_char(l_lineno)||’,’||l_type;
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值