UTL_TCP 包

许多的应用程序都是基于TCP/IP协议的,UTL_TCP包的功能是提供一个可以与外部的TCP/IP服务器通讯,并能够进行基本的收发数据的功能。

31.1 相关方法

  1. AVAILABLE

当前能够读取的连接字符数(最大不超过96字节)。

语法如下:

function available(

	c in out connection,

	timeout in int default 0

)return int;

参数详解

  • c 一个open_connection打开的、有效的connection。
  • timeout 如果没有数据,则在制定的timeout时间返回。

返回值

当前获取的一个TCP/iP连接字节数。

  1. CLOSE_ALL_CONNECTIONS

关闭所有的连接。

语法如下:

UTL_TCP.CLOSE_ALL_CONNECTIONS;
  1. CLOSE_CONNECTION

关闭指定的连接。

语法如下:

UTL_TCP.CLOSE_CONNECTION (

	C IN OUT connection

);
  1. 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。

返回值

读取到的二进制数据。

  1. 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尝试链接到远程主库的等待时间。

返回值

一个连接到指定外部服务器的链接。

  1. 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。

返回值

收到的数据的字节长度。

  1. 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
微信扫码
分享文档
扫一扫
联系客服