首页 > 数据库 >用java调用oracle存储过程总结

用java调用oracle存储过程总结

时间:2023-04-26 13:35:33浏览次数:42  
标签:存储 调用 java rs hyq oracle null proc conn


用java调用oracle存储过程总结

[code]

1、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
2、什么时候需要用存储过程
  如果服务器定义了存储过程,应当根据需要决定是否要用存储过程。存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程,可以改善应用程序的性能。这是因为:
.服务器往往具有强大的计算能力和速度。
.避免把大量的数据下载到客户端,减少网络上的传输量。
  例如,假设一个应用程序需要计算一个数据,这个数据需要涉及到许多记录。如果不使用存储过程的话,把这些数据下载到客户端,导致网络上的流量剧增。
  不仅如此,客户端可能是一台老掉牙的计算机,它的运算速度很慢。而改用存储过程后,服务器会很快地把数据计算出来,并且只需传递一个数据给客户端,其效率之高是非常明显的。
3、存储过程的参数
  要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:
  第一种称为输入参数,由客户程序向存储过程传递值。
  第二种称为输出参数,由存储过程向客户程序返回结果。
  第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。
  第四种称为状态参数,由存储过程向客户程序返回错误信息。
  要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。
4、oracle 存储过程的基本语法

1.基本结构

CREATE OR REPLACEPROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字


2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:

BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;


一:无返回值的存储过程
存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);
END TESTA;

然后呢,在java里调用时就用下面的代码:

package com.hyq.src; 


 import java.sql.*; 

 import java.sql.ResultSet; 


 public class TestProcedureOne { 

 public TestProcedureOne() { 

 } 

 public static void main(String[] args ){ 

 String driver = "oracle.jdbc.driver.OracleDriver"; 

 String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq "; 

 Statement stmt = null; 

 ResultSet rs = null; 

 Connection conn = null; 

 CallableStatement cstmt = null; 


 try { 

 Class.forName(driver); 

 conn = DriverManager.getConnection(strUrl, " hyq ", " hyq "); 

 CallableStatement proc = null; 

 proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }"); 

 proc.setString(1, "100"); 

 proc.setString(2, "TestOne"); 

 proc.execute(); 

 } 

 catch (SQLException ex2) { 

 ex2.printStackTrace(); 

 } 

 catch (Exception ex2) { 

 ex2.printStackTrace(); 

 } 

 finally{ 

 try { 

 if(rs != null){ 

 rs.close(); 

 if(stmt!=null){ 

 stmt.close(); 

 } 

 if(conn!=null){ 

 conn.close(); 

 } 

 } 

 } 

 catch (SQLException ex1) { 

 } 

 } 

 } 

 }


当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)
存储过程为:

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;

在java里调用时就用下面的代码:

package com.hyq.src; 


 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"; 

 Statement stmt = null; 

 ResultSet rs = null; 

 Connection conn = null; 

 try { 

 Class.forName(driver); 

 conn = DriverManager.getConnection(strUrl, " hyq ", " hyq "); 

 CallableStatement proc = null; 

 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(stmt!=null){ 

 stmt.close(); 

 } 

 if(conn!=null){ 

 conn.close(); 

 } 

 } 

 } 

 catch (SQLException ex1) { 

 } 

 } 

 } 

 } 


 }



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

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

CREATE OR REPLACE PACKAGE TESTPACKAGE AS
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里调用时就用下面的代码:

package com.hyq.src; 

 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"; 

 Statement stmt = null; 

 ResultSet rs = null; 

 Connection conn = null; 


 try { 

 Class.forName(driver); 

 conn = DriverManager.getConnection(strUrl, "hyq", "hyq"); 


 CallableStatement proc = null; 

 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 ex2) { 

 ex2.printStackTrace(); 

 } 

 finally{ 

 try { 

 if(rs != null){ 

 rs.close(); 

 if(stmt!=null){ 

 stmt.close(); 

 } 

 if(conn!=null){ 

 conn.close(); 

 } 

 } 

 } 

 catch (SQLException ex1) { 

 } 

 } 

 } 

 }



在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错。
[/code]

标签:存储,调用,java,rs,hyq,oracle,null,proc,conn
From: https://blog.51cto.com/u_16087012/6227110

相关文章

  • Oracle数据库设计——定义约束 主键
    Oracle数据库设计——定义约束主键[code]声明约束主键(PRIMARYKEY)一张表不一定有主键,但大多数表都创建了主键,主键值必须唯一并且组成主键的各列都不能为空。想象一下存储学生信息的一张表。在学生表(STUDENTS)每个学生有且仅有一行记录。因此,在S......
  • java基本类型和byte[]转换
     publicclassByteUtil{publicstaticbyte[]getBytes(shortdata){byte[]bytes=newbyte[2];bytes[0]=(byte)(data&0xff);bytes[1]=(byte)((data&0xff00)>>8);returnbytes;}public......
  • Java泛型简单总结
    [code]Java泛型简单总结1)基本概念:泛型(GenericType或Generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看做是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的占位符一......
  • Oracle中UNION 与UNION ALL的学习
    Oracle中UNION与UNIONALL的学习[code]1、UNION:并集,所有的内容都查询,重复的显示一次;2、UNIONALL:并集,所有的内容都显示,包括重复的;3、INTERSECT:交集,只显示重复的;4、MINUS:差集,只显示对方没有的(跟顺序是有关系的)两者都是对记录集操作,把来自许多SELE......
  • Java API 读取HDFS目录下的所有文件
    /***获取1号店生鲜食品的分类id字符串*@paramfilePath*@return*/publicStringgetYHDSXCategoryIdStr(StringfilePath){ finalStringDELIMITER=newString(newbyte[]{1}); finalStringINNER_DELIMITER=","; //遍历目录下的所有文件 BufferedReader......
  • Java8 Lambda表达式教程
    1.什么是λ表达式 λ表达式本质上是一个匿名方法。让我们来看下面这个例子:   publicintadd(intx,inty){       returnx+y;   }转成λ表达式后是这个样子:       (intx,inty)->x+y;参数类型也可以省略,Java编译器会根据上下文推断出来:  ......
  • 初探Java框架
    (一)什么是Java框架?1.概念Java框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。框架又叫做开发中的半成品,它不能提供整个WEB应用程序的所有东西,但是有了框架,我们就可以集中精力进行业务逻辑的开发而不用去关心它的技术实现以及一些辅助的业务逻辑。说白......
  • Java中抽象类和接口的区别?
    什么是抽象类?抽象类是对具体概念的抽象抽象类本质是为了继承只能被public或默认修饰行为层面抽象出来抽象方法抽象类的注意事项抽象类不可以被直接实例化抽象类中可以存在构造方法抽象类可以存在普通方法抽象方法的注意抽象方法必须定义在抽象类中仅声明实现......
  • 若依vue框架添加kotlin依赖,实现kotlin和java混合编译
    第一步:在最外部pom.xml文件添加版本号和依赖管理properties添加版本号<kotlin.version>1.4.21</kotlin.version><!--启用kotlin增量编译--><kotlin.compiler.incremental>true</kotlin.compiler.incremental>dependencyManagement添加依赖管理<!-......
  • 【FAQ】关于JavaScript版本的华为地图服务Map的点击事件与Marker的点击事件存在冲突的
    一. 问题描述创建地图对象,并添加marker标记,对map和marker均添加了点击事件;<body><script>functioninitMap(){//创建地图对象constmap=newHWMapJsSDK.HWMap(document.getElementById('map'),{center:{lat:39.36322,lng:......