1. oracle函数测试脚本

--两个参数的 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. 创建数据库表脚本

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类

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函数的代码

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