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);
}
}