Java 调用Oracle的存储过程

﹥>﹥吖頭↗ 提交于 2021-02-13 23:36:47

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

}



最后感谢“ 鹰翔宇空”,本文出自“ http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!