加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

JDBC调用存储过程,传入list参数,插入或更新数据。

(2014-03-24 15:22:01)
标签:

jdbc调用存储过程传入

it

分类: 项目经验

JDBC调用存储过程,传入list参数,插入或更新数据。

注:这里用的事jdbc方式加载驱动获取的connection,如果是jndi等获取datasource方式,会报connection转型错误,因为需要操作oracle自定义数组类型,需要oracle.jdbc.OracleConnection

首先,需对需传入的list参数做数据类型的封装,在数据库建立自定义类型

CREATE OR REPLACE TYPE imgObject AS OBJECT

(

imgCODE VARCHAR2(14),

  PATH          VARCHAR2(200),

    CONSTRUCTOR FUNCTION  imgObject

 (

imgCODE VARCHAR2 DEFAULT NULL,

PATH          VARCHAR2 DEFAULT NULL

  ) RETURN SELF AS RESULT

);

CREATE OR REPLACE TYPE img_LIST AS VARRAY(2000) OF imgObject;--参数array

第二步提供java数据集合到oracle数组类型的转换方法

 

            private static ARRAY getOracleArray(Connection con, String Oraclelist,

                    Listobjlist) throwsException {

                ARRAY list = null;

                if (objlist != null && objlist.size() > 0) {

                    StructDescriptor structdesc = newStructDescriptor(

                            "imgObject", con);

                    STRUCT[] structs = newSTRUCT[objlist.size()];

                    //   Object[] result = new Object[0];

                    int i = 0;

                    for (Titemvenfile img : objlist) {

                        Object[] result = newObject[2];

                        result[0] = img.getimg_code();

                        result[1] = img.getPath();

                        structs[i] = newSTRUCT(structdesc, con, result);

                        i++;

                    }

                    ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,

                            con);

                    list = newARRAY(desc, con, structs);

                } else{

                    ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,

                            con);

                    STRUCT[] structs = newSTRUCT[0];

                    list = newARRAY(desc, con, structs);

                }

                return list;

            }

 

第三步,存储过程的建立

CREATE OR REPLACE PROCEDURE updateImagels(imgArray IN img_LIST,p_out OUT VARCHAR2)

AS

img_CODE VARCHAR2(14);

img_PATH          VARCHAR2(200);

imgObj imgObject;

v_count number;

UPLOAD_DATE date:=sysdate;

i number;

begin

i:=0;

for i in 1..imgArray.count loop

     imgObj:=imgArray(i);

     img_CODE:=imgObj.img_CODE;

     img_PATH:= imgObj.img_PATH;

     DBMS_OUTPUT.put_line(i);

     DBMS_OUTPUT.put_line(img_CODE);

select count(*) into v_count from  img_tb img

            where img.img_code= img_CODE;

 

     --执行插入或更新

     if v_count=0 then

     insert into img_tb(img_code,img_path)values(img_CODE,img_PATH);

     else

     update img_tb t set t.img_path=img_path where t.img_code=img_code

     end if;

 

end loop;

commit;

  p_out:='1';

EXCEPTION

WHEN OTHERS THEN

p_out:='-1' || SQLERRM;

ROLLBACK;

END updateImagels;

 

第四步,java调用

public staticintupdateImgInfo(Connection con,List imageLs) {

                CallableStatement stmt = null;

                boolean backVal=false;

                try {

                    // con = pool.getConnection();

                    if (con != null) {

                        stmt = con.prepareCall("{call updateImagels(?,?)}");

                        ARRAY adArray = getOracleArray(con, "img_LIST",imageLs);

                        ((OracleCallableStatement) stmt).setARRAY(1, adArray);

                        stmt.registerOutParameter(2, java.sql.Types.INTEGER);

                        stmt.execute();

                    }

                } catch(Exception e) {

                    e.printStackTrace();

                } finally{

                    // pool.freeDBResource(con, stmt, null);

                }

                //TODO 返回值的获取

            }

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有