最近想了解一下Oracle的存储过程,于是便在网上查找各种例子,终于弄明白了,在这里也把经验分享一下,望各位指教!
创建一张用于存储过程的表:
CREATE TABLE T_TEST(
I_ID VARCHAR2(20),
I_NAME VARCHAR2(20)
)
一、无返回参数存储过程示例
1.创建无返回参数的存储过程CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)
AS
BEGIN
INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
2.编写java调用代码
package com.sxt.servlet.upload;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* oracle 调用存储过程
*
* @author Mr.hu
* @date 2018/01/15 下午14:23:25
*
*/
public class Test1 {
public static void main(String[] args) throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL";
String username = "PERSONNEL_MANAGE";
String password = "root";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
CallableStatement proc = null; // 创建执行存储过程的对象
try {
// 加载驱动
Class.forName(driver);
// 获取连接
conn = DriverManager.getConnection(strUrl, username, password);
proc = conn.prepareCall("{ call "+username+".TESTA(?,?) }"); // 设置存储过程// call为关键字.
// 设置输入参数
proc.setString(1, "101"); // 设置第一个输入参数
proc.setString(2, "testOne");
proc.execute();// 执行
System.out.println("完成-----");
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
}
二、有返回参数的存储过程(非列表)
1. 创建有返回参数的存储过程
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)
AS
BEGIN
SELECT I_NAME INTO PARA2 FROM T_TEST WHERE I_ID= PARA1;
END TESTB;
2.编写java调用代码
package com.sxt.servlet.upload;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Types;
/**
* oracle 调用存储过程
*
* @author Mr.hu
* @date 2018/01/15 下午14:23:25
*
*/
public class Test2 {
public static void main(String[] args) throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL";
String username = "PERSONNEL_MANAGE";
String password = "root";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
CallableStatement proc = null; // 创建执行存储过程的对象
try {
// 加载驱动
Class.forName(driver);
// 获取连接
conn = DriverManager.getConnection(strUrl, username, password);
proc = conn.prepareCall("{ call "+username+".TESTB(?,?) }"); // 设置存储过程// call为关键字.
// 设置输入参数
proc.setString(1, "100"); // 设置第一个输入参数
proc.registerOutParameter(2,Types.VARCHAR);
proc.execute();// 执行
String testPrint = proc.getString(2);
System.out.println("=testPrint=is="+testPrint);
System.out.println("完成-----");
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
}
三、有返回值得存储过程(列表)
1.创建存储过程
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
在SQL*PLUS中建一个程序包:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
创建带反回值列表的存储过程:
create or replace procedure TESTC(cur_ref out TESTPACKAGE.Test_CURSOR) is
begin
OPEN cur_ref FOR SELECT * FROM T_TEST;
end TESTC;
2.java调用存储过程示例
package com.sxt.servlet.upload;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import oracle.jdbc.OracleTypes;
/**
* oracle 调用存储过程
*
* @author Mr.hu
* @date 2018/01/15 下午14:23:25
*
*/
public class Test3 {
public static void main(String[] args) throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL";
String username = "PERSONNEL_MANAGE";
String password = "root";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement proc = null; // 创建执行存储过程的对象
try {
// 加载驱动
Class.forName(driver);
// 获取连接
conn = DriverManager.getConnection(strUrl, username, password);
proc = conn.prepareCall("{ call "+username+".TESTC(?) }"); // 设置存储过程// call为关键字.
// 设置输入参数
proc.registerOutParameter(1,OracleTypes.CURSOR); // 设置第一个输入参数
proc.execute();// 执行
rs = (ResultSet) proc.getObject(1);
while (rs.next()) {
System.out.println("T_ID:"+rs.getString(1));
System.out.println("T_NAME:"+rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
}
3.输出为:
T_ID:100
T_NAME:testOne1
T_ID:101
T_NAME:testOne2
至此:存储过程的简单应用也就结束了,我自己在写一便的时候也是豁然开朗,大家有什么问题可以评论,相互探讨!