JAVA调用存储过程

来源:互联网 发布:网络侵犯著作权 编辑:程序博客网 时间:2024/04/29 17:20

有两种方式:

1、通过输出参数返回一个字符串(可以由多个输出参数,这里我们只演示一个的情况)

DB2过程:(只是示例,不要直接去运行,我没有时间去调试存储过程)

CREATE PROCEDURE test1
 (IN  V_IARG1 VARCHAR(40),
  IN V_IARG2 VARCHAR(20),
  IN V_IARG3 VARCHAR(20),
  OUT  V_ORET VARCHAR(40)
 )
  SPECIFIC test1
  LANGUAGE SQL
P1:BEGIN

    SET v_oret = '1';
    RETURN 0;

END P1

oracle类似上面,不再写了。

java方法:

    public String callProc(String procName, String[][] params) {
        log.debug(
"procName:" + procName);
        
for (int i = 0; params != null && i < params.length; i++{
            
if (params[i][1== null || params[i][1].equals("")
                    
|| params[i][1].equals("null")) {
                params[i][
1= "%";
            }

            log.debug(params[i][
1]);
        }

        
try {
            CallableStatement proc 
= null;
            Connection conn 
= null;
            conn 
= this.getSession().connection();
            
int index = procName.indexOf("?");
            procName 
= procName.substring(0, index) + "?,"
                    
+ procName.substring(index);
            proc 
= conn.prepareCall(procName);
            
int paramsNum = params.length;
            
for (int k = 0; k < paramsNum; k++{
                
if (params[k][0].equalsIgnoreCase("String")) {
                    proc.setString(k 
+ 1, params[k][1]);
                }
 else if (params[k][0].equalsIgnoreCase("Long")) {
                    proc.setLong(k 
+ 1, Long.parseLong(params[k][1]));
                }
 else if (params[k][0].equalsIgnoreCase("Integer")) {
                    proc.setInt(k 
+ 1, Integer.parseInt(params[k][1]));
                }
 else if (params[k][0].equalsIgnoreCase("BigDecimal")) {
                    proc.setBigDecimal(k 
+ 1new BigDecimal(params[k][1]));
                }

            }

            proc.registerOutParameter(paramsNum 
+ 1, Types.VARCHAR);
            proc.execute();
            
return proc.getString(paramsNum + 1);
        }
 catch (Exception e) {
            
throw new RuntimeException(e);
        }

    }

2、返回一个结果集(ResultSet)

db2等是直接获取结果集,但oracle不支持,必须用一个输出参数来获取结果集

db2过程示例:

CREATE PROCEDURE TEST2
 (IN V_ARG VARCHAR(40)
 )
  SPECIFIC TEST2
  DYNAMIC RESULT SETS 1
  LANGUAGE SQL
P1: BEGIN
    DECLARE OUT_CUR CURSOR WITH RETURN FOR
 SELECT *
 FROM TEST2_TABLE
 WHERE XXXXXXXX
 ORDER BY XXXXXX;
    OPEN OUT_CUR;
END P1

 

ORACLE示例:


CREATE OR REPLACE procedure TEST3(
    v_args1        IN VARCHAR2,--输入参数示例,如果你不需要,也可以不加
    my_cur OUT yy_db.V_CURSOR.V_CUR--输出参数,oracle跟其它数据库不同的地方,必须加输出参数,用游标返回结果集
    )
AS
  xxxxx 省略
begin
  
  V_RETSQL := ' select * from xxxxtable 省略';
  OPEN my_cur FOR V_RETSQL;

end TEST3;

 

JAVA调用方法:

 

public List callProcList(String procName, String[][] params) {
        log.debug(
"procName:" + procName);
        
for (int i = 0; params != null && i < params.length; i++{
            
if (params[i][1== null || params[i][1].equals("")
                    
|| params[i][1].equals("null")) {
                params[i][
1= "%";
            }

            log.debug(params[i][
1]);
        }

        List list 
= new ArrayList();
        ResultSet rs 
= null;
        
try {
            Connection conn 
= this.getSession().connection();
            
if (this.getSystemConfig().isOracle()) {
                
// conn.setAutoCommit(false);
                int index = procName.indexOf("?");
                procName 
= procName.substring(0, index) + "?,"
                        
+ procName.substring(index);
            }

            CallableStatement proc 
= conn.prepareCall(procName);
            
int paramsNum = params.length;
            
for (int k = 0; k < paramsNum; k++{
                
if (params[k][0].equalsIgnoreCase("String")) {
                    proc.setString(k 
+ 1, params[k][1]);
                }
 else if (params[k][0].equalsIgnoreCase("Long")) {
                    proc.setLong(k 
+ 1, Long.parseLong(params[k][1]));
                }
 else if (params[k][0].equalsIgnoreCase("Integer")) {
                    proc.setInt(k 
+ 1, Integer.parseInt(params[k][1]));
                }
 else if (params[k][0].equalsIgnoreCase("BigDecimal")) {
                    proc.setBigDecimal(k 
+ 1new BigDecimal(params[k][1]));
                }

            }


            
if (this.getSystemConfig().isOracle()) {
                proc.registerOutParameter(paramsNum 
+ 1, OracleTypes.CURSOR);
                proc.execute();
                rs 
= (ResultSet) proc.getObject(paramsNum + 1);
            }
 else {
                
boolean b = proc.execute();
                rs 
= proc.getResultSet();
            }

            
int columnNum = rs.getMetaData().getColumnCount();
            Object[] columnType 
= new Object[columnNum];
            
for (int i = 0; i < columnNum; i++{
                
// System.out.print(rs.getMetaData().getColumnType(i));
                
// System.out.println(rs.getMetaData().getColumnTypeName(i));
                columnType[i] = String.valueOf(rs.getMetaData().getColumnType(
                        i 
+ 1));
                
if (columnType[i].equals("3")) {
                    columnType[i] 
= "2";
                }

            }

            list.add(columnType);
            
while (rs.next()) {
                Object[] objArr 
= new Object[columnNum];
                
for (int i = 0; i < columnNum; i++{
                    objArr[i] 
= rs.getObject(i + 1);
                }

                list.add(objArr);
            }

            
for (int i = 0; log.isDebugEnabled() && i < list.size() && i < 100; i++{
                Object[] objArr 
= (Object[]) list.get(i);
                
for (int j = 0; j < objArr.length; j++{
                    
if (j != 0{
                        System.out.print(
",");
                    }

                    System.out.print(objArr[j]);
                }

                System.out.println();
            }

            
return list;
        }
 catch (Exception ex) {
            log.error(
"", ex);
            
throw new RuntimeException(ex);
        }

    }

 

 

 

调用示例:(以上两种类似)

   String proc = "{call TEST3(?,?,?,?,?,?)}";
   params = new String[6][2];
   params[0][0] = "String";
   params[0][1] = "123123";

   params[1][0] = "String";
       params[1][1] = userSession.getTransCompanyId();

   params[2][0] = "String";
   params[2][1] = String.valueOf(map.get("startRq")).replaceAll("-",
     "");
   params[3][0] = "String";
   params[3][1] = String.valueOf(map.get("endRq")).replaceAll("-", "");
   params[4][0] = "String";
   params[4][1] = String.valueOf(map.get("yylx"));
   params[5][0] = "String";
   params[5][1] = String.valueOf(map.get("tjjb"));

  .......以下省略

原创粉丝点击