您的位置:首页 > 编程语言 > Java开发

java调用存储过程

2017-10-28 12:20 363 查看
案例一

无返回值过程

创建一个book表,可以往表中插入数据,使用java来调用这个过程。

1.创建一个表book

create table book (bookid number(20),bookname varchar2(40),cbs varchar2(40));

2.编写过程

 --in 表示这是一个输入的参数,默认是in

-- out 表示一个输出参数

create or replace procedure hfc_hfc(bookid in number,

bookname in varchar2,cbs in varchar2)is

begin

  insert into book values (bookid,bookname,cbs);

  end;

 

 

--这里调用时要在java里调用

 

 

 

 

 

 

 

有返回值的存储过程:(非列表)

再看如何处理返回值的存储过程:

案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。

案例2

--有输入和输出的存储过程,有返回值。

--输入员工的编号,返回员工的姓名

create or replace procedure hfc_a (srno in number,scname out varchar2)is

begin

  select ename into scname from emp where empno=srno;

  end;

 

--输出操作在java程序中进行取出。

案例扩展:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资、和岗位。

 

案例3

--有输入和输出的存储过程,有返回值。

--输入员工的编号,返回员工的姓名,工资,职位。

 --输入员工的编号,返回员工的姓名,工资,岗位

create or replace procedure hfc_a (srno in number,

scname out varchar2,scsal out number,scjob out varchar2)is

begin

  select ename,sal,job into scname,scsal,scjob from emp where empno=srno;

  end;

 

 

--输出操作在java程序中进行取出。

 

使用java来调用过程操作。

package com;

 

import java.rmi.activation.ActivationGroupDesc.CommandEnvironment;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

public class test1 {

//调用存储过程

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

//加载驱动

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl",
"scott",
"tiger");

// 案例1

//调用存储过程CallableStatement

//CallableStatement cst=ct.prepareCall("{call hfc_hfc(?,?,?)}");

//赋值

        //cst.setInt(1, 10);

//cst.setString(2, "天下无敌");

        //cst.setString(3, "北京人民出版社");

//案例2

//调用存储过程CallableStatement

CallableStatement cs=ct.prepareCall("{call hfc_a(?,?)}");

//扩展

CallableStatement cst=ct.prepareCall("{call hfc_a(?,?,?,?)}");

//输入值

cs.setInt(1, 7788);

//输出值

cs.registerOutParameter(2, oracle.jdbc.oracleTypes.varchar);

//扩展

cs.registerOutParameter(3, oracle.jdbc.oracleTypes.double);

cs.registerOutParameter(4, oracle.jdbc.oracleTypes.varchar);

//执行

//cst.execute();

cs.close();

//取出返回值,注意?的顺序

String name=cs.getString(2);

//扩展

String sal=cs.getString(3);

String job=cs.getString(4);

//接收输出的值

System.out.print("7788的名字是"+name+job+sal);

//关闭资源

//cst.close();

cs.close();

ct.close();

} catch (Exception e) {

// TODO: handle exception

}

 

}

 

}

 

 

 

有返回值的存储过程(列表[结果集])。返回结果集

案例4:编写一个过程,输入部门号,返回该部门所有雇员的信息。

对该题进行分析:

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来代替代,列表同样也不例外,但是由于是集合,所有不能用一般参数,必须使用package
所有要分两部分。

1. 建立一个包:(定义一个游标类型的游标)

Create or replace package test_package as type test_cursor is
ref cursor;//游标

End test_package;

 

 

 

 

 

 

2. java调用过程

package com;

 

import java.security.interfaces.RSAKey;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

 

import javax.naming.spi.DirStateFactory.Result;

 

public class test2 {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

//加载驱动

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl",
"scott",
"tiger");

//创建CallableStatement

CallableStatement cs=ct.prepareCall("{call hfc_a(?,?)}");

//给?赋值

cs.setInt(1, 20);

//注册一个?

cs.registerOutParameter(2, oracle.jdbc.oracleType.cursor);

cs.execute();

//得到结果集

ResultSet rs=(ResultSet)cs.getObject(2);

//循环输出

while(rs.next()){

System.out.print(rs.getInt(1)+"  "+rs.getInt(2)+"   "+rs.getInt(3));

}

//关闭资源

rs.close();

cs.close();

} catch (Exception e) {

e.printStackTrace();

// TODO: handle exception

}

 

}

 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: