Java 調用 plsql function record參數

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

以上爲測試小案例,如有論述錯誤望指出,多多交流,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章