1、存储过程
@H_301_5@
1.1、准备sql
--定义存储过程
createorreplaceprocedureget_rax(salaryinnumber,raxoutnumber)
as
--需要交税的钱
balnumber;
begin
bal:=salary-3500;
ifbal<=1500then
rax:=bal*0.03-0;
elsifbal<=4500then
rax:=bal*0.1-105;
elsifbal<=9000then
rax:=bal*0.2-555;
elsifbal<=35000then
rax:=bal*0.25-1005;
elsifbal<=55000then
rax:=bal*0.3-2755;
elsifbal<=80000then
rax:=bal*0.35-5505;
else
rax:=bal*0.45-13505;
endif;
end;
/
setserveroutputon;
--调用存储过程
declare
salnumber:=&salary;
raxnumber;
begin
get_rax(sal,rax);
dbms_output.put_line(sal||'元工资应该交税'||rax||'元');
end;
/
1.2、准备JAR包
oracle |
ojdbc5.jar |
c3p0 |
c3p0-0.9.1.2.jar c3p0-config.xml |
c3p0-config.xml
<c3p0-config> <default-config> <propertyname="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <propertyname="driverClass">oracle.jdbc.driver.OracleDriver</property> <propertyname="user">scott</property> <propertyname="password">tiger</property> <propertyname="initialPoolSize">3</property> <propertyname="maxPoolSize">6</property> <propertyname="maxIdleTime">1000</property> </default-config> </c3p0-config>
1.3、编写工具类
JDBCUtils.java
packagecom.rk.utils; importjava.sql.Connection; importcom.mchange.v2.c3p0.ComboPooledDataSource; publicclassJDBCUtils{ privatestaticComboPooledDataSourcedataSource=newComboPooledDataSource(); publicstaticConnectiongetConnection()throwsException{ returndataSource.getConnection(); } publicstaticvoidcloseQuietly(AutoCloseableac){ if(ac!=null){ try{ ac.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
1.4、JDBC程序调用存储过程
CallProc.java
packagecom.rk.test; importjava.sql.CallableStatement; importjava.sql.Connection; importjava.sql.Types; importcom.rk.utils.JDBCUtils; /** *演示java-jdbc调用oracle过程 */ publicclassCallProc{ publicstaticvoidmain(String[]args)throwsException{ Stringsql="{callget_rax(?,?)}"; Connectionconn=JDBCUtils.getConnection(); CallableStatementcstmt=conn.prepareCall(sql); //为第一个?号设置值,从1开始 cstmt.setInt(1,7000); //为第二个?注册输出类型 cstmt.registerOutParameter(2,Types.INTEGER); //执行调用过程 cstmt.execute(); //接收过程的返回值,即第二个?号 intrax=cstmt.getInt(2); //显示 System.out.println("7000元工资应该交税"+rax+"元"); JDBCUtils.closeQuietly(cstmt); JDBCUtils.closeQuietly(conn); } }
2、存储函数@H_301_5@
2.1、准备sql
--定义函数
createorreplacefunctionfindEmpNameAndJobAndSal(pempnoinnumber,pjoboutvarchar2,psaloutnumber)
returnvarchar2
as
penameemp.ename%type;
begin
selectename,job,salintopename,pjob,psalfromempwhereempno=pempno;
returnpename;
end;
/
--调用函数
declare
penameemp.ename%type;
pjobemp.job%type;
psalemp.sal%type;
begin
pename:=findEmpNameAndJobAndSal(7788,psal);
dbms_output.put_line('7788'||'--'||pename||'--'||pjob||'--'||psal);
end;
/
2.2、JDBC程序调用存储函数
packagecom.rk.test; importjava.sql.CallableStatement; importjava.sql.Connection; importjava.sql.Types; importcom.rk.utils.JDBCUtils; /** *演示java-jdbc调用oracle函数 */ publicclassCallFunc{ publicstaticvoidmain(String[]args)throwsException{ Stringsql="{?=callfindEmpNameAndJobAndSal(?,?,?)}"; Connectionconn=JDBCUtils.getConnection(); CallableStatementcstmt=conn.prepareCall(sql); //为第一个?注册输出类型 cstmt.registerOutParameter(1,Types.VARCHAR); //为第二个?注入值 cstmt.setInt(2,7788); //为第三个?注册输出类型 cstmt.registerOutParameter(3,Types.VARCHAR); //为第四个?注册输出类型 cstmt.registerOutParameter(4,Types.INTEGER); //执行函数调用 cstmt.execute(); //分别获取1,3,4占位符的值 Stringename=cstmt.getString(1); Stringjob=cstmt.getString(3); intsal=cstmt.getInt(4); //显示 System.out.println("7788--"+ename+"--"+job+"--"+sal); JDBCUtils.closeQuietly(cstmt); JDBCUtils.closeQuietly(conn); } }