Oracle通过procedure调用webservice接口的全过程

 更新时间:2024年07月10日 10:52:35   作者:Roki Zhang  
存储过程是一组为了完成特定功能的sql语句集合,经过编译后存储在数据库中,用户通过制定存储过程的名字并给出参数(如果该过程带有参数)来执行他,本文介绍了Oracle通过procedure调用webservice接口的全过程,需要的朋友可以参考下

准备工作

定义测试的webservice及其中的方法

在这里插入图片描述

如何发布全新的webservice并测试,可以参考博客C# webservice 接口编写、发布与测试

方法体如下

[WebMethod]
public string testProcedure(string sInput)
{
	return "执行时间:" + DateTime.Now.ToString() + sInput;
}

Oracle语句详情

-- 声明变量和数据类型
declare
    req        utl_http.req;         -- HTTP请求句柄
    resp       utl_http.resp;        -- HTTP响应句柄
    url        varchar2(4000) := 'http://10.xx.xx.xx:8085/WebService.asmx'; -- Web Service的URL地址
    soap_env   varchar2(4000);       -- SOAP请求包体
    buffer     varchar2(32767);      -- 字符串缓冲区
    utf8_data  clob;                 -- 存储UTF-8编码的CLOB数据类型(存储大量文本数据的数据类型)
    raw_data   raw(32767);           -- RAW数据类型,用于存储二进制数据
    raw_buffer raw(32767);           -- RAW类型的缓冲区
    line       varchar2(32767);      -- 每行读取的数据
    idx        integer := 1;         -- 循环索引变量
begin

    -- 构造SOAP请求包体
    soap_env := 
        '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">' ||
        '<soap:Header/>' ||            -- SOAP头,这里为空
        '<soap:Body>' ||               -- SOAP主体开始
        '  <tem:testProcedure>' ||     -- 调用Web Service的方法名
        '    <tem:sInput>' ||          -- 方法参数开始
        ' testConnect + 中文test' ||   -- 参数值,包括英文和中文字符
        '</tem:sInput>' ||             -- 方法参数结束
        '  </tem:testProcedure>' ||    -- 方法调用结束
        '</soap:Body>' ||              -- SOAP主体结束
        '</soap:Envelope>';            -- SOAP包体结束

    -- 开始发起HTTP POST请求,如果此部分存在疑问,请自行寻找前端请求报文相关内容学习。
    req := utl_http.begin_request(url, 'POST', 'HTTP/1.1'); -- 初始化HTTP请求
    utl_http.set_header(req, 'Content-Type', 'application/soap+xml; charset=utf-8'); -- 设置Content-Type头部
    utl_http.set_header(req, 'Content-Length', length(soap_env)); -- 设置Content-Length头部
    utl_http.write_text(req, soap_env); -- 写入SOAP请求包体到HTTP请求

    -- 获取HTTP响应
    resp := utl_http.get_response(req); -- 获取HTTP响应句柄
    dbms_lob.createtemporary(utf8_data, true); -- 创建临时CLOB变量用于存储响应数据

    -- 循环读取HTTP响应体
    loop
        begin
            utl_http.read_raw(resp, raw_buffer, 32767); -- 读取响应体到RAW缓冲区
            dbms_lob.writeappend(utf8_data,                   -- 将RAW缓冲区的数据追加到CLOB中
                                 utl_raw.length(raw_buffer), -- 数据长度
                                 utl_raw.cast_to_varchar2(raw_buffer)); -- 将RAW转换为VARCHAR2再写入CLOB
        exception
            when utl_http.end_of_body then
                exit; -- 如果到达响应体结尾,则退出循环
            when others then
                dbms_output.put_line('在读取响应时发生错误: ' || sqlerrm); -- 其他异常处理
                exit; -- 退出循环
        end;
    end loop;

    utl_http.end_response(resp); -- 结束HTTP响应

    -- 循环读取并打印CLOB中的内容
    idx := 1;
    while idx <= dbms_lob.getlength(utf8_data) loop
        line := dbms_lob.substr(utf8_data, 255, idx); -- 从CLOB中读取一行数据
        dbms_output.put_line(line); -- 打印读取的一行数据
        idx := idx + 255; -- 更新索引
    end loop;

    dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间

exception
    when utl_http.end_of_body then
        utl_http.end_response(resp); -- 异常处理:如果到达响应体结尾,确保关闭HTTP响应
    when others then
        dbms_output.put_line('在调用Web服务时发生错误: ' || sqlerrm); -- 其他异常处理
        if dbms_lob.istemporary(utf8_data) = 1 then
		传参的中文会乱码,但是方法内部的中文不会乱码
            dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间
        end if;
