用java调用oracle存储过程和函数-程序员宅基地

技术标签: Java  java  数据库  DB  

创建测试用表:
CREATE TABLE USER
(
   I_ID   VARCHAR(50) NOT NULL,
   I_NAME VARCHAR(50) NOT NULL
);

一:无返回值的存储过程
1,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTA(
    PARA1 IN VARCHAR2,
    PARA2 IN VARCHAR2)
AS
BEGIN
  INSERT INTO USER
    (I_ID,I_NAME
    ) VALUES
    (PARA1, PARA2
    );
END TESTA;

 

2,Java程序:

package com.hyq.src;

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 = conn.prepareCall("begin HYQ.TESTA(?,?); end;");

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

      }

    }

  }
}

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

1,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTB(
    PARA1 IN VARCHAR2,
    PARA2 OUT VARCHAR2)
AS
BEGIN
  SELECT I_NAME INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;

 

2,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 = conn.prepareCall("begin HYQ.TESTB(?,?); end;");

      proc.setString(1, "100");

      proc.registerOutParameter(2, oracle.jdbc.OracleTypes.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) {

      }

    }

  }

}

}


三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.它是把游标(可以理解为一个指针),作为一个out 参数来返回值的.所以要分两部分:

1,建一个程序包:
CREATE OR REPLACE
PACKAGE TESTPACKAGE
AS
TYPE Test_CURSOR
IS
  REF
  CURSOR;
  END TESTPACKAGE;

2,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTC(
    PARA1 IN VARCHAR2,p_CURSOR OUT TESTPACKAGE.Test_CURSOR)
IS
BEGIN
  OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB WHERE I_ID= PARA1;
END TESTC;


3,Java程序:
package com.hyq.src;

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 = conn.prepareCall("begin hyq.testc(?,?); end;");

      proc.setString(1, "100")

      proc.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

      proc.execute();

      rs = (ResultSet)proc.getObject(2);

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

      }

    }

  }

}

 

四:调用函数返回列表

1,建一个程序包:

CREATE OR REPLACE
PACKAGE TESTPACKAGE
AS
TYPE Test_CURSOR
IS
  REF
  CURSOR;
END TESTPACKAGE;

2,建立函数:
CREATE OR REPLACE
FUNCTION TESTD(
    PARA1 IN VARCHAR2)
RETURN TESTPACKAGE.Test_CURSOR
IS
rc TESTPACKAGE.Test_CURSOR;
BEGIN
  OPEN rc FOR SELECT * FROM HYQ.TESTTB WHERE I_ID= PARA1;
  return rc;
END TESTD;

 

3,Java程序:
package com.hyq.src;

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.TESTD(?) }");

 //   proc = conn.prepareCall("begin ? :=HYQ.TESTD(?); end;");
 
   proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

      proc.setString(2, "100")

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

      }

    }

  }

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lmaosheng/article/details/88337483

智能推荐

mac vscode常用快捷键_vscodeapple 回退键-程序员宅基地

文章浏览阅读225次。ctrl + - 返回上次光标处ctrl + shift + - 与上面相反。。。ctrl + shift + k 删除行option + up /down 某一行上下移动option + shift + up 往上复制当前行option + shift + down 往下复制当前行option + Shift + F 格式化..._vscodeapple 回退键

Java开发面试题!Java按行读文件_java面试问文件读写-程序员宅基地

文章浏览阅读57次。一面介绍一下自己问项目经历, 聊"数据同步"接着聊上了 K8S 的项目有没有什么钻研得比较深得技术?(大佬:kubernetes, golang, prometheus, java)kubernetes 的架构是怎么样的?这个问题很大,拆成 apiserver、controller、kubelet、scheduler 讲了一下golang 与 java 的比较这个问题又很大,当时主要对比了 vm、协程支持、面向对象和泛型的区别、以及自己对各自使用场景的一些理解_java面试问文件读写

