Java中调用存储过程或存储函数的方法.doc
文本预览下载声明
1.调用存储过程:
CallableStatement clstmt = null;
try {
clstmt = conn.prepareCall({call package_name.procedure_name(?,?,?,?,?)});
clstmt.setString(1, bill.getBillType());
clstmt.setString(2, bill.getId());
clstmt.setInt(3, bill.getNum());
clstmt.registerOutParameter(4, Types.CHAR);
clstmt.registerOutParameter(5, Types.VARCHAR);
clstmt.execute();
out_opresult = clstmt.getString(4).trim();
out_operror = clstmt.getString(5).trim();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
2.调用存储函数:
CallableStatement clstmt = null;
try {
clstmt = conn.prepareCall({? = call package_name.function_name(?,?,?,?)});
clstmt.registerOutParameter(1, Types.VARCHAR);
clstmt.setString(2, bill.getBillType());
clstmt.setString(3, bill.getId());
clstmt.registerOutParameter(4, Types.CHAR);
clstmt.registerOutParameter(5, Types.VARCHAR);
clstmt.execute();
out_opresult = clstmt.getString(4).trim();
out_operror = clstmt.getString(5).trim();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
* 存储过程编写时应注意:
1.输出参数不能作为查询条件;
eg: 假设,out_id已赋值,
SELECT name
INTO out_name
FROM tb_test
WHERE id = out_id;
这样写PL/SQL中会正常通过,而在Java程序调用该存储过程时会报错,需要改成:
v_id CHAR(8) := ;
先对v_id赋值,
SELECT name
INTO out_name
FROM tb_test
WHERE id = v_id;
这样PL/SQL和Java程序中都可正常通过和调用。
2.如存储过程中带有Date、Boolean型参数,Java程序调用时会出错,
报类型不匹配,目前只能不用Date、Boolean型作为存储过程参数,
可能的原因:JDBC不支持。。。
测试程序如下:
存储函数如下:
FUNCTION my_test(in_test1 IN CHAR,
in_test2 IN BOOLEAN,
out_test3 OUT VARCHAR) RETURN VARCHAR IS
v_test CHAR(3) := ;
BEGIN
select aaa into v_test from dual;
Return OK;
EXCEPTION
WHEN OTHERS THEN
out_test3 := SQLCODE;
Return SQLCODE;
END;
Java代码如下:
try {
clstmt = conn.prepareCall({? = call my_test(?,?
显示全部