create or replace function func_socket(IV_SENDBUF in varchar,
OV_RECVBUF out varchar)
return integer is
Result integer;
/*与服务器通讯
参数从表读取*/
sServIp varchar2(15);
iServPort number(6);
iTimeout number(3);
sStartFlg varchar2(2); --开始标志
sHead varchar2(9); --报文头
SBuf varchar2(2048); --数据区
socket utl_tcp.connection;
iLength number(4);
sqlerr number(6);
iCnt number(2);
iRecvLen number(6);
begin
OV_RECVBUF := '';
Result := 0;
iCnt := 0;
/*读取参数*/
select SERV_IP, SERV_PORT, TIMEOUT
into sServIp, iServPort, iTimeout
from intf_bank_cfg
where cfg_id = 1
and rownum = 1;
/*连接服务器*/
socket := utl_tcp.open_connection(sServIp,
iServPort,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
iTimeout);
/*发送数据*/
if utl_tcp.write_text(socket, IV_SENDBUF) <> length(IV_SENDBUF) then
return - 1;
end if;
utl_tcp.flush(socket);
/*接收数据*/
<<nextrecv>>
if iCnt > 3 then
return - 1;
end if;
IF (utl_tcp.available(socket, iTimeout) > 0) THEN
/*处理报文头,如果不是S开头继续接收2次*/
if utl_tcp.read_text(socket, sStartFlg, 1) <> 1 or
substr(sStartFlg, 0, 1) <> 'S' then
--'S开头判断'
iCnt := iCnt + 1;
goto nextrecv;
end if;
/*长度判断*/
if utl_tcp.read_text(socket, sHead, 8) <> 8 then
return - 1;
end if;
iLength := to_number(substr(sHead, 5, 4));
/*接收报文体*/
iRecvLen :=utl_tcp.read_text(socket, SBuf, iLength);
if lengthb(sBuf)<> iLength then
return - 1;
end if;
OV_RECVBUF := sStartFlg || sHead || SBuf;
else
Result := -1;
end if;
/*关闭连接*/
utl_tcp.close_connection(socket);
/*记录交易日志*/
return(Result);
exception
when others then
sqlerr := sqlcode;
utl_tcp.close_connection(socket);
return - 1;
end func_bank_commwithserv;
/
|