Oracle 10g中常用包介绍以及各个包的用法详解
一、dbms_output
1、概述
作用:用于输入和输出信息,使用过程put和put_lines可以将信息发送到缓冲区,使用过程get_line和get_lines可以显示缓冲区信息。
该包用来输出plsql变量的值,属于用户sys。下面讲述包的组成:
2、包的组成
1)、enable
说明:该过程用于激活本包,如果没有被激活,将无法调用本包的其它其余过程和函数。当调用该过程,缓冲区最大尺寸为1000000字节,最小为2000字节,默认为20000字节。
注意:如果在sql*plus中使用serveroutput选项,则没有必要使用该过程。
语法:dbms_output.enable(buffer_size in integer default 20000);
2)、disable
说明:该过程用于禁止本包,并清除缓冲区的内容。当本包被禁止,将无法调用本包的其它其余过程和函数。
注意:如果在sql*plus中使用serveroutput选项,则没有必要使用该过程。
语法:dbms_output.disable;
3)、put和put_line
说明:过程put_line用于将一个完整行的信息写入到缓冲区中,会自动在行的尾部追加行结束符;
过程put则用地分块建立行信息,需要换行需要使用过程new_line追加行结束符。
语法:dbms_output.put(item in number\varchar2\date);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;
4)、new_line
说明:该过程用于在行的尾部追加行结束符。
语法:dbms_output.new_line;
5)、get_line和get_lines
说明:过程get_lin用于取得缓冲区的单行信息,get_lins用于取得缓冲区的多行信息。
语法:dbms_output.get_line(line out varchar2,status out integer);
dbms_output.get_lines(lines out chararr,numlines in out integer);
其中line用于取得缓冲区的单行信息(最大255字节),status用于返回过程执行是否成功,0成功1表示没有行;
lines用于取得缓冲区的多行信息,numlines指定要检索的行数,并返回实际检索的行数。
3、包的应用实例
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;
二、dbms_job
1、概述
作用:用于安排和管理作业队列,通过使用作业,可以使oracle定期执行特定的任务
注意:当使用dbms_lob管理作业时,必须确保设置了初始化参数job_queue_processes(不能为0)
2、包的组成
1)、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/(24*60*60))')加入作业。间隔10秒钟
exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (11/(24*60))')加入作业。间隔11分钟
2)、remove
说明:删除作业队列中的特定作业
语法:dbms_job.remove(job in binary_integer);
例子:exec dbms_job.remove(21)--删除21号作业
3)、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)、what
说明:用于改变作业要执行的操作
语法:dbms_job.what(job in binary_integer,what in varchar2);
例子:exec dbms_job.what(2,'dbms_stats.gather_table_stats->(''scott'',''emp'');');
5)、next_date
说明:用于改变作业的下次运行日期
语法:dbms_job.next_date(job in binary_integer,next_date in date);
例子:exec dbms_job.next_date('2','sysdate+1');
6)、instance
说明:用于改变作业的例程
语法:dbms_job.instance(job in binary_integer,instance in binary_integer,force in boolean default false);
例子:exec dbms_job.instance(2,1);
7)、interval
说明:用于改变作业的运行时间间隔
语法:dbms_job.interval(job in binary_integer,interval in varchar2);
例子:exec dbms_job.interval(2,'sysdate+1/24/60');
8)、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');
9)、run
说明:用于运行已存在的作业
语法:dbms_job.run(job in binary_integer,force in boolean default false);
例子:exec dbms_job.run(1);
三、dbms_pipe
1、概述
说明:oracle管道类似unix系统的管道,但不采用os机制实现,管道信息被缓存到sga中,当关闭例程时会丢失管道信息,建立公用管道所有数据库用户都可访问,私有管道只能由建立这访问。
作用:用于在同一例程程的不同会话之间进行管道通信.注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权.
sql>conn sys/oracle as sysdba;
sql>grant execute on dbms_pipe to scott;
2、包的组成
1)、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则成功,反之失败。
2)、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);
3)、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中断。
4)、receive_message
说明:该函数用于接收管道消息,并将接收到的消息写入到本地消息缓冲区。当接收完管道信息之后,会删除管道消息,管道消息只能被接收一次。
语法:
dbms_pipe.receive_message(pepename in varchar2,timeout in integer default maxwait) return integer;
其中,返回0接受成功,返回1超时,返回2本地缓冲区不能容纳管道消息,返回3发生中断。
5)、next_item_type
说明:该函数用于确定本地消息缓冲区下一项的数据类型。在调用receive_message之后调用。
语法:dbms_pipe.next_item_type return integer;
其中,如果该函数返回0,则表示管道没有任何消息;如果返回6,则表示下一项的数据类型为number;如果返回9,则表示下一项的数据类型为varchar2;
如果返回11,则表示下一项的数据类型为rowid;如果返回12,则表示下一项的数据类型为date;如果返回23,则表示下一项的数据类型为raw.
6)、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);、
7)、remove_pipe
作用:该函数用于删除已经建立的管道
语法:dbms_pipe.remove_pipe(pepename in varchar2) return integer;
其中,函数返回0表示成功,否则会显示错误信息。
8)、purge
说明:该过程用于清除管道中的内容。
语法:dbms_pipe.purge(pipename in varchar2);
9)、reset_buffer
说明:该过程用于复位管道缓冲区,因为所有管道都共享单个管道缓冲区,所以在使用新管道之前应该复位管道缓冲区。
语法:dbms_pipe.reset_buffer;
10)、unique_session_name
说明:该函数用于为特定会话返回惟一的名称,并且名称的最长度为30字节,对同一会话其值不变。
语法:dbms_pipe.unique_session_name
3、包的应用
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
四、dbms_alert
1、概述
作用:用于生成并传递数据库预警信息.使用包dbms_alert,则必须以sys登陆,为该用户授予执行权限.
sql>conn sys/oracle as sysdba
sql>grant execute on dbms_alert to scott;
2、包的组成
1)、register
说明:用于注册预警事件
语法:dbms_alter.register(name in varchar2);
其中name指定预警事件名称,其值不能超过30字节。
例子:exec dbms_alter.register('alter1');
2)、remove
说明:用于删除会话不需要的预警事件.
语法:dbms_alert.remove(name in varchar2);
例子:exec dbms_alert.remove('alert1');
3)、removeall
说明:用于删除当前会话所有已注册的预警事件
语法:dbms_alter.removeall
4)、set_defaults
说明:用于设置检测预警事件的时间间隔,默认时间间隔为5秒
语法:dbms_alert.set_defaults(sensitivity in number);
例子:dbms_alert.set_defaults(20)
5)、signal
说明:用于指定预警事件所对应的预警消息。只有在提交事务时才会发出预警信号,而当回退事务时不会发出预警信号。
语法:dbms_alert.signal(name in varchar2,message in varchar2);
其中message指定预警事件的消息,长度不超过1800字节。
例子:exec dbms_alert.signal('alert1','hello');
6)、waitany
说明:用于等待当前会话的任何预警事件,并且在预警事件发生时输出相应信息.在执行该过程之前,会隐含地发出commit.
语法:
dbms_alter.waitany(name out varchar2,message out varchar2,status out integer,timeout in number default maxwait);
其中status用于返回状态值,返回0表示发生了预警事件,返回1表示超时;timeout用于设置预警事件的超时时间.
7)、waitone
说明:用于等待当前会话的特定预警事件,并且在发生预警事件时输出预警消息.在执行该过程之前,会隐含地发出commit.
dbms_alter.waitone(name out varchar2,message out varchar2,status out integer,timeout in number default maxwait);
3、应用实例
修改员工工资时发出预警
create or replace trigger tr_upd_sal
after update of sal on emp
begin
dbms_alert.signal('sal_upd_alert','修改了雇员工资');
end;
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;
五.dbms_transaction
1、概述
作用:用于在过程,函数,和包中执行sql事务处理语句.
2、包的组成
1)、read_only
说明:用于开始只读事务,其作用与sql语句set transaction read only完全相同,该过程必须是事务开始的第一条语句。
语法:dbms_transactino.read_only
2)、read_write
说明:用于开始读写事务,其作用与sql语句set transaction read write完全相同,该过程必须是事务开始的第一条语句。
语法:dbms_transactino.read_write
3)、advise_rollback
说明:用于建议回退远程数据库的分布式事务,其作用与sql语句alter seesion advise rollback完全相同
语法:dbms_transactino.advise_rollback
4)、advise_nothing
说明:用于建议远程数据库的分布式事务不进行任何处理,其作用与sql语句alter seesion advise nothing完全相同
语法:dbms_transactino.advise_nothing
5)、advise_commit
说明:用于建议提交远程数据库的分布式事务,其作用与sql语句alter seesion advise commit完全相同
语法:dbms_transactino.advise_commit;
6)、use_rollback_segment
说明:用于指定事务所要使用的回滚段,其作用与sql语句set transaction use rollback segment完全相同
语法:dbms_transactino.use_rollback_segment(rb_name varchar2);
其中,rb_name指定事务所要使用的回滚段名称。
7)、commit_comment
说明:用于在提交事务时指定注释,其作用与sql语句commit comment<text>完全相同
语法:dbms_transactino.commit_comment(cmnt varchar2);
其中cmnt用于指定与事务相关的注释信息。
8)、commit_force
说明:用于强制提交分布式事务,其作用与sql语句commit force text,number完全相同
语法:dbms_transaction.commit_force(xid varchar2,scn carchar2 default null);
9)、commit
说明:用于提交当前事务,其作用与sql语句commit完全相同。
语法:dbms_transaction.commit;
10)、savepoint
说明:用于设置保存点,其作用与sql语句savepoint 完全相同。
语法:dbms_transaction.sevepoint(savept varchar2);
其中,savept指定保存点名称。
11)、rollback
说明:用于回退当前事务,其作用与sql语句rollback完全相同。
语法:dbms_transaction.rollback;
12)、rollback_savepoint
说明:用于回退到保存点,并取消部分事务,其作用与sql语句rollback to savepoint<savepoint_name>完全相同。
语法:dbms_transaction.rollback_savepoint(savept varchar2);
13)、rollback_force
说明:用于强制回退分布式事务,其作用与sql语句rollback force<text>完全相同。
语法:dbms_transaction.rollback_force(xid varchar2);
14)、begin_discrete_transaction
说明:用于开始独立事务模式
语法:dbms_transaction.begin_discreate_transaction;
15)、purge_mixed
说明:用于清除分布式事务的混合事务结果
语法:dbms_transaction.purge_mixed(xid varchar2);
其中xid指定事务id号。
16)、purge_lost_db_entry
说明:用于清除本地数据库所记载的远程事务入口,该事务入口操作因为远程数据库问题未能在远程数据库完成.
语法:dbms_transaction.purge_lost_db_entry(xid varchar2);
其中xid指定事务id号。
17)、local_transaction_id
说明:用于返回当前事务的事务标识号
语法:dbms_transaction.local_transaction_id(create_transaction boolean:=false) return varchar2;
其中create_transaction指定是否要启动新事务,true为启动。
(18)、step_id
说明:用于返回排序dml事务的惟一正整数
语法:dbms_transaction.step_id return number;
六.dbms_session
1、概述
作用:提供了使用pl/sql实现alter session命令,set role命令和其他会话信息的方法.
2、包的组成
1)、set_identifier
说明:用于设置会话的客户id号。
语法:dbms_session.set_identifier(client_id varchar2);
其中client_id指定当前会话的应用标识符。
2)、set_context
说明:用于设置应用上下文属性
语法:
dbms_session.set_context(namespace varchar2,attribute varchar2,value varchar2);
dbms_session.set_context(namespace varchar2,attribute varchar2,value varchar2,username varchar2,client_id varchar2);
其中namespace指定应用上下文的命名空间,attribute指定应用上下文的属性,value指定属性值,username指定应用上下文的用户名属性。
3)、clear_context
说明:用于清除应用上下文的属性设置
语法:dbms_session.clear_context(namespace varchar2,client_identifier varchar2,attribute varchar2);
其中client_identifier只适用于全局上下文。
4)、clear_identifier
说明:用于删除会话的set_client_id.
语法:dbms_session.clear_identifier();
5)、set_role
说明:用于激活或禁止会话角色,与sql语句set role作用完全相同。
语法:dbms_seesion.set_role(role_cmd varchar2);
例子:在sql*plus使用该过程激活或禁止角色如下
dbms_session.set_role('dba')
dbms_session.set_role('none')
6)、set_sql_trace
说明:用于激活或禁止当前会话的sql跟踪,其作用与sql语句alter session set sql_trace= 完全相同。
语法如下:dbms_session.set_sql_trace(sql_strace boolean);
其中sql_strace用于指定布尔值,true表示激活sql跟踪,false表示禁止。
例子:在sql*plus使用该过程
exec dbms_session.set_sql_trace(true);
exec dbms_session.set_sql_trace(false);
7)、set_nls
说明:用于设置nls特征,其作用与sql语句alter session set <nls_param>=<value>完全相同。
语法:dbms_session.set_nls(param varchar2,value varchar2);
其中param指定nls参数,value指定nls参数
例子:在sql*plus使用该过程
exec dbms_seesion.set_nls('nls_date_format','''yyyy-mm-dd''');
select sysdate from dual;
8)、close_database_link
说明:用于关闭已经打开的数据库链,其作用与sql语句alter session close datebase link<name>完全相同。
语法:dbms_session.close_database_link(dbline varchar2);
其中用于指定要关闭的数据库连接名。
9)、reset_package
说明:用于复位当前会话的所有包,并且会释放包状态。
语法:dbms_session.reset_package;
10)、modify_package_state
说明:用于修改当前会话的pl/sql程序单元的状态
语法:dbms_session.modify_package_state(action_flags in pls_integer);
其中,action_flags指定pl/sql程序单元标记,当设置为1是,会释放plsql程序单元所占用的内存;2则会重新初始化pl/sql包。
11)、unique_session_id
说明:用于返回当前会话的惟一id标识符
例子:select dbms_session.unique_session_id from dual;
12)、is_role_enabled
说明:用于确定当前会话是否激活了特定角色.
语法:dbms_session.is_role_enabled(rolename varchar2) return boolean;
其中rolename指定角色名。返回true表示已激活,false表示未激活。
例子:set serveroutput on
begin
if dbms_session.is_role_enabled('dba') then
dbms_output.put_line('激活了');
else dbms_output.put_line('没激活');
end if;
end;
13)、is_session_alive
说明:用于确定特定会话是否处于活动状态.
语法:dbms_session.is_session_alive(uniqueid varchar2) return boolean;
其中uniqueid指定会话id号,处于活动返回true,否则false。
14)、set_close_cached_open_cursors
说明:用于打开或关闭close_cached_open_cursors,其作用与alter session set close_cached_open_cursors完全相同。
语法:dbms_session.set_close_cached_open_cursors(close_cursors boolean);
其中close_cursors指定布尔值,设置为true打开,false关闭。
15)、free_unused_user_meory
说明:用于在执行了大内存操作(超过100k)之后回收未用内存
语法:dbms_session.pree_unused_user_memory;
16)、set_context
说明:设置应用上下文属性的值.
语法:dbms_session.set_context(namespare varchar2,attribute varchar2,value varchar2,username varchar2,client_id varchar2);
17)、list_context
说明:用于返回当前会话原命名空间和上下文列表
语法:
type appctxrectyp is record(namespace varchar2(30),attribute varchar2(30),value varchar2(256));
type appctxtabtyp is table of appctxrectyp index by binary_integer;
dbms_session.list_context(list out appctxtabtyp,size out number);
其中list用于取得当前会话的列表集,size用于返回列表个数。
18)、swith_current_consumer_group
说明:用于改变当前会话的资源使用组
语法:dbms_session.switch_current_consumer_group(
new_group in varchar2,old_group out varchar2,initial_group in boolean);
其中new_group指定新资源使用组;old_group指定原有资源实用组;initial_group指定布尔值,true表示出错后使用原有资源使用组。
七、dbms_rowid
1、概述
作用:用于在pl/sql程序和sql语句中取得行标识符(rowid)的信息并建立rowid,通过该包可以取得行所在的文件号,行所在文件的数据块号,行所在数据块的行号,以及数据库对象号等消息.
2、包的组成
1)、rowid_create
说明:建立rowid
语法:dbms_rowid.rowid_create (
rowid_type in number,object_number in number,
relative_fno in n umber,block_number in number,
row_number in number) return rowid;
其中,rowid_type用于指定rowid类型(0:受限rowid,1:扩展rowid);object_number用于指定数据对象号;relative_fno用于指定相对文件号;block_number用于指定在文件中的数据块号;row_number用于指定在数据块中的行号.
2)、rowid_info
说明:用于取得特定rowid的详细信息.
语法:dbms_rowid_info(
rowid_in in rowid,rowid_type out number,
object_number out number,relative_fno out number,
block_number out number,row_number out number);
其中rowid_in指定rowid。
3)、rowid_type
说明:用于返回特定rowid的类型
语法:dbms_rowid.rowid_type(row_id in rowid) return number;
其中返回0表示受限rowid,返回1表示扩展rowid。
例子:select dbms_rowid.rowid_type(aaac90aafaaaaacaak) from dual;
4)、rowid_object
说明:用于取得特定rowid所对应的数据对象号
语法:dbms_rowid.rowid_object(row_id in rowid) return number;
例子:select dbms_rowid.rowid_object(row_id) from dept;
5)、rowid_relative_fno
说明:用于取得特定rowid所对应的相对文件号
语法:dbms_rowid.rowid_relative_fno(row_id in rowid) return numer;
例子:select dbms_rowid.rowid_relative_fno(rowid) from dept;
6)、rowid_block_number
说明:用于返回特定rowid在数据文件中所对应的数据块号.
语法:dbms_rowid.rowid_block_number(row_id in rowid) return number;
例子:select dbms_rowid.rowid_block_number(rowid) from dept;
7)、rowid_row_number
说明:用于返回特定rowid在数据块中所对应的行号.
语法:dbms_rowid.rowid_row_number(row_id in rowid) return number;
例子:select dbms_rowid.rowid_row_number(rowid) from dept;
8)、rowid_to_obsolute_fno
说明:用于返回特定rowid所对应的绝对文件号
语法:dbms_rowid.rowid_to_obsolute_fno(row_id in rowid,schema_name in varchar2,object_name in varchar2) return number;
declare
my_rowid rowid;
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
abs_fno int;
rowid_val char(18);
begin
--rowid_create
my_rowid:=dbms_rowid.rowid_create(1,12197,3,100,1);
dbms_output.put_line(my_rowid);
--rowid_info
dbms_rowid.rowid_info('aaac90aafaaaaacaak',rowid_type,object_number,relative_fno,block_number,row_number);
dbms_output.put_line('数据对象号'||object_number);
--rowid_to_obsolute_fno
select rowid into rowid_val from emp where empno=7788;
abs_fno:=dbms_rowid.rowid_to_obsolute_fno(rowid_val,'scott','emp');
dbms_output.put_line('7788对应的绝对文件号'||abs_fno);
end;
9)、rowid_to_extended
说明:用于将受限rowid转变为扩展rowid
语法:dbms_rowid.rowid_to_extended(old_rowid in rowid,schema_name in varchar2,object_name in varchar2,conversion_type in integer) return rowid;
其中,conversion_type指定转换类型(rowid_convert_internal/external_convert_external)
例子;select empno,ename from emp where rowid=dbms_rowid.rowid_to_extended('0000001c.0007.0005','scott','emp',0);
10)、rowid_to_restricted
说明:用于将扩展rowid转换为受限rowid
语法:dbms_rowid.rowid_to_restricted(old_rowid in rowid,conversion_type in integer) return rowid;
例子:select dbms_rowid.rowid_to_restricted(rowid,0) from emp;
11)、rowid_verify
说明:检查是否可以将受限rowid转变为扩展rowid
语法:dbms_rowid.rowid_verify(rowid_in in rowid,schema_name in varchar2,object_name in varchar2,vonversion_type in integer) return number;
其中返回0表示可以,1表示不能。
例子:select dbms_rowid.rowid_verify('0000001c.0007.0005','scott','emp',0) from dual;
八、dbms_rls
1、概述
本报只适用于oracle enterprise edition,它用于实现精细访问控制,并且精细访问控制是通过在sql语句中动态增加谓词(where子句)来实现的.
通过使用oracle的精细访问控制特征,可以使不同数据库用户在执行相同sql语句时操作同一张表上的不同数据.
例如多个用户执行select * from emp时,各自看到的行数不同。a只能看到财务部的记录,b只能看到市场部的数据。
2、包的组成
1)、add_policy
作用:用于为表、视图或同义词增加一个安全策略,当执行该操作结束是会自动提交事务。
语法dbms_rls.add_policy(
object_aschema in varchar2 null,
object_name in varchar2,
policy_name in varchr2,
function_schema in varchar2 null,
policy_function in varchar2,
statement_type in varchar2 null,
update_check in boolean false,
enable in boolean true,
static_policy in boolean false);
其中object_aschema指定包含表、视图或同义词的方案(默认null表示当前方案),
object_name指定要增加安全策略的表、视图或同义词,
policy_name指定要增加的安全策略名称,
function_schema指定策略函数的所在方案(默认null表示当前方案),
policy_function指定生成安全策略谓词的函数名,
statement_type指定使用安全策略的sql语句(默认null表示适用于select、insert、update、delete),
update_check指定执行insert、update时是否检查安全策略,
enable指定是否要激活安全策略,
static_policy指定是否要生成静态的安全策略。
2)、drop_policy
作用:用于删除定义在特定表、视图或同义词的安全策略,当试行该操作结束时会自动提交事务。
语法:dbms_rls.drop_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2);
3)、refresh_policy
作用:用于刷新与安全策略修改相关的所有sql语句,并使得oracle重新解析相关sql语句,自动提交。
语法:dbms_rls.refresh_policy(
object_achema in varchr2 null,
object_name in varchar2 null,
policy_name in varchar2 null);
4)、enable_policy
说明:用于激活或禁止特定的安全策略,默认情况下当增加安全策略时会自动激活,自动提交。
语法:dbms_rls.enable_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2,
enable in boolean);
5)、create_policy_group
作用:用于建立安全策略组
语法:dbms_rls.create_policy_group(object_schema varchar2, object_name varchar2,policy_group varchar2);
其中policy_group指定策略组的名称。
6)、add_grouped_policy
作用:用于增加与特定策略组相关的安全策略。
语法:dbms_rls.add_grouped_policy(object_schema varchar2, object_name varchar2,policy_group varchar2,policy_name varchar2,
function_schema varchar2,policy_function varchar2,statement_types varchar2,update_check boolean,enabled boolean,static_policy boolean false);
7)、add_policy_context
作用:用于为应用增加上下文
语法:dbms_rls.add_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
其中namespace指定命名空间,attribute指定上下文属性。
8)、delete_policy_group
作用:用于删除安全策略组
语法:dbms_rls.delete_policy_group(object_schema varchar2,object_name varchar2,policy_group varchar2);
9)、drop_grouped_policy
作用:用于删除特定策略组的安全策略。
语法:dbms_rls.drop_grouped_policy(object_schema varchar2,object_name varchar2,policy_group varchar2,policy_name varchar2);
10)、drop_policy_context
作用:用于删除对象的上下文。
语法:dbms_rls.drop_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
11)、enable_grouped_policy
作用:用于激活或禁止特定策略组的安全策略
语法:dbms_rls.enable_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2,enable boolean);
12)、refresh_grouped_policy
作用:用于刷新与特定安全策略组的安全策略相关的sql语句(重新解析sql语句)
语法:dbms_rls.refresh_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2);
3、使用dbms_rls实现精细访问控制
假设希望sys、system、scott用户可以访问emp表的所有员工,blake用于智能访问部门30的员工,jones用户只能访问部门20的员工,其他用户只能访问部门10的员工。
步骤如下
1)、建立应用上下文
说明:要求用户必须具有create any context系统权限。
create or replace context empenv using scott.ctx;--建立名称为empenv的应用上下文,其属性有scott方案的包ctx包设置。
2)、建立包过程设置应用上下文属性
create or replace package scott.ctx as
procedure set_deptno;
end;
create or replace package body scott.ctx as
procedure set_deptno is
id number;
begin
if sys_context('userenv','session_user')='jones' then
dbms_session.set_context('empenv','deptno',20);
elsif sys_context('userenv','session_user')='blake' then
dbms_session.set_context('empenv','deptno',30);
else
dbms_session.set_context('empenv','deptno',10);
end if;
end;
end;
3)、建立登录触发器
说明:用户登录数据库之后会自动触发登陆触发器,建立登录触发器的目的是要隐含调用过程ctx.set_deptno,从而设置上下文属性。必须要以sys用户身份建立登陆触发器。
conn sys/oracle as sysdba
create or replace trigger login_trig
after logon on database call scott.ctx.set_deptno
4)、建立策略函数
策略函数必须带有2个参数,第一个参数对应于方案名,第二个参数对应于表名、视图名、同义词名。
create or replace package scott.emp_security as
function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
end;
create or replace package body scott.emp_security ad
function emp_sec(p1 varchar2,p2 varchar2) return varchar2
is
d_predicate varchar2(2000);
begin
if user not in ('sys','system','scott') then
d_predicate:='deptno=sys_context(''empenv'',''deptno'')'
return d_predicate;
end if;
return '1=1';
end;
end;
5)、增加策略
说明:增加策略,并定义对象、策略、策略函数以及sql语句之间的对应关系。
execute dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
执行add_policy后会在系统默认策略组sys_default中增加策略emp_policy,并在scott.emp上的select语句使用该策略。
其中第一个参数是对象所在方案名,第二个参数是对象名,第三个参数是策略名,第四个参数策略函数所在的方案名,
第五个参数时策略函数,第六个参数是使用该策略的sql语句(如果不指定则select,insert,ypdate,delete都会使用该策略)
当sys,system,scott登录查询,谓词为1=1,当jones登陆谓词为deptno=20,当blake登陆谓词为deptno=30。
九、dbms_ddl
1、概述
作用:提供了在pl/sql块中执行ddl语句的方法,并且也提供了一些ddl的特殊管理方法.
2、包的组成
1)、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)、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');
3)、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表示只被触发一次。
4)、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时总是被触发。
十、dbms_shared_pool
1、概述
作用:提供了对共享池的一些过程和函数访问,它使用户可以显示共享池中的对象尺寸,绑定对象到共享池,清除绑定到共享池的对象.为了使用该包,必须运行dbmspool.sql脚本来建立该包.
2、包的组成
1)、sizes
作用:用于显示在共享池中大于指定尺寸的对象
语法:dbms_shared_pool.sizes(minsize number);
其中minsize用于指定要显示对象的最小尺寸(单位kb)
例子:exec dbms_shared_pool.sizes(100);
2)、keep
作用:用于将特定对象绑定到共享池中
语法:dbms_shared_pool.keep(name varchar2,flag char default 'p');
其中name指定要绑定的对象名,flag指定对象类型(p是过程、函数和包;t是对象类型;r是触发器;q是序列)。
例子:exec dbms_shared_pool.keep('standard');
3)、unkeep
作用:用于清除被绑定到共享池中的对象
语法:dbms_shared_pool.unkeep(name varchar2,flag char default 'p');
例子:exec dbms_shared_pool.unkeep('standard');
4)、aborted_request_threshold
作用:用于设置共享池终止请求的阈值。
语法:dbms_shared_pool.aborted_request_threshold(threshold_size number);
例子:threshold_size用于指定共享池阈值尺寸
例子:exec dbms_shared_pool.aborted_request_threshold(100000);
十一、dbms_random
1、概述
提供了内置的随机数生成器,可以用于快速生成随机数.
2、包的组成
1)、initialize
作用:用于初始化dbms_random包,必须提供随机数种子。
语法:dbms_random.initialize(seed in binary_integer);
其中seed指定随机数种子。
2)、seed
作用:用于复位随机数种子
语法:dbms_random.seed(seed in binary_integer);
3)、random
作用:用于生产随机数
语法:dbms_random.randon return binary_integer;
4)、terminate
作用:关闭dbms_random包
语法:dbms_random。terminate;
3、综合例子
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;
十二、dbms_logmnr
1、概述
作用:通过使用包dbms_logmnr和dbms_logmnr_d,可以分析重做日志和归档日志所记载的事务变化,最终确定误操作(例如drop table)的时间,跟踪用户事务操作,跟踪并还原表的dml操作.
2、包的组成
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删除文件)
2)、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分析选项。
3)、dbms_logmnr.end_logmnr
作用:结束logminer会话
语法:dbms_logmnr.end_logmnr
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);
5)、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)、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)、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指定溢出表所在表空间。
3、综合例子
首先建表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 v$logmnr_contents where seg_name='temp';
(2)、显示ddl分析结果
select to_cahr(timestamp,'yyyy-mm-dd hh23:mi:ss') time,sql_redo from v$logmnr_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;
十三、dbms_flashback
1、概述
作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户,grant execute on dbms_flashback to scott;
2、包的组成
1)、enable_at_time
作用:用于以时间方式激活会话的flashback
语法:dbms_flashback.enable_at_time(query_time in timestamp);
其中query_time指定flashback对应的时间点;
2)、enable_at_system_change_number
作用:用于以系统改变号(scn)方式激活会话的flashback
语法:dbms_flashback.enable_at_system_change_number(query_scn in number);
其中query_scn指定flashback对应的scn值。
3)、get_system_change_number
作用:用于取得系统的当前scn值
语法:dbms_flashback.get_system_change_number return number;
4)、disable
作用:用于禁止会话的flashback模式
语法:dbms_flashback.disable;
3、综合例子
1)、取得scott雇员工资及系统scn值
select sal from emp where ename='scott';--3600
seelct dbms_flashback.get_system_change_number from dual;--717402
2)、更新scott工资,并休眠5分钟
update emp set sal=3000 where ename='scott';
commit;
exec dbms_lock.sleep(300);
3)、使用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
十四、dbms_obfuscation_toolkit
1、概述
作用:用于和解密应用数据,另外还可以生成密码检验和.通过加密输入数据,可以防止或其他用户窃取私有数据;而通过结合使用加密和密码检验和,可以防止黑客破坏初加密的数据.
当使用该包加密数据时,要求被加密数据的长度必须为8字节的整数倍.当使用des算法加密数据时,密钥长度不能低于8字节;当使用des3算法加密数据时,密钥长度不能低于16字节.
2、包的组成
1)、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指定存放加密结果的字符串。
2)、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指定存放解密结果的字符串。
3)、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);
4)、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);
5)、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)指定存放密码校验码的字符串。
3、综合例子
1)、简单例子
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;
2)、例子2
说明:为了防止黑客窃取数据,应该对数据进行加密,为防止黑客窜改数据,应该使用密码校验来确保数据的正确性。
下面使用管道发送加密信息并确保消息正确性
(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;
十五、dbms_space
1、概述
作用:用于分析段增长和空间的需求。
2、包的组成
1)、unused_space
作用:用于返回对象(表、索引、簇)的未用空间
语法:dbms_space.unused_space(segment_owner in varchar2,
segment_name in varchar2,segment_type in varchar2,
total_blocks out number,total_bytes out number,
unused_blocks out number,unused_bytes out number,
last_used_extent_file_id out number,
last_used_extent_block_id out number,
last_used_block out number,
partition_name in varchar2 default null);
其中segment_owner指定段所有者,segment_name指定段名,segment_type指定段类型,
tatal_blocks返回段的总计块个数,total_bytes返回段的总计字节数,
unused_blocks返回段的末用块个数,unused_byte返回段未用字节,
last_used_extent_file_id返回包含数据的最后一个区所在文件的编号,
last_used_extent_block_id返回包含数据的最有一个区的块编号,
last_used_block返回包含数据的最有一个区的最后一个块,
partition_name指定要分析的段分区号。
2)、free_blocks
作用:用于返回对象(表、索引、簇)的空闲块信息。
语法:dbms_space.free_blocks(segment_owner in varchar2,segment_name in varchar2,segment_type in varchar2,freelist_group_id in number,
free_blks out number,scan_limit in number default null,partition_name in varchar2 default null);
其中freelist_group_id指定返回空闲列表组所对应的空闲列表个数,scan_limit指定要读取的空闲列表块的最大个数。
3)、space_usage
作用:显示段hwm(high water mark)以下数据块的空闲使用情况,并且该过程只适用于自动段空间管理的表空间。
语法:dbms_space.space_usage(segment_owner in varchar2,segment_name in varchar2,segment_type in varchar2,unformatted_blocks out number,unformatted_bytes out number,
fs1_blocks out number,fs1_bytes out number,
fs2_blocks out number,fs2_bytes out number,
fs3_blocks out number,fs3_bytes out number,
fs4_blocks out number,fs4_bytes out number,
full_blocks out number,full_bytes out number,
partition_name in varchr2 default null);
其中unformatted_blocks用于返回未格式化块的个数,unformatted_bytes用于返回未格式化的字节数,
fs1_blocks用于返回空闲空间在0~25%之间的块个数,fs1_bytes返回空闲空间在0~25%之间的字节数,2范围为25%~50%之间,3范围为50%~75%之间,4范围为75%~100%之间。
full_blocks返回段的总计块个数,full_bytes返回段的总计字节数。
3、综合例子
1)、简单例子
例子:
declare
total_blocks number;
total_bytes number;
unused_blocks number;
unused_bytes number;
last_used_extent_file_id number;
last_used_extent_block_id number;
last_used_block number;
free_blocks number;
variable unf number,
variable unfb number,
variable fs1 number,
variable fs1b number,
variable fs2 number,
variable fs2b number,
variable fs3 number,
variable fs3b number,
variable fs4 number,
variable fs4b number,
variable full number,
variable fullb number,
begin
--unused_space
dbms_space.unused_space('system','t1','table',total_blocks,total_bytes,unused_blocks,unused_bytes,last_used_extent_file_id,last_used_extent_block_id,last_used_block);
dnms_output.put_line(to_char('hwm='||total_blocks-unused_blocks-1));
--free_blocks
dbms_space.free_blocks('system','t1','table',0,free_blocks);
dbms_output.put_line('组0的空闲列表个数'||free_blocks);
--space_usage
dbms_space.space_usage('u1','t','table',:nuf,:unfb,:fs1,:fs1b,:fs2,:fs2b,:fs3,:fs3b,:fs4,:fs4b,:fnull,:fnullb);
end;
十六、dbms_space_admin
1、概述
作用:提供了局部管理表空间的功能
2、包的组成
1)、segment_verify
作用:用于检查段的区映像是否与位图一致
语法:dbms_space_admin.segment_verify(tablespace_name in varchar2,header_relative_file in positive,heaeder_block in positive,verify_option in positive default segment_verify_extents);
其中tablespace_name指定段所在的表空间,header_relative_file指定段头所在的相对文件好,heaeder_block指定段头所在的块号,verify_option指定检查方式。
例子:exec dbms_space_admin.segment_verify('',9,68);
2)、segment_corrupt
作用:用于将段标记为损坏或有效。
语法:dbms_space_admin.segment_corrupt(tablespace_name in varchar2,header_relative_file in positive,header_block in positive,corrupt_option in positive default segment_mark_corrupt);
其中corrupt_option指定损坏(segment_mark_corrupt)或有效(segment_mark_valid)选项。
例子:dbms_space_admin.segment_corrupt('user3',9,68);
3)、segment_drop_corrupt
作用:用于删除被标记为损坏的段。
语法:dbms_space_admin.segment_drop_corrupt(tablespace_name in varchar2,header_relative_file in positive,header_block in positive);
例子:exec dbms_space_admin.segment_drop_corrupt('user3',9,68);
4)、segment_dump
作用:用于转储特定段的头块和区映像块
语法:dbms_space_admin.segment_dump(tablespace_name in varchar2,header_relative_file in positive,header_block in positive,dump_option in positive default defult segment_dump_extent_map);
其中dump_option指定转储特项。
5)、tablespace_verify
作用:检查表空间所有段的位图和区映像。
语法:dbms_space_admin.tablespace_verify(tablespace_name in varchar2,verify_option in positive default tablespace_verify_bitmap);
例子:exec dbms_space_admin.tablespace_verify('users3');
6)、tablespace_fix_bitmaps
作用:用于将特定范围的空间标记为空闲或已用。
语法:dbms_space_admin.tablespace_fix_bitmaps(tablespace_name in varchar2,dbarange_relative_file in positive,dbarange_begin_block in positive,
dbarange_end_block in positive,fix_option in positive);
其中dbarange_relative_file指定dba范围内的相对文件号,dbarange_begin_block指定数据文件区的起始块编号,dbarange_end_block指定数据文件区的结束块编号,
fix_option指定选项(tablespace_extent_make_free或tablespace_extent_make_used)
例子:exec dbms_space_admin.tablespace_fix_bitmaps('uses',4,33,83,7);
7)、tablespace_rebuild_bitm