许多的应用程序都是基于TCP/IP协议的,UTL_TCP包的功能是提供一个可以与外部的TCP/IP服务器通讯,并能够进行基本的收发数据的功能。
31.1 相关方法
- AVAILABLE
当前能够读取的连接字符数(最大不超过96字节)。
语法如下:
function available(
c in out connection,
timeout in int default 0
)return int;
参数详解
- c 一个open_connection打开的、有效的connection。
- timeout 如果没有数据,则在制定的timeout时间返回。
返回值
当前获取的一个TCP/iP连接字节数。
- CLOSE_ALL_CONNECTIONS
关闭所有的连接。
语法如下:
UTL_TCP.CLOSE_ALL_CONNECTIONS;
- CLOSE_CONNECTION
关闭指定的连接。
语法如下:
UTL_TCP.CLOSE_CONNECTION (
C IN OUT connection
);
- GET_RAW
读取指定长度(二进制的数据)的数据。
语法如下:
function get_raw (
c in out connection,
len in int default 1,
peek in boolean default false
)return varbinary;
参数详解
- c一个open_connection打开的、有效的connection。
- LEN要收到的数据的长度,默认值1。
- PEEK
该选项为true,则指只是查看队列的数据,不会从队列中删除,下次还能够读到;为false,则会删除队列中的数据。默认参数,false。
返回值
读取到的二进制数据。
- OPEN_CONNECTION
打开一个连接到外部服务器的连接。
语法如下:
function open_connection(
remote_host in varchar2,
remote_port in int,
local_host in varchar2 default null,
local_port in int default null,
tx_timeout in int default null
) return connection;
参数详解
- remote_host远程主库的名字,或者ip地址。
- remote_port远程主库的端口。
- local_host本地主库的名字(一般不用设置)。
- local_port本地主库的端口(一般不用设置)。
- tx_timeout尝试链接到远程主库的等待时间。
返回值
一个连接到指定外部服务器的链接。
- READ_RAW
以二进制形式读取一行数据。
语法如下:
function read_raw (
c in out connection,
data out varbinary,
len in int default 1,
peek in boolean default false
) return int;
参数详解
- c一个open_connection打开的、有效的connection。
- data用于存放读到的数据。
- len要收到的数据的长度,默认值1。
- peek该选项为true,则指只是查看队列的数据,不会从队列中删除,下次还能够读到;为false,则会删除队列中的数据。默认参数,false。
返回值
收到的数据的字节长度。
- WRITE_RAW
发送一行二进制数据。
语法如下:
function write_raw(
c in out connection,
data in varbinary,
len in int default null
) return int;
参数详解
- c一个open_connection打开的、有效的connection。
- data存放要发送的数据。
- len要发送数据的长度。
返回值
发送的二进制数据的字节长度。只有成功发送才会有返回值。
31.2 举例说明
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。
SP_CREATE_SYSTEM_PACKAGES (1,'UTL_TCP');
例 UTL_TCP包示例。
declare
host varchar(128);
port int;
ret int;
len int;
data varbinary(512);
show varbinary(128);
c utl_tcp.connection;
begin
host := '192.168.0.212';
port := 25;
c := utl_tcp.open_connection(host,port);
ret := utl_tcp.write_raw(c,rawtohex('wxh\@dameng.shanghai'),50);
print ret;
len := 48;
ret := utl_tcp.available(c,0);
print ret;
show := utl_tcp.get_raw(c,len);
print show; -- ' 220 192.168.0.212 ESMTP '的二进制流
ret := utl_tcp.read_raw(c,data,len);
utl_tcp.close_connection(c);
end;
/
结果如下:
24
25
323230203139322E3136382E302E3231322045534D54500D0A