ORACLE 自 9i 起,允许使用 UTL_HTTP 包进行访问网络,可以直接在 ORACLE 中发起 WEB SERVICE 调用,经测试该方法在oracle 10g中同样适用.
操作步骤如下:
1。首先导入 soap_api 包,在toad中直接execute as script就可以了
CREATE OR REPLACE PACKAGE soap_api AS
-- --------------------------------------------------------------------------
-- Name : http://www.oracle-base.com/dba/miscellaneous/soap_api
-- Author : DR Timothy S Hall
-- Description : SOAP related functions for consuming web services.
-- Ammedments :
-- When Who What
-- =========== ======== =================================================
-- 04-OCT-2003 Tim Hall Initial Creation
-- 23-FEB-2006 Tim Hall Parameterized the "soap" envelope tags.
-- --------------------------------------------------------------------------
TYPE t_request IS RECORD (
method VARCHAR2(256),
namespace VARCHAR2(256),
body VARCHAR2(32767),
envelope_tag VARCHAR2(30)
);
TYPE t_response IS RECORD
(
doc XMLTYPE,
envelope_tag VARCHAR2(30)
);
FUNCTION new_request(p_method IN VARCHAR2,
p_namespace IN VARCHAR2,
p_envelope_tag IN VARCHAR2 DEFAULT 'SOAP-ENV')
RETURN t_request;
PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request,
p_name IN VARCHAR2,
p_type IN VARCHAR2,
p_value IN VARCHAR2);
FUNCTION invoke(p_request IN OUT NOCOPY t_request,
p_url IN VARCHAR2,
p_action IN VARCHAR2)
RETURN t_response;
FUNCTION get_return_value(p_response IN OUT NOCOPY t_response,
p_name IN VARCHAR2,
p_namespace IN VARCHAR2)
RETURN VARCHAR2;
END soap_api;
/
SHOW ERRORS
CREATE OR REPLACE PACKAGE BODY soap_api AS
-- --------------------------------------------------------------------------
-- Name : http://www.oracle-base.com/dba/miscellaneous/soap_api
-- Author : DR Timothy S Hall
-- Description : SOAP related functions for consuming web services.
-- Ammedments :
-- When Who What
-- =========== ======== =================================================
-- 04-OCT-2003 Tim Hall Initial Creation
-- 23-FEB-2006 Tim Hall Parameterized the "soap" envelope tags.
-- --------------------------------------------------------------------------
-- ---------------------------------------------------------------------
FUNCTION new_request(p_method IN VARCHAR2,
p_namespace IN VARCHAR2,
p_envelope_tag IN VARCHAR2 DEFAULT 'SOAP-ENV')
RETURN t_request AS
-- ---------------------------------------------------------------------
l_request t_request;
BEGIN
l_request.method := p_method;
l_request.namespace := p_namespace;
l_request.envelope_tag := p_envelope_tag;
RETURN l_request;
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request,
p_name IN VARCHAR2,
p_type IN VARCHAR2,
p_value IN VARCHAR2) AS
-- ---------------------------------------------------------------------
BEGIN
p_request.body := p_request.body||'<'||p_name||' xsi:type="'||p_type||'">'||p_value||'</'||p_name||'>';
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
PROCEDURE generate_envelope(p_request IN OUT NOCOPY t_request,
p_env IN OUT NOCOPY VARCHAR2) AS
-- ---------------------------------------------------------------------
BEGIN
p_env := '<'||p_request.envelope_tag||':Envelope xmlns:'||p_request.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/" ' ||
'xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">' ||
'<'||p_request.envelope_tag||':Body>' ||
'<'||p_request.method||' '||p_request.namespace||' '||p_request.envelope_tag||':encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' ||
p_request.body ||
'</'||p_request.method||'>' ||
'</'||p_request.envelope_tag||':Body>' ||
'</'||p_request.envelope_tag||':Envelope>';
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
PROCEDURE show_envelope(p_env IN VARCHAR2) AS
-- ---------------------------------------------------------------------
i PLS_INTEGER;
l_len PLS_INTEGER;
BEGIN
i := 1; l_len := LENGTH(p_env);
WHILE (i <= l_len) LOOP
DBMS_OUTPUT.put_line(SUBSTR(p_env, i, 60));
i := i + 60;
END LOOP;
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
PROCEDURE check_fault(p_response IN OUT NOCOPY t_response) AS
-- ---------------------------------------------------------------------
l_fault_node XMLTYPE;
l_fault_code VARCHAR2(256);
l_fault_string VARCHAR2(32767);
BEGIN
l_fault_node := p_response.doc.extract('/'||p_response.envelope_tag||':Fault',
'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/');
IF (l_fault_node IS NOT NULL) THEN
l_fault_code := l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultcode/child::text()',
'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/').getstringval();
l_fault_string := l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultstring/child::text()',
'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/').getstringval();
RAISE_APPLICATION_ERROR(-20000, l_fault_code || ' - ' || l_fault_string);
END IF;
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
FUNCTION invoke(p_request IN OUT NOCOPY t_request,
p_url IN VARCHAR2,
p_action IN VARCHAR2)
RETURN t_response AS
-- ---------------------------------------------------------------------
l_envelope VARCHAR2(32767);
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_response t_response;
BEGIN
generate_envelope(p_request, l_envelope);
show_envelope(l_envelope);
l_http_request := UTL_HTTP.begin_request(p_url, 'POST','HTTP/1.1');
UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml');
UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_envelope));
UTL_HTTP.set_header(l_http_request, 'SOAPAction', p_action);
UTL_HTTP.write_text(l_http_request, l_envelope);
l_http_response := UTL_HTTP.get_response(l_http_request);
UTL_HTTP.read_text(l_http_response, l_envelope);
UTL_HTTP.end_response(l_http_response);
l_response.doc := XMLTYPE.createxml(l_envelope);
l_response.envelope_tag := p_request.envelope_tag;
l_response.doc := l_response.doc.extract('/'||l_response.envelope_tag||':Envelope/'||l_response.envelope_tag||':Body/child::node()',
'xmlns:'||l_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/"');
-- show_envelope(l_response.doc.getstringval());
check_fault(l_response);
RETURN l_response;
END;
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
FUNCTION get_return_value(p_response IN OUT NOCOPY t_response,
p_name IN VARCHAR2,
p_namespace IN VARCHAR2)
RETURN VARCHAR2 AS
-- ---------------------------------------------------------------------
BEGIN
RETURN p_response.doc.extract('//'||p_name||'/child::text()',p_namespace).getstringval();
END;
-- ---------------------------------------------------------------------
END soap_api;
/
SHOW ERRORS
2。创建 web service 接口调用方法 , (function,tigger,procedures都可以)
CREATE OR REPLACE FUNCTION add_numbers (p_int_1 IN NUMBER,
p_int_2 IN NUMBER)
RETURN NUMBER
AS
l_request soap_api.t_request;
l_response soap_api.t_response;
l_return VARCHAR2(32767);
l_url VARCHAR2(32767);
l_namespace VARCHAR2(32767);
l_method VARCHAR2(32767);
l_soap_action VARCHAR2(32767);
l_result_name VARCHAR2(32767);
BEGIN
l_url := 'http://www.oracle-base.com/webservices/server.php';
l_namespace := 'xmlns="http://www.oracle-base.com/webservices/"';
l_method := 'ws_add';
l_soap_action := 'http://www.oracle-base.com/webservices/server.php/ws_add';
l_result_name := 'return';
l_request := soap_api.new_request(p_method => l_method,
p_namespace => l_namespace);
soap_api.add_parameter(p_request => l_request,
p_name => 'int1',
p_type => 'xsd:integer',
p_value => p_int_1);
soap_api.add_parameter(p_request => l_request,
p_name => 'int2',
p_type => 'xsd:integer',
p_value => p_int_2);
l_response := soap_api.invoke(p_request => l_request,
p_url => l_url,
p_action => l_soap_action);
l_return := soap_api.get_return_value(p_response => l_response,
p_name => l_result_name,
p_namespace => NULL);
RETURN l_return;
END;
/
3。测试
SELECT add_numbers(1, 5) FROM dual;
ADD_NUMBERS(1,5)
----------------
6
SQL>
SELECT add_numbers(10, 15) FROM dual;
ADD_NUMBERS(10,15)
------------------
25
SQL>
原文:http://www.oracle-base.com/articles/9i/ConsumingWebServices9i.php
分享到:
相关推荐
Oracle 9i是一款广泛使用的数据库管理系统,而C#是一种常用的编程语言,常用于构建Windows桌面应用、Web应用等。本篇文章将详细探讨如何使用C#通过WebService来连接Oracle 9i数据库,以实现无需在运行C#程序的计算机...
6. **Web服务支持**: Oracle9i增强了对Web服务的支持,包括WSDL(Web Service Description Language)和SOAP(Simple Object Access Protocol),使得XML数据能够在分布式环境中作为Web服务进行交互。 7. **XMLDB ...
1. **Web容器**:Oracle9i提供了一个符合J2EE规范的Web容器,支持Servlet和JSP的部署与执行,允许开发者创建动态网页和Web服务。 2. **EJB容器**:EJB是J2EE的核心组件,用于实现业务逻辑。Oracle9i提供了EJB容器,...
Oracle9i应用程序服务器的Portal篇主要关注Oracle Portal的使用,这是一个强大的Web开发工具,用于构建企业级入口网站和商业智能应用。Oracle Portal的核心优势在于它提供了友好的开发环境,简化了网站、应用程序和...
随着Web Services的广泛应用,Oracle也提供了相应的技术支持,让开发人员能够通过PL/SQL直接调用Web Services。这篇文章主要探讨如何在Oracle环境中,利用PL/SQL的UTL_DBWS包来访问Web Services。 在Oracle 9i版本...
在SSH框架下,Oracle9i作为后端存储,通过JDBC(Java Database Connectivity)接口与Hibernate进行通信,执行SQL语句。 对于“ssh结合oracle增删改查”的具体实践,开发者通常会经历以下步骤: 1. **配置SSH框架**...
SQL*Net通信端口则是Oracle的HTTP服务,如Oracle Application Express (Apex) 或其他Web服务使用的端口,默认可能是8080。 现在,让我们进入正题,讲解如何更改Oracle的HTTP服务端口(例如从8080更改为8081): 1....
Oracle 9i的安装可以选择服务器或客户端模式。在Web服务器端,只需安装客户端。确保安装过程中包含Oracle Windows Interfaces模块,因为它提供了ODBC和OO4O等功能。 2. **配置Oracle服务器** 可以通过图形界面...
常见的应用服务器有BEA WebLogic Server、IBM WebSphere Application Server、Oracle9i Application Server、jBoss、Tomcat等。 四、数据连接池 数据连接池是在J2EE服务器启动时建立一定数量的池连接,并一直维持...
在这个模块中,你可以看到如何配置这三个框架,如何在Struts2的动作类中调用Spring管理的Service,以及如何通过Hibernate来操作Oracle数据库中的订单表。 学习和理解Struts2.0、Hibernate3.1、Spring2.0的整合,...
- 《Oracle Database 9i/10g/11g 编程艺术: 深入数据库体系结构(第2版)》凯特(Thomas Kyte)(作者), 苏金国(译者), 王小振(译者), 等(译者) #### 七、结语 通过本项目的实施,不仅能够掌握Oracle数据库的应用,还能...
连接 Oracle 8/8i/9i 数据库需要使用 Oracle 提供的驱动程序,下面是一个简单的示例代码: ```jsp ;charset=gb2312"%> *"%> Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc...
常见的应用服务器有 BEA WebLogic Server、IBM WebSphere Application Server、Oracle9i Application Server、jBoss 和 Tomcat 等。这些服务器软件提供了对 Java EE 规范的支持,允许开发者使用 Java 语言开发 Web ...
使用`oracle.jdbc.driver.OracleDriver`驱动,URL示例为`jdbc:oracle:thin:@host:port/service_name`。 - **Access**:主要用于桌面应用,与Java配合使用时需要ODBC桥接。使用`sun.jdbc.odbc.JdbcOdbcDriver`驱动,...
`web-INF`目录下的内容,如`struts.xml`、`spring-context.xml`和`hibernate.cfg.xml`,是SSH2整合的关键配置文件,你需要根据自己的数据库环境(这里是Oracle 9i)来调整`hibernate.cfg.xml`中的JDBC连接配置。...
Web容器(如Tomcat、Jboss、WebLogic、WebSphere、Oracle9i AS)是运行Servlet的环境,负责Servlet的加载、初始化、服务、销毁等生命周期管理。 10. **Session和Cookie**: Session用于存储用户会话信息,原理是...
- 负责Servlet的管理和运行,如Tomcat、Jboss、WebLogic、WebSphere和Oracle9i AS等。 11. **HttpServletRequest和HttpServletResponse**: - HttpServletRequest负责处理请求,提供获取参数、头信息等方法。 - ...
由于我们的数据库是Oracle9i,所以使用OracleLobHandler。 在配置完LobHandler后, 还需要将其注入到sessionFactory的Bean中,下面是调用后的sessionFactory Bean的配置: 代码 6 将lobHandler注入到...
在这个例子中,使用的是 Oracle 9i 数据库,但通过 Spring 的配置,可以轻松地迁移到其他支持 Blob 的数据库。表 `T_FILE` 包含 `FILE_ID`(uuid.hex 生成的唯一标识)、`FILE_NAME`(文件名)、`FILE_CONTENT`...
- **Oracle9i数据源的配置** - **实体BEAN发布前的准备工作** - **单表映射的实体BEAN** - **属性映射** - **持久化实体管理器ENTITY MANAGER** - **Entity获取find()或getReference()** - **添加persist()** - ...