`
收藏列表
标题 标签 来源
socket socket ORACLE做socket编程
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;
/
Global site tag (gtag.js) - Google Analytics