Java 调用 plsql function record参数

4 篇文章 0 订阅
1 篇文章 0 订阅

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

以上为测试小案例,如有论述错误望指出,多多交流,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值