oracle带不同参数个数的函数测试


1. oracle函数测试脚本

View Code
--两个参数的
create or replace function searchStuInfoWith2Param(bonus number ,address varchar2)
 return number
 is
  totalSalaryVal number;
  taddress varchar2(70);
  tbonus number;
begin
  taddress := ''||address||'%';
  tbonus :=bonus;
 select  sum(BASESALARY)  into totalSalaryVal  from JK_TESTPROC where BONUS > tbonus and  ADDRESS like taddress;

  return(totalSalaryVal);
end searchStuInfoWith2Param;

-- 一个参数的
create or replace function searchStuInfo(s_stuNo number)
 return number
 is
  baseSalaryVal number;
begin
 select  BASESALARY  into baseSalaryVal  from JK_TESTPROC where ID=s_stuNo;

  return(baseSalaryVal);
end searchStuInfo;

--无参数的

create or replace function searchStuTotalSalary
 return number
 is
  totalSalaryVal number;
begin
 select  sum(BASESALARY)  into totalSalaryVal  from JK_TESTPROC;

  return(totalSalaryVal);
end searchStuTotalSalary;

create or replace function TestDateFunction(date_ in  DATE,address varchar2)
return number 

 is
 bonus number;
 taddress varchar2(70);

begin
  taddress := ''||address||'%';
  select BONUS into BONUS from JK_TESTPROC where BIRTHDATE < date_ and  ADDRESS like taddress;
  return bonus;
end TestDateFunction;

2. 创建数据库表脚本

View Code
prompt PL/SQL Developer import file
prompt Created on 2012年10月17日星期三 by Administrator
set feedback off
set define off
prompt Creating JK_TESTPROC...
create table JK_TESTPROC
(
  ID         NUMBER default 0 not null,
  NAME       VARCHAR2(20) not null,
  BASESALARY NUMBER(10,2),
  BONUS      NUMBER(7,2),
  ADDRESS    VARCHAR2(60)
)
tablespace INCOME
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

prompt Disabling triggers for JK_TESTPROC...
alter table JK_TESTPROC disable all triggers;
prompt Loading JK_TESTPROC...
insert into JK_TESTPROC (ID, NAME, BASESALARY, BONUS, ADDRESS)
values (101, '张三丰', 90000.02, 6000, '济南历下');
insert into JK_TESTPROC (ID, NAME, BASESALARY, BONUS, ADDRESS)
values (102, '殷素素', 80000.09, 7000, '北京海淀上地东路');
insert into JK_TESTPROC (ID, NAME, BASESALARY, BONUS, ADDRESS)
values (103, '张无忌', 202900, 10000, '济南槐荫');
insert into JK_TESTPROC (ID, NAME, BASESALARY, BONUS, ADDRESS)
values (104, '赵敏', 309090.7, 16000, '北京朝阳区');
commit;
prompt 4 records loaded
prompt Enabling triggers for JK_TESTPROC...
alter table JK_TESTPROC enable all triggers;
set feedback on
set define on
prompt Done.

3. 测试oracle函数的java类

View Code
package test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.revenue.base.dao.AbstractDAO;

public class TestOracleFunction {

