PLSQL NOTE--------network utl_tcp

utl_tcp 实现tcp连接

function :

 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;
/

xml output procedure:

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;
/
show errors;

时间: 2024-11-05 11:55:58

PLSQL NOTE--------network utl_tcp的相关文章

PLSQL NOTE --------like 与转义字符

SQL> create table test 2 (id integer, 3 name varchar2(90)); Table created. SQL> insert into test values(100,'aassdd'); 1 row created. SQL> insert into test values(120,null); 1 row created. SQL> insert into test values(110,'aa_see'); 1 row crea

PLSQL note

sql%count 最近一次sql执行的件数SUBSTR(string , int i) // i番目から最後までの文字列を切り取るSUBSTR(string , int i, int j) // i番目からj文二の文字列を切り取るNVL(para, string) // paraはnullであれば.string を戻るFLOOR( i) // iより小さく.一番大きい整数を戻るCEIL(i) // iより大きく.一番小さい整数を戻るROUND(i) // 四捨五入TO_CHAR() //sel

How Network Load Balancing Technology Works--reference

http://technet.microsoft.com/en-us/library/cc756878(v=ws.10).aspx In this section Network Load Balancing Terms and Definitions Network Load Balancing Architecture Network Load Balancing Protocols Application Compatibility with Network Load Balancing

Linux Shell脚本之远程自动部署java maven项目

脚本功能: 自动从git上获取java maven项目工程源码,在机器A上build,build完成后,将Class文件和配置文件等上传到机器B,重新启动机器B上的服务以便变更生效. 脚本特点: 1.(与之前的自动部署脚本相比)全新优化了脚本代码,更friendly,结构更紧凑 2.Public header删除了无用或者不好用的有色彩显示函数,并修正了WORKDIR不是绝对路径可能导致的bug 3.修正了域名解析判断是否正常的一个bug,该bug可能导致遇到无法解析后不断尝试解析 4.全新的m

自动化部署java maven项目到多个目标主机的Shell脚本

本篇是<Linux Shell脚本之远程自动化部署java maven项目>的姊妹篇,但包含了bug.issue修正和添加了更多的支持特性,可以从GitHub上获取最新脚本内容:https://github.com/DingGuodong/AutomaticDeployJavaMavenProject . 自动化部署java maven项目到多个主机的环境条件假设: 1.java maven项目至多有一个依赖项目 2.多个目标主机上的部署目录是相同的 支持特性: 1.在部署主机上将java m

Mesos原理与代码分析(4) Mesos Master的启动之三

3. ModuleManager::load(flags.modules.get())如果有参数--modules或者--modules_dir=dirpath,则会将路径中的so文件load进来 ? 代码中加载模块的代码如下 ? 对应的命令行参数如下: ? ? 都可以写什么Module呢? ? 首先是Allocator ? 默认是内置的Hierarchical Dominant Resource Fairness allocator ? 要写一个自己的Allocator: 通过--module

安装PL/SQL Developer遇到的问题

前提:已经成功安装好Oracle数据库 安装环境:win7 64位 Oracle安装版本11g 64位 问题1)Oracle自带的sqldeveloper用不了 让我输入java.exe的完整路径,然后报警告 WARNING: Could not find jvm.cfg! in 'C:\Program Files\Java\jdk1.8.0_151\jre\lib\jvm.cfg' 其他人的经验是安装的sqldeveloper是32位的而jdk是64位的所以不行 解决方案)下64位的sqlde

network note

在不记就忘了,自己在H3C沉浸中积累的一点点网络知识,这是后来看ccie或者其他资料总结的 从协议方面看,只要把PDU搞定就可以了,怪不得面试官总会问这些,我却觉得是迂腐的表现,感觉人的大脑大部分应该用在思考而不是用来充当硬盘,就怪自己内存太小吧,又不太在意概念这东西,机会也就悄悄的不在意我了,最终离开了这个有趣的行业,生活还得继续... ---------------------------------------- 冲突域:一组互联的设备,网段中的一台设备发送分组时,该网段中的其他设备都必须

Oracle Client 与PLSQL Developer的配置

在对oracle数据库进行管理或者在开发活动中常常会使用PLSQL Developer工具来管理我们的数据库,当然,要让我们在PLSQL Developer上的操作在远程数据库系统中生效,我们首先需要安装oracle的客户端. 准备: 1,Oracle Database Instant Client http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 2,PLSQL Develo