用java调用oracle存储过程总结(转)

摘要:
)}";//2、建立连接Connectionconn=null;conn=DriverManager.getConnection();//3、使用java.sql.*类CallableStatementcs=conn.prepareCall;//4、传入in值cs.setInt;cs.setInt;//5、设置out值cs.registerOutParameter;//6、执行cs.excuse();//7、取出out值intflag=cs.getInt;//8、关连接conn.close();文章引用自:*********************************************************************************************************************这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。一:无返回值的存储过程存储过程为:CREATEORREPLACEPROCEDURETESTAASBEGININSERTINTOHYQ.B_IDVALUES;ENDTESTA;然后呢,在java里调用时就用下面的代码:packagecom.hyq.src;importjava.sql.*;importjava.sql.ResultSet;publicclassTestProcedureOne{publicTestProcedureOne(){}publicstaticvoidmain{Stringdriver="oracle.jdbc.driver.OracleDriver";StringstrUrl="jdbc:oracle:thin:@127.0.0.1:1521:hyq";Statementstmt=null;ResultSetrs=null;Connectionconn=null;CallableStatementcstmt=null;try{Class.forName;conn=DriverManager.getConnection;CallableStatementproc=null;//创建执行存储过程的对象proc=conn.prepareCall("{callHYQ.TESTA(?
//1、call+包名+存储过程名(传入、传出值用?)  
   String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}";
//2、建立连接
 Connection conn=null;
 conn=DriverManager.getConnection();
//3、使用java.sql.*类
 CallableStatement cs=conn.prepareCall(str);
//4、传入in值
 cs.setInt(1,id);
 cs.setInt(2,-2);
//5、设置out值
 cs.registerOutParameter(3,Types.NUMERIC);
//6、执行
 cs.excuse();
//7、取出out值
 int flag=cs.getInt(3);
//8、关连接
 conn.close();
复制代码
文章引用自:
*********************************************************************************************************************
这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。
一:无返回值的存储过程
存储过程为:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)AS
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (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(?,?) }"); //设置存储过程 call为关键字.
      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);//第二个参数输出参数,是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(?) }"); //存储过程 hyq包下的
      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);//设置输出参数是一个游标.第一个参数,游标类型
      proc.execute();//执行
      rs = (ResultSet)proc.getObject(1); //获得第一个参数是一个游标,转化成ResultSet类型
 
      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) {
      }
    }
 }
}

免责声明:文章转载自《用java调用oracle存储过程总结(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于Springboot集成security、oauth2实现认证鉴权、资源管理Sqlserver 2014 之 自定义字符串聚合函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi Byte数组与Int String之间的相互转换

http://www.cnblogs.com/lcw/p/3352864.html string   string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节;   变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串...

oracle字符集的查看和修改

一、什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如...

C#使用Process类杀死进程,执行命令等

c#之process类相关整理 一、根据进程名获取进程的用户名? 需要添加对 System.Management.dll 的引用 using System.Diagnostics; using System.Management; static void Main(string[] args) { foreach (Process p in Proc...

Android中Message机制的灵活应用

转自:http://qaohao.iteye.com/blog/509145 1.活用Android线程间通信的Message机制 1.1.Message 代码在frameworks\base\core\java\android\Os\Message.java中。 Message.obtain函数:有多个obtain函数,主要功能一样,只是参数不一样。...

跟我一起玩Win32开发(10):绘图(C)

今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数就可以了。 SetDCBrushColor函数有必要扯一下,它的声明如下: [cpp] view plain copy  COLORREF SetDCBrushColor(     __in  HDC hdc,     __in  COLORREF crCo...

centos oracle 数据库备份

#!/bin/bashexport ORACLE_BASE=/home/oracle/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1export ORACLE_SID=orclexport TNS_ADMIN=$ORACLE_HOME/network/adminexport...