    public TestOracleFunction() {

    }
    public static double callFunctionDouble(final String name, final List<Object> values) {
        String driver = "oracle.jdbc.driver.OracleDriver";

        String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl ";
        
        CallableStatement cstm = null;
        double result = 0;

        // conn.setAutoCommit(false);
        try {
            Class.forName(driver);
            Connection connection = DriverManager.getConnection(strUrl, "income", "income");
            String sql = "{  ? = call " + name + " }";
            cstm = connection.prepareCall(sql);
            // cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.BOOLEAN);

            // 返回int
            cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.DOUBLE);

            if(values!=null && values.size()>0){
                Iterator<Object> iterator = values.iterator();
                
                for (int i = 2; iterator.hasNext(); i++) {
                    Object value = iterator.next();
                    if (value.getClass().getName().equals("java.util.Date")) {
                        cstm.setDate(i, new java.sql.Date(((java.util.Date) value).getTime()));
                    }
                    if (value.getClass().getName().equals("java.lang.String")) {
                        cstm.setString(i, (java.lang.String) value);
                    }
                    if (value.getClass().getName().equals("java.lang.Integer")) {
                        cstm.setInt(i, (java.lang.Integer) value);
                        
                    }if (value.getClass().getName().equals("java.lang.Long")) {
                        cstm.setLong(i, (java.lang.Long) value);
                        
                    }if (value.getClass().getName().equals("java.lang.Double")) {
                        cstm.setDouble(i, (java.lang.Double) value);
                    }
                }
            }

            cstm.execute();
            result = cstm.getDouble(1);
            System.out.println("result   **********   = "+result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public static void main(String[] args) {
        
        /*
         //没有参数的情况 
        List values = new ArrayList();
        double result = callFunctionDouble("searchStuTotalSalary",values);
        
        */
        
        /*
         //一个参数的情况 
         List values = new ArrayList();
        values.add(104);
        double result = callFunctionDouble("searchStuInfo(?)",values);*/
        
        //两个参数的情况 
        List values = new ArrayList();
        values.add(new Double(7000.0));
        values.add(new String("济南"));
        double result = callFunctionDouble("searchStuInfoWith2Param(?,?)",values);
        
        System.out.println("^^^^^^^^^^^="+result);
                
    }
}

4. java调用oracle函数的代码

View Code
package com.wanggd.base.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.wanggd.base.exceptions.GeneralException;


@Repository
public class AbstractDAO extends HibernateDaoSupport {
    private SessionFactory mySessionFacotry;

    /**
     * 调用oracle function,返回值
     * 
     * @param functionName
     *            function名称,如PKG_JK_DYNAMICS.fetch_
     * @param values
     *            参数值的数组,如[Date,String,Long等等]这样对象的数组
     * @return function的返回值
     */
    public boolean callFunctionBoolean(final String functionName, final List<Object> values) {

        return this.callFunctionInt(functionName, values) == 1 ? true : false;
    }

    /**
     * 调用oracle function,返回值
     * 
     * @param functionName
     *            function名称,如PKG_JK_DYNAMICS.fetch_
     * @param values
     *            参数值的数组,如[Date,String,Long等等]这样对象的数组
     * @return function的返回值
     */
    public int callFunctionInt(final String name, final List<Object> values) {
        Connection connection = this.getSession().connection();
        CallableStatement cstm = null;
        int result = 0;

        // conn.setAutoCommit(false);
        try {
            String sql = "{  ? = call " + name + " }";
            cstm = connection.prepareCall(sql);
            // cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.BOOLEAN);

            // 返回int
            cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.INTEGER);

            Iterator<Object> iterator = values.iterator();
            for (int i = 2; iterator.hasNext(); i++) {
                Object value = iterator.next();
                if (value.getClass().getName().equals("java.util.Date")) {
                    cstm.setDate(i, new java.sql.Date(((java.util.Date) value).getTime()));
                }
                if (value.getClass().getName().equals("java.lang.String")) {
                    cstm.setString(i, (java.lang.String) value);
                }
                if (value.getClass().getName().equals("java.lang.Integer")) {
                    cstm.setInt(i, (java.lang.Integer) value);
                }
            }

            cstm.execute();
            result = cstm.getInt(0);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 调用oracle function,返回值
     * 
     * @param functionName
     *            function名称,如PKG_JK_DYNAMICS.fetch_
     * @param values
     *            参数值的数组,如[Date,String,Long等等]这样对象的数组
     * @return function的返回值
     */
    public double callFunctionDouble(final String name, final List<Object> values) {
        Connection connection = this.getSession().connection();
        CallableStatement cstm = null;
        double result = 0;

        // conn.setAutoCommit(false);
        try {
            String sql = "{  ? = call " + name + " }";
            cstm = connection.prepareCall(sql);
            // cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.BOOLEAN);

            // 返回int
            cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.DOUBLE);

            Iterator<Object> iterator = values.iterator();
            for (int i = 2; iterator.hasNext(); i++) {
                Object value = iterator.next();
                if (value.getClass().getName().equals("java.util.Date")) {
                    cstm.setDate(i, new java.sql.Date(((java.util.Date) value).getTime()));
                }
                if (value.getClass().getName().equals("java.lang.String")) {
                    cstm.setString(i, (java.lang.String) value);
                }
                if (value.getClass().getName().equals("java.lang.Integer")) {
                    cstm.setInt(i, (java.lang.Integer) value);
                    
                }if (value.getClass().getName().equals("java.lang.Long")) {
                    cstm.setLong(i, (java.lang.Long) value);
                }
            }

            cstm.execute();
            result = cstm.getDouble(1);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }


    public void callProcedure(final String procedure) {
        getHibernateTemplate().execute(new HibernateCallback<Object>() {
            public Object doInHibernate(Session arg0) throws HibernateException, SQLException {
                Connection conn = arg0.connection();
                CallableStatement st = conn.prepareCall(procedure);
                return st.executeUpdate();
            }
        });

    }


    public void callProcedure(final String name, final List<Object> values) {
        Connection connection = this.getSession().connection();
        CallableStatement cstm = null;

        // conn.setAutoCommit(false);
        try {
            String sql = "{   call " + name + " }";
            cstm = connection.prepareCall(sql);
            // cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.BOOLEAN);

            // 返回int
            cstm.registerOutParameter(1, oracle.jdbc.OracleTypes.INTEGER);

            Iterator<Object> iterator = values.iterator();
            for (int i = 2; iterator.hasNext(); i++) {
                Object value = iterator.next();
                if (value.getClass().getName().equals("java.util.Date")) {
                    cstm.setDate(i, new java.sql.Date(((java.util.Date) value).getTime()));
                }
                if (value.getClass().getName().equals("java.lang.String")) {
                    cstm.setString(i, (java.lang.String) value);
                }
                if (value.getClass().getName().equals("java.lang.Integer")) {
                    cstm.setInt(i, (java.lang.Integer) value);
                }
            }

            cstm.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    public List<?> executeSQLQuery(final String sql) throws GeneralException {
        return this.getHibernateTemplate().executeFind(new HibernateCallback<Object>() {
            public Object doInHibernate(Session arg0) throws HibernateException, SQLException {
                List<?> ls = new ArrayList<Object>();
                return ls = arg0.createSQLQuery(sql).list();
            }
        });
    }

    @PostConstruct
    public void injectSessionFactory() {
        super.setSessionFactory(mySessionFacotry);
    }

    @Autowired
    @Qualifier("incomeSessionFactory")
    public void setMySessionFacotry(SessionFactory sessionFacotry) {
        this.mySessionFacotry = sessionFacotry;
    }
}

欢迎转载,转载时务必注明出处: http://www.cnblogs.com/wanggd

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM