在Java语言中调用存储过程、存储函数、包头、包体
来源:互联网 发布:按键精灵调用js 编辑:程序博客网 时间:2024/05/02 01:17
需要拷贝连接Oracle的jar包,路径如下图所示:
连接Oracle数据库的代码:
package demo.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@192.168.56.101:1521:orcl";private static String user = "scott";private static String password = "tiger";static{try {Class.forName(driver);} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError(e);}}public static Connection getConnection(){try {return DriverManager.getConnection(url, user, password);} catch (SQLException e) {e.printStackTrace();}return null;}/* * 运行Java程序 * java -Xms100M -Xmx200M HellWorld * * 技术方向: * 1. 性能调优 * 2. 故障诊断: 死锁 */public static void release(Connection conn,Statement st,ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;//why? --> Java GC,让Java的垃圾回收器回收,我们是不能控制垃圾回收器的,即使我们调用了System.gc(),也是不能立即回收的,Java的垃圾回收器是不可控的。}}if(st != null){try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}Java GC,让Java的垃圾回收器回收,我们是不能控制垃圾回收器的,即使我们调用了System.gc(),也是不能立即回收的,Java的垃圾回收器是不可控的。System.gc()只是请求jvm回收。
测试的代码:
分别是在Java语言中调用存储过程、在Java语言中调用存储函数、在Java语言中调用包头和包体。
--查询某个员工的姓名 职位和月薪/*思考:1. out参数太多???2. 查询某个部门中所有员工的所有信息*/create or replace procedure queryEmpInfoma(eno in number, pename out varchar2, pjob out varchar2, psal out number)asbegin select ename,empjob,sal into pename,pjob,psal from emp where empno=eno;end;/
--查询某个员工的年收入create or replace function queryEmpIncome(eno in number)return numberas --定义变量保存月薪和奖金 psal emp.sal%type; pcomm emp.comm%type;begin select sal,comm into psal,pcomm from emp where empno=eno; --返回年收入 return psal*12+nvl(pcomm,0);end;/declare income number;beginincome:=queryEmpIncome(7369);dbms_output.put_line(income);end;/
查询某个部门中所有员工的所有信息包头CREATE OR REPLACE PACKAGE MYPACKAGE AS type empcursor is ref cursor; procedure queryEmpList(dno in number,empList out empcursor);END MYPACKAGE;包体CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS procedure queryEmpList(dno in number,empList out empcursor) AS BEGIN open empList for select * from emp where deptno=dno; END queryEmpList;END MYPACKAGE;
package demo.oracle;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;import org.junit.Test;import demo.utils.JDBCUtils;/* * 思考 * 1. 光标close了吗?关闭了,光标是通过call得到的,而call是通过conn得到的,所以conn关闭了,那么光标就关闭了 * 2. 下面的代码能在mysql上运行吗?不能,实际和理论总是有差别的。 */public class TestOracle {/* * create or replace procedure queryEmpInfo(eno in number, pename out varchar2, pjob out varchar2, psal out number) */@Testpublic void tesProcedure(){// {call <procedure-name>[(<arg1>,<arg2>, ...)]}String sql = "{call queryEmpInfoma(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);//对于in参数,赋值call.setInt(1, 7839);//对于out参数,申明call.registerOutParameter(2, OracleTypes.VARCHAR);call.registerOutParameter(3, OracleTypes.VARCHAR);call.registerOutParameter(4, OracleTypes.NUMBER);//执行call.execute();//取出结果String name = call.getString(2);String job = call.getString(3);double sal = call.getDouble(4);System.out.println(name);System.out.println(job);System.out.println(sal);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}/* * create or replace function queryEmpIncome(eno in number)return number */@Testpublic void tesFunction(){//{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}String sql = "{?=call queryEmpIncome(?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);//对于out参数,申明call.registerOutParameter(1, OracleTypes.NUMBER);//对于in参数,赋值call.setInt(2, 7839);//执行call.execute();//取出结果double income = call.getDouble(1);System.out.println(income);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}@Testpublic void testCursor(){String sql = "{call MYPACKAGE.queryEmpList(?,?)}";Connection conn = null;CallableStatement call = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);//对于in参数,赋值call.setInt(1,20);//对于out参数,申明call.registerOutParameter(2, OracleTypes.CURSOR);//执行call.execute();//取出结果rs = ((OracleCallableStatement)call).getCursor(2);while(rs.next()){String name = rs.getString("ename");String job = rs.getString("job");double sal = rs.getDouble("sal");System.out.println(name+"\t"+job+"\t"+sal);}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, rs);}}}
0 0
- 在Java语言中调用存储过程、存储函数、包头、包体
- 【存储过程】在java语言中调用存储函数
- 在java应用程序下调用存储函数,存储过程,包
- 【存储过程】 在java语言中调用存储过程
- 在java语言中调用存储过程
- 在java语言中调用存储函数
- oracle--在java中调用存储过程和存储函数
- 在java语言中访问存储过程和存储函数
- Java中调用数据库的存储过程存储函数和包体
- Java中调用存储过程或函数
- java中调用存储过程或函数
- java中调用存储过程或函数
- 在应用程序中调用Oracle存储过程和存储函数
- 在Java中怎么调用存储过程
- 在Java中调用存储过程(详细)
- 在java中调用mysql存储过程
- 在java中调用Oracle存储过程
- 在java中调用Oracle存储过程
- 阅读人生-《世界因你不同—李开复自传》里的话
- Hive创建外部表以及分区
- UIViewContentMode各类型效果
- 从调用暴风影音放片说起
- [Spring3.x] 第 15 章 Spring MVC : 第 四 篇 业务层及 web 层技术开发
- 在Java语言中调用存储过程、存储函数、包头、包体
- 待机唤醒及一些调试处理
- UVa401 回文词
- 【转载】ACM感悟
- Ubuntu 14.04 安装配置 cairo-dock 实现美化+特效
- 总结一下web backend技术(2015年1月)
- leetcode-Word Ladder II
- 关于正则表达式的先行断言(lookahead)和后行断言(lookbehind)的理解
- TimesTen手动主备切换(ASP模式)[TimesTen运维基础]