KingSwap社区AMA 第6期._ama详情: 1. sumswap中国社区大使和coinreaders的在线qa环节(直播过程中-程序员宅基地

文章浏览阅读139次。KingSwap社区AMA 第6期主题:爆火的DeFi+NFT是什么?时间:2020年12月10日 20:30主讲:MalcolmHi,大家好,欢迎来到KingSwap中文社区每期的AMA,很高兴又和大家见面啦!如果只用一个词来概括 2020 年的区块链行业,这个词应该是 DeFi。而下一个关键词呢?许多人心中的答案是:NFT。不过,很自然的问题随之而来:如果 NFT 遇上 DeFi ,会碰撞出来什么花火?在 NFT 和 DeFi 的十字路口,逐渐有更多的项目浮上水面,在当下正红的 DeFi._ama详情: 1. sumswap中国社区大使和coinreaders的在线qa环节(直播过程中

新知識!!-程序员宅基地

文章浏览阅读250次。 http://download.csdn.net/source/2289993 下了!! 非常好! 學了很多新知識!! wcf Ria Services; MVVMlight framework; Entity framework; Terelik controls; Siliverlight 4.0; VS 2010

Android OTA升级原理和流程分析(七)---Recovery服务的核心install_package函数-程序员宅基地

文章浏览阅读540次。转载自:http://blog.chinaunix.net/uid-22028566-id-3533856.html一、Recovery服务的核心install_package(升级update.zip特有) 和Recovery服务中...

Oracle_字符集问题(数据库与客户端字符集关联关系)_数据库字符集和客户端字符集-程序员宅基地

文章浏览阅读2.6k次。//时间:2013-07-07//作者:shm//描述:本文主要记录了Oracle数据库的字符集问题,也涉及作为服务器操作系统的CentOS或者Windows的字符集与Oracle字符集之间的关联关系。 Oracle的字符集,这个问题的提出是因为两个原因:一是工作中遇到一个DMP文件需要恢复到数据库中去,而这个DMP文件的字符集是US7ASCII,_数据库字符集和客户端字符集

随便推点

OpenCms新手上路“一线穿”_opencms爬虫-程序员宅基地

文章浏览阅读878次。有必要把以前的文章穿穿线了,希望同样的文章带给你不同的感觉……  1、OpenCms官方网站:    www.opencms.org    www.alkacon.com/alkacon/en  2、了解OpenCms:    OpenCms简介     OpenCms溯源     OpenCms新手上路——介绍篇     OpenCms7,我们翘首以待……     OpenCms7 al_opencms爬虫

【MCS-51单片机汇编语言】期末复习总结③——中断系统之外部中断(题型三)_51单片机外部中断汇编语言-程序员宅基地

文章浏览阅读765次,点赞56次,收藏63次。51单片机(汇编语言)中断_51单片机外部中断汇编语言

Apple Watch字体大小设置 苹果手表改字体大小方法_applewatch自定义表盘字体_爱学习的小兔子的博客-程序员宅基地

文章浏览阅读3.2k次。与使用iPhone时一样,如果您希望更改AppleWatch上的文字大小,可以在其系统设置中进行调节和更改。需要注意的是,在设置中更改文字大小之后,所有的AppleWatch自带的应用程序,例如“邮件”、“信息”等这些将以更改后的文字大小显示,但某些第三方应用程序以及表盘上的部分内容不会受到影响。以下是调整文字大小的方法:1.轻按AppleWatch的数码表冠,然后从应用程序列表中选择“设置”。2.向下滚动并选择“显示和亮度”。3.点击文字大小,向右移动滑块..._applewatch自定义表盘字体

潘多拉Pandora (openwrt), rsync增量备份, 手机自动备份_openwrt备份手机相册-程序员宅基地

文章浏览阅读2k次。实现手机自动备份到pandora。一,手机安装termux, pkgupgrade pkg install rsync -y二,编辑启动脚本 vi $PREFIX/et/bash.bashr 添加以下内容echo `ip addr | grep 'inet .* wlan' `sshdecho User : ..._openwrt备份手机相册

网络学习 : 无线网络 无线设备 WiFi 蓝牙 无线网络协议-程序员宅基地

文章浏览阅读985次。无线网络 一般指的是无线局域网,由无线通讯设备 ,无线网络协议 ,无线通讯技术构成,是以太网的一种无线形式。 wifi 是一种无线通讯技术,它利用无线电波使得2台设备之间可以通讯(距离90米内)因为通过WiFi技术可以发送报文,为了使报文有意义,所以定义了一些新的无线通讯协议,为了通讯方便,所以出现了一批新的无线网络设备。 wifi 通讯使用的是无线通讯协议 802.11 ...

图形界面介绍<Create Pin Blockage>-程序员宅基地

文章浏览阅读407次。今天要介绍的图形界面是Create Pin Blockage键功能很简单,创建一个pin blockage。Pin Blockage(引脚阻碍物)。这是..._assigniopins

推荐文章

热门文章

相关标签