network package url_tcp

本文介绍了一种使用PL/SQL处理CLOB类型数据的方法,并通过一个具体的例子展示了如何发送TCP请求及接收响应。文章还提供了一个测试脚本,用于验证过程的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE PROCEDURE PrintXML (i_respxml IN CLOB) is
      line   VARCHAR2 (32767);  
      v_clob     CLOB;
      v_length   NUMBER;
      v_amount   NUMBER;
      v_newline  NUMBER;
      v_offset   NUMBER           := 1;
   BEGIN
      IF i_respXML IS NULL
      THEN
         RETURN;
      ELSE
         v_clob := i_respxml;
         v_length := DBMS_LOB.getlength (v_clob);
         WHILE v_offset <= v_length
         LOOP
            v_newline := INSTR(v_clob, chr(10), v_offset);
            if v_newline = 0 then
               v_amount := v_length - v_offset + 1;
            else
               v_amount := v_newline - v_offset;
            end if;
        if v_amount > 32767 then 
         v_amount := 32766; 
            end if;
        if v_amount = 0 then
          v_amount := 1;
        end if;
            DBMS_LOB.READ (v_clob, v_amount, v_offset, line);
            dbms_output.put_line('| '|| line);
            v_offset := v_offset + v_amount + 1;
         END LOOP;
         DBMS_LOB.freetemporary (v_clob);
      END IF;
   END PrintXML;
   
create or replace function socket1(ip in varchar2,port in varchar2,request_clob in clob) return clob is 
    response_clob clob;
    con utl_tcp.connection;
    ret_val pls_integer;
    offset integer;
    cloblen integer;
    clobPart VARCHAR2(4096);
    tmpclob clob;
    FUNCTION next_row(clob_in IN CLOB, off_in IN INTEGER) RETURN VARCHAR2 IS
         BEGIN
               RETURN dbms_lob.substr(clob_in, 1024, off_in);
         END next_row;
    Begin
        dbms_output.put_line('create tcp connection ...');
        con := utl_tcp.open_connection(remote_host => ip,
                                           remote_port => port ,
                                           charset     => 'UTF-8');
        cloblen := LENGTH(request_clob);
        offset := 1;
        LOOP
            EXIT WHEN offset >= clobLen;
            clobPart := next_row(request_clob, offset);
            ret_val := utl_tcp.WRITE_line(con, clobPart);
            offset := offset + 1024;
          END LOOP;
          ret_val := utl_tcp.write_line(con); ----must added,mark the request end
          dbms_output.put_line('send tcp request');
          response_clob := empty_clob();
          LOOP
              tmpclob := empty_clob();
              tmpclob := to_clob(utl_tcp.GET_text (con,1024)); ---get response 
            response_clob := response_clob||tmpclob;
            exit when LENGTH(tmpclob) = 0;
          end LOOP;
          dbms_output.put_line('get tcp response');
          utl_tcp.close_connection(con);
      return response_clob;
    Exception 
        when others then
        if sqlcode = '-29259' then
            dbms_output.put_line('SOCKET ERROR -> Message: '||sqlerrm);
            dbms_output.put_line('SOCKET ERROR -> Position: '||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
            utl_tcp.close_connection(con);
            return response_clob;
        else
            dbms_output.put_line('SOCKET ERROR -> Message: '||sqlerrm);
            dbms_output.put_line('SOCKET ERROR -> Position: '||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
            utl_tcp.close_connection(con);
            return null;
        end if;
    END;
    /

test script:

set define off;
set serveroutput on;
declare
    l_ip varchar2(32767);
    l_port varchar2(32767);
    l_address varchar2(32767);
    ret_val pls_integer;
    response clob;
    con  utl_tcp.connection;
begin
    l_address := 'www.baidu.com';
    l_ip := UTL_INADDR.GET_HOST_ADDRESS(l_address);
    dbms_output.put_line('ip of baidu is: '||l_ip);
    l_port := '80';
    response := socket1(l_ip,l_port,to_clob('GET / HTTP/1.0'));
    printxml(response);
end;
/

转载于:https://www.cnblogs.com/ct-blog/p/6384575.html

03-12 10:52:10.111 10094 1462 1554 D WindowManagerShell: TvPipController: onTaskStackChanged() 03-12 10:52:10.120 1000 887 1016 I device_idle_on_start: 03-12 10:52:10.121 1000 887 1016 I device_idle_on_phase: power 03-12 10:52:10.121 1000 887 1016 D NetworkPolicy: DeviceIdleMode enabled: true 03-12 10:52:10.144 1000 887 1016 D NetworkPolicy: Firewall rules changed for dozable; uids=[1000, 1002, 1068, 1073, 2000, 10031, 10032, 10057, 10062, 10066, 10068, 10070, 10071, 10073, 10076, 10089, 10092, 10093, 10094, 10095, 10096, 10097, 10099, 10101, 10115, 10119, 10243, 20031, 20032, 20057, 20062, 20066, 20068, 20070, 20071, 20073, 20076, 20089, 20092, 20093, 20094, 20095, 20096, 20097, 20099, 20101, 20115, 20119, 20243]; rules=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 03-12 10:52:10.148 10243 5671 5692 D RestrictBackgroundNetworkTests: Output of 'cmd activity get-uid-state 10244': '8 (TRANSIENT_BACKGROUND)' 03-12 10:52:10.148 10243 5671 5692 V RestrictBackgroundNetworkTests: assertBackgroundState(): status for app2 (10244) on attempt #1: 8 (TRANSIENT_BACKGROUND) 03-12 10:52:10.150 1000 887 2392 D NetworkPolicy: Blocked state of 10244: {blocked=NONE,allowed=NONE,effective=NONE} 03-12 10:52:10.155 1000 887 1016 D InetDiagMessage: Destroyed 0 sockets, proto=IPPROTO_TCP, family=AF_INET, states=14 03-12 10:52:10.155 1000 887 1016 D InetDiagMessage: Destroyed 0 sockets, proto=IPPROTO_TCP, family=AF_INET6, states=14 03-12 10:52:10.155 10244 5733 5752 D CtsNetApp2: Running checkNetworkStatus() on thread binder:5733_2 for UID 10244 03-12 10:52:10.155 10244 5733 5752 D CtsNetApp2: activeNetworkInfo: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: , failover: false, available: true, roaming: false] 03-12 10:52:10.155 10244 5733 5752 D CtsNetApp2: URL: http://example.com 03-12 10:52:10.155 1000 887 1016 D Ine
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值