B2B 示例示范 Utl_Http 包的使用
示例
此示例模拟了典型的顾客/卖主情景。描绘了一个顾客和卖主群体。每个顾客从一个或多个卖主处购买商品,每个卖主向一个或多个顾客出售商品。顾客和卖主在 Oracle 数据库中维护库存数据。该群体已意识到电子商务的好处,并且赞同使需要发送的请求和回复类型的表示方法标准化……
- 顾客#1(对多个卖主):
- 这是顾客 #1
- 参考号 #nnnnn
- 您可以卖给我 X 商品吗?
- N 个商品的价格是多少?
- 在什么时候之前可以交货?
- 卖主 #1:
- 这是卖主 #1
- 参考号 #nnnnn
- 我们没有 X 商品的存货
- 卖主 #2:
- 这是卖主 #2
- 参考号 #nnnnn
- N 个商品的 X 商品的价格是 Y
- 我们可以在 D1 之前交货
- 本商品在 D2 之前可供货。
- 供货参考号#mmmm
- 顾客#1 对卖主 #2:
- 这是顾客 #1
- 参考号 #ppppp
- 供货参考号#mmmm
- 为我提供 N 个 X 商品
- 卖主 #2:
- 这是卖主 #2
- 参考号 #ppppp
- 确认订购N 个单位的 X 商品
- 订货参考号#qqqqq
他们同意采用通过 HTTP 传输的 XML 作为通信格式和传输机制,因为这样支持所有当前的消息需求并且容易扩展,而且不需要改变基础的消息交换和解析机制。
他们承认有时候发送消息到特别站点的尝试会失败(比如说,该站点已关闭),因而需要在发生故障时通过自动生成的电子邮件来通知发送站点的管理员。
实施概念
客户数据库事件将触发一次消息发送。消息将根据当前数据库的数值构建。并使用
Utl_Http API 将它发送到一个或几个口令保护的 URL 上。URL 和口令数据可从数据库中检索。
卖主 URL 通过 mod_plsql 和 Htp.Print 等,作为 PL/SQL 过程来执行。此过程解析消息然后存取卖主数据库数值来编写回复,并在数据库中记录关于回复的数据。
顾客解析返回的消息并据此更新顾客数据库数值。如果检测到错误,将使用 Utl_Smtp API 通过电子邮件来提醒管理员。
代码示例的简化情形
一个顾客与一个卖主通信。如果顾客站点和卖主站点在不同的计算机上的不同数据库中实施,示例将更有说服力。
connect system/manager@customer_site
create user customer identified by customer;
grant resource, connect to customer;
connect system/manager@vendor_site
create user vendor identified by vendor;
grant resource, connect to vendor;
但它当然要和单个数据库中的两个部分一起工作。
顾客站点
顾客库存用单个
表来表示。当一种商品的存货水平降到低于下限时,该表的一个触发器将触发。
该触发器计算要订购的商品数量,然后在表中插入一行,该行代表一订单队列。订单号从一个序列中生成。
此队列由一个程序周期性地使用。这可以通过 Dbms_Job API 自动调度,但在此代码示例中需要人工执行。
此程序为要订购的每一种商品调用一个子程序。该子程序汇编消息,获取合适的 XML 标记作为 包常量,并从表中获取卖主 URL 和口令数据。
确保编辑这些内容以在您创建了 vendor 用户的位置正确指定节点。
注意:提供了该 子程序的一个简单版本以供比较。它仅使用 Oracle8i 提供的 Utl.Http.Request。该子程序的完整版本依赖于 Oracle9i 的 Utl.Http 中引入的特性。所有对 Oracle9i Utl.Http API 的调用都捆绑在一个子程序中。
返回消息经过解析后,结果信息用来更新订单序列。
在发生错误时,将自动发送一封电子邮件。此程序依赖于Demo_Mail 包代码示例。
确保为您的环境编辑自定义部分的 smtp 主机和域。
按正确的从属顺序创建顾客站点模式对象。
卖主站点
通过 mod_plsql 和 Htp.Print,卖主将 URL 作为 PL/SQL 程序来执行。
通过编译和测试一个简单的 Hello mod_plsql URL,确保基本机制得到正确配置。
此程序解析进入的消息并据此更新卖主订单表。它编写一条返回消息,获取合适的 XML 标记作为包常量。
为获得最显著的效果
按正确的从属顺序创建顾客站点模式对象。
注意:在代码示例中使用 "GET" 方法将顾客消息作为一个名称和值的参数对的值来发送。这对于提供的具体数据可正常运行。真实的实现应考虑到要发送的信息任意长的可能性,所以要使用 "POST" 方法在HTTP 请求的正文内发送消息。 Utl_Http API 对此支持。不过,编写执行 URL 的过程时需要相应地更加细致些。
测试系统
首先测试从数据库发送电子邮件,如下所示
connect customer/customer@customer_site
Execute Send_Error_Mail ( 12345, 'This is a test' );
完整的端对端测试是指更新顾客库存水平表中一个行的现有库存水平,使它降到低于库存水平下限并触发消息交换。然后检查顾客订单和卖主订单表。
使用该测试脚本。如果您在运行创建顾客站点和卖主站点的脚本之后立即运行测试脚本,那么您将在顾客订单表中看到[像这样]的内容……
O V SCU Q D S MSG
------- ---- ---- ---- ------------------------ ---------- --------
1234567 1 1 41 12:51:23::08-Nov-2001 submitted
……以及在卖主订单表中看到[像这样]的内容……
ORDER_REF CUSTOMER_ID SCU QUANTITY ORDER_DAT STATUS
--------- ----------- ---------- ---------- --------- ------
1234567 1 1 41 08-NOV-01 new
设定错误环境来测试异常报告和自动电子邮件发送。实现它的简单方法是用如下的 URL 更新卖主数据表……
http://bllewell-sun.us.oracle.com:7777/pls/vendor/Nonexistent
……然后运行脚本,
创建顾客站点和
创建卖主站点,然后
运行测试。您现在将在顾客订单表中看到[像这样]的内容……
O V SCU Q D S MSG
------- ---- ---- ---- ------------------------ ---------- --------------------------------------------
1234567 1 1 41 01:45:11::08-Nov-2001 failed ORA-29268:HTTP client error 404 - Not Found
……并将收到相关的电子邮件。
Bryn Llewellyn,PL/SQL 产品经理,Oracle Corp
最新更新时间为 2002 年 6 月 24 日