end;
/

重要参数说明

上述程序已经解决了中文乱码的问题,但是还是不太完美,传参的中文会乱码,但是方法内部的中文不会乱码。

在这里插入图片描述

Web Service的URL地址

url varchar2(4000) := 'http://10.xx.xx.xx:8085/WebService.asmx';

构造SOAP请求包体

soap_env := 
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">' ||
'<soap:Header/>' ||            -- SOAP头,这里为空
'<soap:Body>' ||               -- SOAP主体开始
'  <tem:testProcedure>' ||     -- 调用Web Service的方法名
'    <tem:sInput>' ||          -- 方法参数开始
' testConnect + 中文test' ||   -- 参数值,包括英文和中文字符
'</tem:sInput>' ||             -- 方法参数结束
'  </tem:testProcedure>' ||    -- 方法调用结束
'</soap:Body>' ||              -- SOAP主体结束
'</soap:Envelope>';            -- SOAP包体结束

其中testProcedure为webservice中定义的测试方法名,sInput为方法的参数,多个参数,自行添加。标签<tem:sInput></tem:sInput>中间填写这个参数传的实际值,其余部分无需修改。

构造SOAP请求包体方法

我使用了soapui这个工具,怎么使用可以参考博客SoapUI 测试WebService接口可用性

依次如下操作即可:

在这里插入图片描述

如果需要把上面的功能变成function或者procedure,请自行搜索相关的方法实现即可。

到此这篇关于Oracle通过procedure调用webservice接口的全过程的文章就介绍到这了,更多相关Oracle procedure调用webservice内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle RMAN三种不完全恢复方式的实战指南

    Oracle RMAN三种不完全恢复方式的实战指南

    在Oracle数据库的日常管理中,不完全恢复(Incomplete Recovery)是一项重要且实用的技能,尤其是在面对人为误操作(如误删表)或逻辑故障(如表空间损坏)时,本文将通过三个实际演示案例,逐一呈现三种不完全恢复方式的操作步骤,需要的朋友可以参考下
    2025-10-10
  • Oracle数据库时间格式转换的常见示例

    Oracle数据库时间格式转换的常见示例

    这篇文章主要给大家介绍了关于Oracle数据库时间格式转换的常见示例,在实际的工作中会经常会用到to_char()、to_date()函数来对时间、日期进行处理,文中给出了详细的代码示例,需要的朋友可以参考下
    2024-02-02
  • LINUX下Oracle数据库用户创建方法详解

    LINUX下Oracle数据库用户创建方法详解

    这篇文章主要介绍了LINUX下Oracle数据库用户创建方法,结合实例形式较为详细的分析总结了Oracle数据库用户创建的具体步骤与相关技巧,需要的朋友可以参考下
    2015-12-12
  • Oracle AI应用的LLM模型典型配置方法

    Oracle AI应用的LLM模型典型配置方法

    本文介绍了如何在同事的开源项目Text2SQLRAG中配置Embedding模型,并详细描述了测试和配置DeepSeek的LLM的过程,感兴趣的朋友一起看看吧
    2025-03-03
  • Oracle修改表空间大小的方法

    Oracle修改表空间大小的方法

    这篇文章主要介绍了Oracle修改表空间大小的方法,实例讲述了Oracle通过命令行实现修改Oracle表空间大小的方法,非常简单实用,需要的朋友可以参考下
    2015-12-12
  • ORACLE常见错误代码的分析与解决二

    ORACLE常见错误代码的分析与解决二

    ORACLE常见错误代码的分析与解决二...
    2007-03-03
  • Oracle的默认用户密码

    Oracle的默认用户密码

    创建表空间和用户时,需要的时候竟然忘记了密码,试了好多次都没连接上,进而用户也被锁定,下面就教您处理Oracle默认用户的密码问题的方法,希望对和我一样情况的朋友们有所帮助
    2012-07-07
  • oracle中得到一条SQL语句的执行时间的两种方式

    oracle中得到一条SQL语句的执行时间的两种方式

    这篇文章主要介绍了oracle中如何得到一条SQL语句的执行时间,有两种可行方式,大家可以参考下
    2014-05-05
  • Oracle数据库的备份与恢复

    Oracle数据库的备份与恢复

    Oracle数据库的备份与恢复...
    2007-03-03
  • ORACLE 自动提交问题

    ORACLE 自动提交问题

    通过PL/SQL DEVELOPER向数据库中的某个表中插入一定量的数据,通过select 语句可以看到已经插入到表中,然而诡异的是通过程序却无法查询到新插入的数据。
    2009-06-06

最新评论