Java调用plsql中的存储过程时,传入单个varchar2类型较为简单;在开发中遇到如下问题Java中需要传入引用类型的参数,却不知道怎么定义,如下
create or replace package YL_XXMFG_TEST_LSY is
-- 需要传入引用类型的参数
FUNCTION main( p_item_tab_type IN g_item_tab_type) return varchar2;
end YL_XXMFG_TEST_LSY;
1、定义类型 g_item_tab_type (注意:使用nvarchar2类型)
--注意,此处类型需使用nvarchar2类型,否则可能由于类型转换问题无法传入参数
create or replace type G_ITEM_REC_TYPE as OBJECT(
name nvarchar2(10),
age nvarchar2(10),
sex nvarchar2(10)
)
2、并引用其为table类型
create or replace TYPE g_item_tab_type IS TABLE OF g_item_rec_type ;
3、创建测试的package及function
create or replace package TEST_LSY is
-- 需要传入引用类型的参数
FUNCTION main( p_item IN g_item_tab_type,returnmsg out varchar2) return varchar2;
end TEST_LSY;
/
create or replace package body TEST_LSY is
FUNCTION main(p_item IN g_item_tab_type,returnmsg out varchar2) RETURN varchar2 AS
x_return_msg varchar2(100);
BEGIN
IF p_item.count = 0 THEN
x_return_msg := '无数据';
ELSE
begin
FOR i IN p_item.first .. p_item.last LOOP
x_return_msg := x_return_msg || '=' || TO_CHAR(p_item(i).name) || '='
|| TO_CHAR(p_item(i).sex) || '=' || TO_CHAR(p_item(i).age);
END LOOP;
exception
when others then
x_return_msg := sqlerrm;
end;
END IF;
return x_return_msg;
END main;
end TEST_LSY;
4、Java调用package,执行测试,可以正常输出
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.internal.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
public class TestController {
public static String testFun(String[][] itemprice_approval) {
String arr ="";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//数据库连接
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.2.45:3000:ORCL", "lsy", "123456");;
String array[][] =itemprice_approval;
//定义的是二维数组,plsql中没有,需要此方法进行处理
ArrayDescriptor des = ArrayDescriptor.createDescriptor("G_ITEM_TAB_TYPE", con);
ARRAY array_to_pass = new ARRAY(des, con, array);
CallableStatement st = con.prepareCall("{? = call test_lsy.main(?,?)}");
// 参数中的 1 2 3 代表{? = call test_lsy.main(?,?)} sql中的?位置
//获取package中function返回值
st.registerOutParameter(1, OracleTypes.NVARCHAR);
//需要传入的参数
st.setArray(2, array_to_pass);
//function中 out类型的参数
st.registerOutParameter(3, OracleTypes.NVARCHAR);
st.execute();
//获取function返回值
String str = st.getString(1) + st.getString(3);
System.out.println(str);
} catch(Exception e) {
System.out.println(e);
}
return arr;
}
public static void main(String[] args) {
//传入参数个数与上面创建的类型参数G_ITEM_REC_TYPE 个数对应, 此处案例为3
String itemappro[][] = new String[1][3]; // 审批
itemappro[0][0] = "张三";
itemappro[0][1] = "18";
itemappro[0][2] = "男";
testFun(itemappro);
}
}