这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。

一:无返回值的存储过程

存储过程为:

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

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

" + rs.getString(1) + ""+rs.getString(2)+"");

}

}

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 调页储存_java调用存储过程相关推荐

  1. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  2. java 存储过程_Java 调用存储过程

    本文阐述了怎么使用DBMS存储过程.我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是 ...

  3. java 存储过程 数组_Java调用存储过程返回数组

    Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMB ...

  4. java 如何调用存储过程_java调用存储过程

    这里是java调用存储过程.package com.lijianbo.procedure; import java.sql.CallableStatement; import java.sql.Con ...

  5. java怎么调用存储过程_Java调用存储过程的2种方法

    creat proc proc_select @pid varchar(20) @address varchar(20) output as select @address=address from ...

  6. java调c++代码_Java中调用C++代码的实现 | 学步园

    JNI为  Java Native Interface 即Java本地接口,使用此种方式可以对C/C++代码进行调用,其在本质上是对C/C++生成的动态库进行调用而不是直接对C/C++代码进行调用 J ...

  7. java调C接口_java通过jni调用C程序接口

    打算写一个FbSetApp去操作framebuffer的设备文件,以便能够去设置FB的一些参数. 新建两个class FbParams.java: package org.trident.fbset; ...

  8. java 调用存储过程 无效的列索引_JAVA 调用存储过程报错 java.sql.SQLException: 无效的列索引...

    报错信息java.sql.SQLException:无效的列索引atoracle.jdbc.driver.OracleCallableStatement.registerOutParameterInt ...

  9. java cmd 等待输入_JAVA:调用cmd指令(支持多次手工输入)

    1 packagecom.le.tool;2 3 importjava.io.BufferedReader;4 importjava.io.File;5 importjava.io.IOExcepti ...

最新文章

  1. 跨链Cosmos(3)IBC协议二
  2. 1-Alternative Boot Flows
  3. Android 高级Drawable资源---复合Drawable----级别列表Drawabled
  4. 智己汽车——比智能车更豪华,比豪华车更智能
  5. centos8.2安装ovirt
  6. springboot整合mysql5.7_详解SpringBoot整合MyBatis详细教程
  7. Win10电脑网络图标不见了 解决办法
  8. CE修改器使用教程 [入门篇]
  9. 华为5102路由器虚拟服务器,华为路由WS5102怎么设置wifi中继功能
  10. 扩展ExoPlayer实现多音轨同时播放
  11. HTML5播放器应用
  12. RecordRTC的视频录制,回放,截图,下载
  13. php文本框代码_php怎么用代码给文本框输入值
  14. 【C++】虚表与虚表指针,虚基类表与虚基类表指针
  15. 初识ABP vNext(1):开篇计划amp;基础知识
  16. 信息流广告文案与创意设计
  17. wps excel 多数字文本格式转换为数字(不会以科学计数法显示)
  18. grep、sed、awk高效文件处理3剑客
  19. 【机器学习】逻辑斯蒂回归(Logistic Regression)详解
  20. [Python]简单的计算题

热门文章

  1. 动物识别系统代码python_动物识别系统代码
  2. 好用的android app,6款好用的Android手机App
  3. web前端埋点及数据上报
  4. 数组按照元素个数由多到少排序
  5. React-单页面(SPA)多路由(代替多页面)
  6. java微信签名什么意思,java,_求java实现微信签名,java - phpStudy
  7. 数学之美番外篇:平凡而又神奇的贝叶斯方法(转自刘未鹏)
  8. c语言编程一对新出生的兔子,C语言 有一对兔子。从出生后第三个月起每个月都生一对兔子,小兔子长到三个月后又生一对小兔子,假如兔子都不死,问每个月的兔子总数为多少。...
  9. 常用地图投影转换公式 (转载)
  10. 74HC245三态输出八路信号收发器