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