1、创建存储过程的语句:
1、表结构:
①:create table TESTA
(
A_ID VARCHAR2(10) not null,
A_NAME VARCHAR2(10)
)
2、存储过程:
①:create or replace procedure proc_testA(para1 in varchar2, para2 in varchar2) as
begin
insert into testA(a_id, a_Name) values (para1, para2);
end proc_testA;
②:create or replace procedure proc_testA2(para1 in varchar2, para2 out varchar2) as
begin
select a_name into para2 from testA where a_id = para1;
end proc_testA2;
③:create or replace procedure proc_testA3(
p_cursor out pack_testa.testa_cursor
) is
begin
open p_cursor for select * from Testa;
end proc_testa3;
3、Package:
①:create or replace package pack_testA as
type
testa_cursor is ref cursor;
end pack_testA;
4、说明:
①:由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,
列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
第一创建程序包Package,第二创建存储过程。
②:在程序中获取存储过程的输出参数,需通过CallableStatement对象的registerOutParameter(int,int)方法
获取。方法的参数①对应存储过程的out参数的位置,从1开始;方法的参数二对应存储过程的out参数的声明类型。
2、测试类TestProceDure.java
/**
* @包名 :com.andy.procedureDemo<br>
* @文件名 :TestProceDure.java<br>
* @类描述 :<br>
* @作者 :Andy.wang<br>
* @创建时间 :2014-10-11下午03:42:16<br>
* @更改人 :<br>
* @更改时间 :<br>
*/
package com.andy.procedureDemo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.OracleTypes;
/**
* @包名 :com.andy.procedureDemo<br>
* @文件名 :TestProceDure.java<br>
* @类描述 :测试Java调用存储过程<br>
* @作者 :Andy.wang<br>
* @创建时间 :2014-10-11下午03:42:16<br>
* @更改人 :<br>
* @更改时间 :<br>
*/
public class TestProceDure {
private static String driver = "oracle.jdbc.driver.OracleDriver";
private static String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private static String dbName = "test";
private static String dbPwd = "1";
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
private CallableStatement cstmt = null;
private String sql = null;
private void closeResource() {
try {
if (null != rs) {
rs.close();
}
if (null != ps) {
ps.close();
}
if (null != conn) {
conn.close();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
*
* @方法名 :testProcdDure1<br>
* @方法描述 :测试 无返回值的存储过程<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-10-11下午03:47:11 <br>
* 返回类型 :void
*/
private void testProcdDure1() {
try {
conn = DriverManager.getConnection(dbUrl, dbName, dbPwd);
sql = "{ call proc_testA(?,?)}";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, "10");
cstmt.setString(2, "Grvin");
boolean b = cstmt.execute();
System.out.println("b = " + b);// 执行成功,但返回值为false
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource();
}
}
/**
*
* @方法名 :testProcdDure2<br>
* @方法描述 :测试 有返回值的存储过程<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-10-11下午03:58:42 <br>
* 返回类型 :void
*/
private void testProcdDure2() {
try {
conn = DriverManager.getConnection(dbUrl, dbName, dbPwd);
sql = "{ call proc_testA2(?,?)}";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, "100");
cstmt.registerOutParameter(2, Types.VARCHAR);
boolean b = cstmt.execute();
System.out.println("b = " + b);// 执行成功,但返回值为false
String name = cstmt.getString(2);// 这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的
System.out.println("返回值:" + name);
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource();
}
}
/**
*
* @方法名 :testProcdDure3<br>
* @方法描述 :测试 有返回值,且返回值为“列表”的存储过程<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-10-11下午04:03:41 <br>
* 返回类型 :void
*/
private void testProcdDure3() {
try {
conn = DriverManager.getConnection(dbUrl, dbName, dbPwd);
sql = "{ call proc_testA3(?)}";
cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1, OracleTypes.CURSOR);// 以“列表”形式输出
boolean b = cstmt.execute();
System.out.println("b = " + b);// 执行成功,但返回值为false
rs = (ResultSet) cstmt.getObject(1);
while (rs.next()) {
System.out.println("id = " + rs.getString(1) + "; name = "
+ rs.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource();
}
}
public static void main(String[] args) {
new TestProceDure().testProcdDure1();
new TestProceDure().testProcdDure2();
new TestProceDure().testProcdDure3();
}
}
来源:oschina
链接:https://my.oschina.net/u/1252840/blog/326847