在java中调用存储过程和存储函数

存储过程:

查询某个员工的姓名 月薪 职位:

create or replace procedure queryempinfo(eno in number,

pename out varchar2,

psal out number,

pjob out varchar2)

as

begin

select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;

end;

存储函数:

--查询某个员工的年收入

create or replace function queryempincome(eno in number)

return number

as

--定义变量保存月薪和奖金

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;

JDBCUtils:

package demo;

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);

}

//DriverManager.registerDriver(driver)

}

public static Connection getConnection(){

try {

return DriverManager.getConnection(url, user, password);

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

/*

* 运行Java程序

* java -Xms100M -Xmx200M HelloWorld

*

* 技术方向:

* 1. 性能调优 ---> tomcat

* 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;// ----> java GC

}

}

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;

}

}

}

}

TestOracle:

package demo;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.ResultSet;

import oracle.jdbc.OracleCallableStatement;

import oracle.jdbc.OracleTypes;

import org.junit.Test;

public class TestOracle {

/*

* create or replace procedure queryempinfo(eno in number,

pename out varchar2,

psal out number,

pjob out varchar2)

*/

@Test

public void testProcedure(){

//{call [(,, ...)]}

String sql = "{call queryempinfo(?,?,?,?)}";

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.NUMBER);

call.registerOutParameter(4, OracleTypes.VARCHAR);

//执行

call.execute();

//取出结果

String name = call.getString(2);

double sal = call.getDouble(3);

String job = call.getString(4);

System.out.println(name+"\t"+sal+"\t"+job);

} catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.release(conn, call, null);

}

}

/*

* create or replace function queryempincome(eno in number)

return number

*/

@Test

public void testFunction(){

//{?= call [(,, ...)]}

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);

}

}

}

在out参数中使用光标

查询某个部门中的所有员工信息 ---> 返回集合

包头

CREATE OR REPLACE PACKAGE MYPAKCAGE AS

type empcursor is ref cursor;

procedure queryEmpList(dno in number, empList out empcursor);

END MYPAKCAGE;

包体

CREATE OR REPLACE PACKAGE BODY MYPAKCAGE AS

procedure queryEmpList(dno in number, empList out empcursor) AS

BEGIN

open empList for select * from emp where deptno=dno;

END queryEmpList;

END MYPAKCAGE;

java代码:

@Test

public void testCursor(){

String sql = "{call MYPAKCAGE.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");

double sal = rs.getDouble("sal");

System.out.println(name+"\t"+sal);

}

} catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.release(conn, call, rs);

}

}

光标在JDBCUtils.release(conn, call, rs);语句中被关闭。

java 执行oracle 存储过程_oracle--在java中调用存储过程和存储函数相关推荐

  1. mysql触发器调用存储过程出错_mysql 触发器中调用存储过程

    想要在MYSQL的触发器中调用存储过程,但是IDE提示: 0A000 Not allowed to return a result set from a trigger 触发器代码如下: DELIMI ...

  2. mysql 子sql中调用存储过程_mysql 子sql中调用存储过程

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. server使用abp中调用存储过程 sql_ASP调用sql server 存储过程详解-附带实例-

    ado文档对使用指定属性创建新的 Parameter 对象. 语法 Set parameter = command.CreateParameter (Name, Type, Direction, Si ...

  4. 在Java中调用存储过程

    本文阐述了怎么使用DBMS存储过程.我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是 ...

  5. java怎么调用存储函数_java中调用存储过程或存储函数的方法

    java中调用存储过程或存储函数的方法 1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{c ...

  6. ibatis mysql存储过程_分步详解 如何在iBatis中调用存储过程

    通过iBatis我们可以在数据库表中执行内嵌的insert , delete, update SQL命令.本文中你将看到如何在iBatis中调用存储过程. 我们使用MySQL数据库,并且使用和上一个例 ...

  7. c efcore.mysql_EF Core在mysql中调用存储过程

    EF Core在mysql中调用存储过程,博主找了很多,然而大多都是EF Core+SqlServer的或者EF Core+Oracle的,并没有正对Mysql的Pomelo驱动的,所以查找了一些资料 ...

  8. mysql存储过程queue_mysql – 在Sequelize中调用输入/输出类型存储过程

    我在 MySQL中创建了一个存储过程,它期望一些输入并返回一些输出. 要在MySQL中调用存储过程,我正在运行 CALL createCoupon(1236,321, @message); SELEC ...

  9. SQL存储过程中调用存储过程返回的表

    存储过程pro_A返回一个表集合TableA,在存储过程pro_B中以TableA为数据源再做一重过滤,想实现代码复用,因此原意是在存储过程pro_B中调用存储过程pro_A,但事实发现我们不能写成s ...

最新文章

  1. 大公司的前端开发地址
  2. 【Web安全】Web开发中常见的安全误区
  3. SqlService 数据操作
  4. 利用Diferencia和Java微服务进行分接比较测试
  5. 1 HBase 介绍
  6. fst java_java快速序列化库FST
  7. egg直接取req_Egg服务器基础功能
  8. 每天一个linux命令博客nano,11 个鲜为人知的 Linux 命令(1)
  9. PHP window2003服务和2008服务器上传个别文件访问报错
  10. SQL Server数据库培训实战视频教程(2天速成版)
  11. 代理模式---论坛权限控制代理
  12. 华为薪资等级结构表_2018华为等级工资表一览
  13. 集装箱号码识别技术在港口的应用
  14. 分布式系统统一身份认证
  15. 图像增强算法(持续更新中)
  16. 《静态时序分析实用方法》第七章翻译
  17. An attempt was made to call a method that does not exist. The attempt was ma
  18. TokenGazer《一问到底》第53期:研究员 vs Cocos-BCX
  19. 仿视频字幕弹幕网站Miko二次元动漫视频网站源码
  20. CTF--信息技术对抗赛ISCC之安卓逆向分析

热门文章

  1. slice 定义和用法
  2. 解决IE8不支持数组的indexOf方法
  3. Table边框使用总结
  4. [导入]写了个img2ppt的demo,为写PDF2PPT做准备
  5. 计算任意两个圆的交点
  6. HTTP 错误 403.6 - Forbidden 解决方案
  7. Linux下两种TCP网络服务器实现方式:循环服务并发服务
  8. SQL2005触发器和存储过程
  9. WPF and Silverlight 学习笔记(十九):WPF更换主题
  10. java零碎要点013---java lambda 表达式中的双冒号的用法 ::