WebService调用oracle存储过程,传入数组参数
CREATE OR REPLACE TYPE transfer_type IS object
(
TDOCNo CHAR(20),
TDOCLineNo NUMBER,
FMCustomerID VARCHAR2(30),
FMSKU VARCHAR(12),
Qty NUMBER(6),
FMLot VARCHAR2(3),
Tolot VARCHAR2(3)
)
然后又定义了一个如下:
CREATE OR REPLACE TYPE transfer_type_array IS TABLE OF transfer_type
存储过程需要传入一个transfer_type_array类型的参数进去
sp_wms_transfer(ac_s_billno IN CHAR,
av_customerID IN VARCHAR2,
ad_transferTime IN DATE,
av_mdf_id IN VARCHAR2,
ad_mdf_date IN DATE,
transfer_type_array_list transfer_type_array,
rtn_code OUT NUMBER,
rtn_mess OUT VARCHAR2) is
关于这个transfer_type_array类型的参数,我的WebService如何调用这个存储过程,参数怎么传?
还有,别人调用我的WebService的话,应该传给我什么类型的参数? 展开
Session session = HibernateSessionFactory.getSession();
//连接对象
Connection conn = null;
//数据集对象
ResultSet rs = null;
//用来取得表列明的 对象
ResultSetMetaData rsmd = null;
CallableStatement proc = null;
conn = session.connection();
conn.setAutoCommit(false);
try {
if (conn != null) {
proc = conn.prepareCall("{call 存储过程包名过程名(n个传入参数对应n个问号,返回参数或游标?占位) }");
// 如下过程PKG_GETDATA有4个传入参数,所有在程序包是PKG_QUERY
//proc = conn.prepareCall("{call PKG_QUERY.PKG_GETDATA(?,?,?,?,?) }");
proc.setString(1, 参数);
//依次按照传入参数顺序与?问号位置传入所有参数
//最后传入n个参数后一位的返回游标
//proc.registerOutParameter(n+1, oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet) proc.getObject(n+1);
conn.commit();
}
可以将上面代码写成一个公用的调用存储过程的通用接口。
别人调用你的webservice 可以具体的参数个数及顺序传递给你的接口,也可以传递一个object数组
去oracle官网上下载dbws-callout-utility-10131.zip
解压后放到oracle安装目录下的/sqlj/lib中;
检查数据库中有多少个java_class语句
select * from User_Objects t where t.object_type like '%JAVA_CLASS%' ;
4.导入java或jar 参数说明:
在cmd命令行中利用loadjava命令(一般安装完jdk或oracle之后就会有,jar包必须为绝对地址)将jar包导入oracle对应的用户(必须是本地用户)中:
loadjava -u nsxydjdba/nsxydj123@orcl -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientws.jar;
loadjava -u nsxydjdba/nsxydj123@orcl -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientdb11.jar;
SYS用户,命令为:
loadjava -u sys/sys -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientws.jar;
loadjava -u sys/sys -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientdb11.jar;
-o 使用OCI8 JDBC接口
-v 显示执行过程
-f 强制装载
-r 编译并解析类
5.如果未发现UTL_DBWS(可以在plsql中敲入sys.若未有utl_dbws显示,则需要进行初始化),需要运行之前下载的包中dbws-callout-utility-
10131/sqlj/lib/ utl_dbws_body.sql及utl_dbws_decl.sql(在sys用户下)
6. 编写sql函数并发布(可能博客显示不全,可参见官方实例:打开等一会可显示
http://www.oracle-base.com/articles/10g/utl_dbws-10g.php)
7.看结果select FUNC_Webservice('1234567','xxxxxx') from dual;