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) {
}
}
}
}
分享到:
相关推荐
调用存储过程可以使用EXECUTE命令或直接使用过程名加参数: ``` EXECUTE sam.credit(123, 100); -- 或者 sam.credit(123, 100); ``` 如果要保留之前赋予的EXECUTE权限,可以使用CREATE OR REPLACE PROCEDURE语句。 ...
- **调用存储过程**:使用`EXECUTE`语句或在PL/SQL块中调用,也可以在DML语句中作为触发器触发。 - **异常处理**:存储过程中可以使用`BEGIN...END`块和异常处理语句,如`RAISE_APPLICATION_ERROR`,在遇到特定...
堆内存主要存储对象实例,而栈内存则存储方法调用时的局部变量和方法返回地址。 - Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的...
3. **调用存储过程**:通过`CallableStatement`接口来调用存储过程。对于输入参数(IN),可以使用`PreparedStatement`的`setXXX()`方法设置参数值。对于输出参数(OUT)和输入输出参数(IN OUT),需使用`...
北京动力节点-Java编程零基础教程-118-Java基本语法-方法详解-方法的调用过程-举例及简单分析.avi 北京动力节点-Java编程零基础教程-119-Java基本语法-方法详解-方法的调用过程-方法调用过程中栈内存的变化.avi ...
- **JAVA**:默认支持动态绑定,即方法调用时根据对象的实际类型决定调用哪个方法。 #### 十一、值类型与指针类型 - **C++**:支持值类型(value type)和引用类型(reference type),也支持指针类型(pointer type)。...
9. 面向对象:解释面向过程与面向对象的概念,举例说明面向对象的思维方式,并探讨其好处。 10. 类与对象:讲解类的定义和对象的创建,并探讨如何在实际需求中使用对象。 11. 集合类:以ArrayList为例,介绍集合类...
5. **数组**:数组是用来存储相同类型数据的集合。你可以声明、初始化和操作数组。例如: ```java int[] numbers = new int[5]; // 创建一个整型数组 numbers[0] = 1; numbers[1] = 2; // 打印数组元素 for (int ...
举例来说,当我们运行一个Java程序,JVM首先会找到main方法,然后创建类的实例。例如,如果创建了一个名为`Test`的类实例,那么在栈中会分配一块内存来保存指向堆中对象的引用。对于基本类型(如int)的变量,它们的...
在最初的章节,你将学习Java的基本语法,包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、常量、运算符、流程控制语句(如if-else,switch,for,while,do-while),以及方法的定义和调用。 2. **面向...
这里设定仓库的容量为10,即仓库中最多只能存储10个产品。当仓库满时,生产者必须等待消费者消费一部分产品后才能继续生产;反之,当仓库为空时,消费者也需要等待生产者生产出产品才能进行消费。这就需要用到Java中...
- 如何在Java中调用SQL存储过程? 6. **预编译语句与批处理** - 为什么使用PreparedStatement比Statement更好? - 什么是批处理?何时应该使用批处理? 7. **连接池管理** - 解释数据库连接池的概念。 - 介绍...
在实际项目中,可以根据需求进一步扩展,如分页查询、动态SQL、存储过程调用等,`iBatis`的强大之处在于它的灵活性和可定制性。同时,由于`iBatis`与Spring的无缝集成,使得在大型项目中更易于管理和维护。
- **构造器调用顺序**:理解构造器链式调用的过程,包括如何使用 `super()` 调用父类构造器。 - **this 和 super 的区别**:区分 `this()` 和 `super()` 的使用场景。 - **实例化对象时的构造过程**:分析创建对象时...
- **举例**: 如果文件名为`Main.java`,则其中可以包含`public class Main`以及其他非公共类。 **1.2 Java中的`goto`关键字** - **知识点**: Java中并没有提供`goto`关键字。`goto`是C/C++中的一个关键字,用于无...
学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 ...
- **4.2.6 递归方法**:方法调用自身的过程称为递归。 **4.3 封装、继承与多态** - **4.3.1 封装**:封装是将数据和操作这些数据的方法绑定在一起,隐藏内部实现细节。 - **4.3.2 继承**:继承允许一个类继承另一...