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′;(2)、显示DDL分析结果selecttocahr(timestamp,′yyyy−mm−ddhh23: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’);
- 得到所有创建用户的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;
本文详细介绍了Oracle数据库中的一些内置包,如DBMS_ALERT、DBMS_DDL、DBMS_FLASHBACK、DBMS_JOB、DBMS_LOB等,涵盖了它们的主要功能、语法和实例,帮助读者理解如何使用这些包进行数据库管理和操作。
1430

被折叠的 条评论
为什么被折叠?



