九、系统包一览
Oracle和各种Oracle工具都提供了系统包来帮助我们建立基于PL/SQL的应用程序。例如,Oracle提供了许多工具包,下面介绍一下其中比较典型的包。
1、关于DBMS_ALERT包
DBMS_ALERT能让数据库触发器在特定的数据库值发生变化时向应用程序发送报警。报警是基于事务的并且是异步的(也就是它们的操作与定时机制无关)。例如,当新的股票和债券上市时公司就可以通过这个包更新来他的投资总额。
2、关于DBMS_OUTPUT包
包DBMS_OUTPUT能让我们显示来自PL/SQL块和子程序中的输出内容,这样就会很容易地进行测试和调试。过程put_line能把信息输出到SGA的一个缓存中。我们可以通过调用过程get_line或在SQL*Plus中设置SERVEROUTPUT ON就能显示这些信息。假设我们创建了下面的存储过程:
CREATE?PROCEDURE?calc_payroll(payroll?OUT?NUMBER)?AS
??CURSOR?c1?IS
????SELECT?sal,?comm
??????FROM?emp;
BEGIN
??payroll????:=?0;
??FOR?c1rec?IN?c1?LOOP
????c1rec.comm????:=?NVL(c1rec.comm,?0);
????payroll???????:=?payroll?+?c1rec.sal?+?c1rec.comm;
??END?LOOP;
??/*?Display?debug?info.?*/
??DBMS_OUTPUT.put_line('Value?of?payroll:?'?||?TO_CHAR(payroll));
END;
使用下面的命令时,SQL*Plus就能显示出payroll的值:
SQL>?SET?SERVEROUTPUT?ON
SQL>?VARIABLE?num?NUMBER
SQL>?CALL?calc_payroll(:num);
Value?of?payroll:?31225
3、关于DBMS_PIPE包
包DBMS_PIPE允许不同的会话通过命名管道来进行通信(管道就是一块内存区域,进程使用这个区域把消息传递给另外一个进程)。我们可以使用过程pack_message和send_message把消息封装到一个管道,然后把消息发送到同一个实例中的另一个会话中。
管道的另一个终端,我们可以使用过程recieve_message和unpack_message来接受并打开要读取的消息。命名管道在很多地方都很有用。例如,我们可以用C语言编写一个收集信息的程序,然后把信息通过管道传递给存储过程。
4、关于UTL_FILE包
包UTL_FILE能让我们的PL/SQL程序读写操作系统(OS)文本文件。它提供了标准的OS流文件I/O,包括open、put、get和close操作。
当我们想要读写文件的时候,我们可以调用函数fopen,它能返回一个在后续过程调用中使用到的文件句柄。例如,过程put_line能往打开的文件中写入文本字符串,并在后边添加一个换行符,过程get_line能从打开的文件读取一行内容到放到一个输出缓存中。
5、关于UTL_HTTP包
包UTL_HTTP可以让我们PL/SQL程序使用超文本传输协议(HTTP)进行通信。它可以从互联网接收数据或调用Oracle Web服务器的cartridge。这个包有两个入口点,每一个都接受一个URL(统一资源定位器)字符串,然后连接到一个指定的网站并返回所请求的数据,这些数据通常是超文本标记语言HTML格式。
十、包编写准则
在编写包时,尽量让它们保持通用性,这样就能在以后的程序中多次使用。避免编写那些与Oracle已经提供的特性相同的包。
包说明反映了我们的应用程序设计。所以,一定在包体之前定义它们。只有那些对包用户必须可见的内容才可以放在说明部分。这样,其他的开发人员就不会滥用包中的内容了。
为了减少因代码改变而引起的重编译,尽量不要在包说明部分放置过多的内容。对包体内容的改变不需要编译其他独立的过程,但是,如果包说明发生改变,Oracle就得重新编译每一个引用到那个包的存储子程序了。
代码迷推荐解决方案:oracle存储过程,http://www.daimami.com/oracle-develop/177537.html