`
沙漠绿树
  • 浏览: 429478 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java调用存储过程举例

阅读更多

Java调用oracle存储过程的示例总结如下。

一、无返回值的存储过程

存储过程为:

create or replace procedure adddept
	(deptno number,dname varchar2,loc varchar2)
as

begin
	insert into dept values(deptno,dname,loc);
end;

Java调用代码:

public class TestProcedure {
	
	Connection conn=null ;
	CallableStatement cstmt=null ;

	String url="jdbc:oracle:thin:@localhost:1521:mydb";
	String driver="oracle.jdbc.driver.OracleDriver";
	String name="";
	
	public TestProcedure() {
		try {
			Class.forName(driver);
			conn=DriverManager.getConnection(url,"scott","tiger");
			cstmt=conn.prepareCall("{call adddept(?,?,?)}");
			cstmt.setInt(1,13);
			cstmt.setString(2,"间谍部2");
			cstmt.setString(3,"ningbo2");
			cstmt.executeUpdate(); 

			System.out.println("success");
		}
		catch (Exception e){
			e.printStackTrace();
		}
		finally{
			cstmt.close();
			conn.close();
		}
	}
}

注:dept表为oracle数据库方案scott中的一个表


二、有返回值的存储过程(返回非列表类型值)

存储过程为:

create or replace procedure testb
	(para1 in varchar2,para2 out varchar2) 
as

begin 
	select into para2 from testtb where i_id= para1; 
end;

Java调用代码:

public class TestProcedureTWO {
	public TestProcedureTWO() {
	
	}
	
	public static void main(String[] args ){
		
		String driver = "oracle.jdbc.driver.OracleDriver";
		String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";		
		ResultSet rs = null;
		Connection conn = null;
		CallableStatement proc = null;
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");			
			proc = conn.prepareCall("{call HYQ.TESTB(?,?)}");
			proc.setString(1, "100");
			proc.registerOutParameter(2, Types.VARCHAR);
			proc.execute();
			String testPrint = proc.getString(2);
			System.out.println("=testPrint=is="+testPrint);
		}
		catch (SQLException ex2) {
			ex2.printStackTrace();
		}
		catch (Exception ex2) {
			ex2.printStackTrace();
		}
		finally{
			try {
				if(rs != null){

					rs.close();

					if(proc!=null){
						proc.close();
					}
					if(conn!=null){
						conn.close();
					}
				}
			}
			catch (SQLException ex1) {
				ex1..printStackTrace();
			}
		}
	}
}


注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。



三、有返回值的存储过程(返回列表类型值)

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

1.建一个程序包的包头(声明)。如下:

create or replace package testpackage 
is
	type test_cursor is ref cursor;
end testpackage;

2.建一个程序包的包体(实现)。如下:

create or replace procedure testc
	(p_cursor out testpackage.test_cursor) 
is 
begin
	open p_cursor for select * from hyq.testtb;
end testc;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

Java调用代码:


import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;

public class TestProcedureTHREE {
	
	public TestProcedureTHREE() {
	
	}
	
	public static void main(String[] args ){
		String driver = "oracle.jdbc.driver.OracleDriver";
		String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

		ResultSet rs = null;
		Connection conn = null;
		CallableStatement proc = null;

		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(strUrl, "hyq", "hyq");			
			proc = conn.prepareCall("{ call hyq.testc(?) }");
			proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
			proc.execute();

			rs = (ResultSet)proc.getObject(1);
			while(rs.next()){
				System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
			}
		}
		catch (SQLException ex2) {
			ex2.printStackTrace();
		}
		catch (Exception ex1) {
			ex1.printStackTrace();
		}
		finally{
			try {
				if(rs != null){
					rs.close();
					
					if(stmt!=null){
						stmt.close();
					}
					if(conn!=null){
						conn.close();
					}
				}
			}
			catch (SQLException ex0) {
			}
		}
	}
}

分享到:
评论

相关推荐

    oracle存储过程学习经典[语法+实例+调用

    调用存储过程可以使用EXECUTE命令或直接使用过程名加参数: ``` EXECUTE sam.credit(123, 100); -- 或者 sam.credit(123, 100); ``` 如果要保留之前赋予的EXECUTE权限,可以使用CREATE OR REPLACE PROCEDURE语句。 ...

    Oracle中的函数、存储过程、包

    - **调用存储过程**:使用`EXECUTE`语句或在PL/SQL块中调用,也可以在DML语句中作为触发器触发。 - **异常处理**:存储过程中可以使用`BEGIN...END`块和异常处理语句,如`RAISE_APPLICATION_ERROR`,在遇到特定...

    java垃圾回收器代码举例

    堆内存主要存储对象实例,而栈内存则存储方法调用时的局部变量和方法返回地址。 - Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的...

    JDBC和Oracle的参数设置和调用技术.pdf

    3. **调用存储过程**:通过`CallableStatement`接口来调用存储过程。对于输入参数(IN),可以使用`PreparedStatement`的`setXXX()`方法设置参数值。对于输出参数(OUT)和输入输出参数(IN OUT),需使用`...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-118-Java基本语法-方法详解-方法的调用过程-举例及简单分析.avi 北京动力节点-Java编程零基础教程-119-Java基本语法-方法详解-方法的调用过程-方法调用过程中栈内存的变化.avi ...

    JAVA c++比较 对比讲解二者不同 代码举例(英文版)

    - **JAVA**:默认支持动态绑定,即方法调用时根据对象的实际类型决定调用哪个方法。 #### 十一、值类型与指针类型 - **C++**:支持值类型(value type)和引用类型(reference type),也支持指针类型(pointer type)。...

    java基础资料大全

    9. 面向对象:解释面向过程与面向对象的概念,举例说明面向对象的思维方式,并探讨其好处。 10. 类与对象:讲解类的定义和对象的创建,并探讨如何在实际需求中使用对象。 11. 集合类:以ArrayList为例,介绍集合类...

    java初学者应学的几个简单实例

    5. **数组**:数组是用来存储相同类型数据的集合。你可以声明、初始化和操作数组。例如: ```java int[] numbers = new int[5]; // 创建一个整型数组 numbers[0] = 1; numbers[1] = 2; // 打印数组元素 for (int ...

    Java内存分配全面解析

    举例来说,当我们运行一个Java程序,JVM首先会找到main方法,然后创建类的实例。例如,如果创建了一个名为`Test`的类实例,那么在栈中会分配一块内存来保存指向堆中对象的引用。对于基本类型(如int)的变量,它们的...

    Java语言程序设计(完整版)第六版 教程示例源码

    在最初的章节,你将学习Java的基本语法,包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、常量、运算符、流程控制语句(如if-else,switch,for,while,do-while),以及方法的定义和调用。 2. **面向...

    达内java的控制台的Thread的举例

    这里设定仓库的容量为10,即仓库中最多只能存储10个产品。当仓库满时,生产者必须等待消费者消费一部分产品后才能继续生产;反之,当仓库为空时,消费者也需要等待生产者生产出产品才能进行消费。这就需要用到Java中...

    java sql 数据库 面试 面试试题

    - 如何在Java中调用SQL存储过程? 6. **预编译语句与批处理** - 为什么使用PreparedStatement比Statement更好? - 什么是批处理?何时应该使用批处理? 7. **连接池管理** - 解释数据库连接池的概念。 - 介绍...

    ibatis实例,mysql应用举例

    在实际项目中,可以根据需求进一步扩展,如分页查询、动态SQL、存储过程调用等,`iBatis`的强大之处在于它的灵活性和可定制性。同时,由于`iBatis`与Spring的无缝集成,使得在大型项目中更易于管理和维护。

    90个高质量的java问答.pdf

    - **构造器调用顺序**:理解构造器链式调用的过程,包括如何使用 `super()` 调用父类构造器。 - **this 和 super 的区别**:区分 `this()` 和 `super()` 的使用场景。 - **实例化对象时的构造过程**:分析创建对象时...

    Java面试宝典

    - **举例**: 如果文件名为`Main.java`,则其中可以包含`public class Main`以及其他非公共类。 **1.2 Java中的`goto`关键字** - **知识点**: Java中并没有提供`goto`关键字。`goto`是C/C++中的一个关键字,用于无...

    疯狂JAVA讲义

    学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 ...

    java入门pdf

    - **4.2.6 递归方法**:方法调用自身的过程称为递归。 **4.3 封装、继承与多态** - **4.3.1 封装**:封装是将数据和操作这些数据的方法绑定在一起,隐藏内部实现细节。 - **4.3.2 继承**:继承允许一个类继承另一...

Global site tag (gtag.js) - Google Analytics