`
war_martin
  • 浏览: 115426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用存储过程(返回一个集合)

阅读更多
java 代码
  1. 一:无返回值的存储过程   
  2. 存储过程为:   
  3.   
  4. CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)  AS   
  5.   
  6. BEGIN    
  7.   
  8.    INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);   
  9.   
  10. END TESTA;   
  11.   
  12. 然后呢,在java里调用时就用下面的代码:   
  13.   
  14. package com.hyq.src;   
  15.   
  16.     
  17.   
  18. import java.sql.*;   
  19.   
  20. import java.sql.ResultSet;   
  21.   
  22.     
  23.   
  24. public class TestProcedureOne {   
  25.   
  26.   public TestProcedureOne() {   
  27.   
  28.   }   
  29.   
  30.   public static void main(String[] args ){   
  31.   
  32.     String driver = "oracle.jdbc.driver.OracleDriver";   
  33.   
  34.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";   
  35.   
  36.     Statement stmt = null;   
  37.   
  38.     ResultSet rs = null;   
  39.   
  40.     Connection conn = null;   
  41.   
  42.     CallableStatement cstmt = null;   
  43.   
  44.     
  45.   
  46.     try {   
  47.   
  48.       Class.forName(driver);   
  49.   
  50.       conn =  DriverManager.getConnection(strUrl, " hyq "" hyq ");   
  51.   
  52.       CallableStatement proc = null;   
  53.   
  54.       proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");   
  55.   
  56.       proc.setString(1"100");   
  57.   
  58.       proc.setString(2"TestOne");   
  59.   
  60.       proc.execute();   
  61.   
  62.     }   
  63.   
  64.     catch (SQLException ex2) {   
  65.   
  66.       ex2.printStackTrace();   
  67.   
  68.     }   
  69.   
  70.     catch (Exception ex2) {   
  71.   
  72.       ex2.printStackTrace();   
  73.   
  74.     }   
  75.   
  76.     finally{   
  77.   
  78.       try {   
  79.   
  80.         if(rs != null){   
  81.   
  82.           rs.close();   
  83.   
  84.           if(stmt!=null){   
  85.   
  86.             stmt.close();   
  87.   
  88.           }   
  89.   
  90.           if(conn!=null){   
  91.   
  92.             conn.close();   
  93.   
  94.           }   
  95.   
  96.         }   
  97.   
  98.       }   
  99.   
  100.       catch (SQLException ex1) {   
  101.   
  102.       }   
  103.   
  104.     }   
  105.   
  106.   }   
  107.   
  108. }   
  109.   
  110. 当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。   
  111.   
  112. 二:有返回值的存储过程(非列表)   
  113.   
  114. 存储过程为:   
  115.   
  116. CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)  AS   
  117.   
  118. BEGIN    
  119.   
  120.    SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;    
  121.   
  122. END TESTB;   
  123.   
  124. 在java里调用时就用下面的代码:   
  125.   
  126. package com.hyq.src;   
  127.   
  128. public class TestProcedureTWO {   
  129.   
  130.   public TestProcedureTWO() {   
  131.   
  132.   }   
  133.   
  134.   public static void main(String[] args ){   
  135.   
  136.     String driver = "oracle.jdbc.driver.OracleDriver";   
  137.   
  138.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";   
  139.   
  140.     Statement stmt = null;   
  141.   
  142.     ResultSet rs = null;   
  143.   
  144.     Connection conn = null;   
  145.   
  146.     try {   
  147.   
  148.       Class.forName(driver);   
  149.   
  150.       conn =  DriverManager.getConnection(strUrl, " hyq "" hyq ");   
  151.   
  152.       CallableStatement proc = null;   
  153.   
  154.       proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");   
  155.   
  156.       proc.setString(1"100");   
  157.   
  158.       proc.registerOutParameter(2, Types.VARCHAR);   
  159.   
  160.       proc.execute();   
  161.   
  162.       String testPrint = proc.getString(2);   
  163.   
  164.       System.out.println("=testPrint=is="+testPrint);   
  165.   
  166.     }   
  167.   
  168.     catch (SQLException ex2) {   
  169.   
  170.       ex2.printStackTrace();   
  171.   
  172.     }   
  173.   
  174.     catch (Exception ex2) {   
  175.   
  176.       ex2.printStackTrace();   
  177.   
  178.     }   
  179.   
  180.     finally{   
  181.   
  182.       try {   
  183.   
  184.         if(rs != null){   
  185.   
  186.           rs.close();   
  187.   
  188.           if(stmt!=null){   
  189.   
  190.             stmt.close();   
  191.   
  192.           }   
  193.   
  194.           if(conn!=null){   
  195.   
  196.             conn.close();   
  197.   
  198.           }   
  199.   
  200.         }   
  201.   
  202.       }   
  203.   
  204.       catch (SQLException ex1) {   
  205.   
  206.       }   
  207.   
  208.     }   
  209.   
  210.   }   
  211.   
  212. }   
  213.   
  214.     
  215.   
  216. }   
  217.   
  218. 注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。   
  219.   
  220. 三:返回列表   
  221.   
  222. 由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,   
  223.   
  224. 1,  建一个程序包。如下:   
  225.   
  226. CREATE OR REPLACE PACKAGE TESTPACKAGE  AS   
  227.   
  228.  TYPE Test_CURSOR IS REF CURSOR;   
  229.   
  230. end TESTPACKAGE;   
  231.   
  232. 2,建立存储过程,存储过程为:   
  233.   
  234. CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS    
  235.   
  236. BEGIN   
  237.   
  238.     OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;   
  239.   
  240. END TESTC;   
  241.   
  242. 可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。   
  243.   
  244. 在java里调用时就用下面的代码:   
  245.   
  246. package com.hyq.src;   
  247.   
  248. import java.sql.*;   
  249.   
  250. import java.io.OutputStream;   
  251.   
  252. import java.io.Writer;   
  253.   
  254. import java.sql.PreparedStatement;   
  255.   
  256. import java.sql.ResultSet;   
  257.   
  258. import oracle.jdbc.driver.*;   
  259.   
  260. public class TestProcedureTHREE {   
  261.   
  262.   public TestProcedureTHREE() {   
  263.   
  264.   }   
  265.   
  266.   public static void main(String[] args ){   
  267.   
  268.     String driver = "oracle.jdbc.driver.OracleDriver";   
  269.   
  270.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";   
  271.   
  272.     Statement stmt = null;   
  273.   
  274.     ResultSet rs = null;   
  275.   
  276.     Connection conn = null;   
  277.   
  278.    try {   
  279.   
  280.       Class.forName(driver);   
  281.   
  282.       conn =  DriverManager.getConnection(strUrl, "hyq""hyq");   
  283.   
  284.    CallableStatement proc = null;   
  285.   
  286.       proc = conn.prepareCall("{ call hyq.testc(?) }");   
  287.   
  288.       proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);   
  289.   
  290.       proc.execute();   
  291.   
  292.       rs = (ResultSet)proc.getObject(1);   
  293.   
  294.  while(rs.next())   
  295.   
  296.       {   
  297.   
  298.           System.out.println("       " + rs.getString(1) + "       "+rs.getString(2)+"");   
  299.   
  300.       }   
  301.   
  302.     }   
  303.   
  304.     catch (SQLException ex2) {   
  305.   
  306.       ex2.printStackTrace();   
  307.   
  308.     }   
  309.   
  310.     catch (Exception ex2) {   
  311.   
  312.       ex2.printStackTrace();   
  313.   
  314.     }   
  315.   
  316.     finally{   
  317.   
  318.       try {   
  319.   
  320.         if(rs != null){   
  321.   
  322.           rs.close();   
  323.   
  324.           if(stmt!=null){   
  325.   
  326.             stmt.close();   
  327.   
  328.           }   
  329.   
  330.           if(conn!=null){   
  331.   
  332.             conn.close();   
  333.   
  334.           }   
  335.   
  336.         }   
  337.   
  338.       }   
  339.   
  340.       catch (SQLException ex1) {   
  341.   
  342.       }   
  343.   
  344.     }   
  345.   
  346.   }   
  347.   
  348. }   
  349.   
  350. 在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。   
  351.   
分享到:
评论
3 楼 shiping8000 2012-04-20  
不错 的代码 !顶
2 楼 whoshaofeng 2011-06-30  
气死我了,最关键的地方没看懂。
1 楼 whoshaofeng 2011-06-30  
1.CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)
请问 存储过程的参数需要声明类型吗?

2.OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;  

  请问:这句sql 是哪个版本的语法,或者用技术术语来说,它是哪种游标的用法?

3.你是2007年写的该博客,现在人还在吗?

相关推荐

    Java调用带参数的存储过程并返回集合

    本话题将详细讲解如何使用Java调用带有参数的Oracle存储过程,并获取存储过程返回的集合。 首先,Oracle存储过程是一种预编译的SQL语句集合,它可以在数据库服务器端执行,提高性能,减少网络传输。`PROCEDURE.sql`...

    Java调用存储过程--传入集合参数

    ### Java调用存储过程——传入集合参数:深入解析与实践 #### 核心知识点概览 在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将...

    java调用存储过程返回数组

    总结来说,Java调用存储过程并处理返回数组,需要理解存储过程的定义,正确使用`CallableStatement`或其子类如`OracleCallableStatement`,以及处理Oracle特定数据类型的方法。通过这些技巧,我们可以有效地在Java...

    java调用存储过程(含out参数)

    System.out.println("存储过程返回的OUT参数值:" + outValue); cs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个例子中,`my_procedure`是存储过程名,`123`是...

    java 调用存储过程返回单个值

    ### 二、调用存储过程返回单个值的步骤 #### 2.1 准备工作 首先,确保已正确配置数据库连接。这通常涉及到以下几点: - 加载合适的JDBC驱动程序。 - 建立到数据库的连接。 #### 2.2 创建存储过程 假设我们有一个名...

    java调用存储过程

    这个例子展示了如何调用名为`sp_getCustomerById`的存储过程,该过程接收一个整数ID作为参数,并返回匹配的客户信息。 8. **事务管理** 如果存储过程涉及多个数据库操作,可能需要考虑事务管理。使用`Connection....

    Java调用数据库存储过程[mysql测试通过]

    本篇文章将深入探讨如何使用Java与MySQL数据库进行交互,实现调用存储过程,并提供一个测试通过的实例。 首先,理解存储过程是数据库管理系统提供的一种预编译的SQL语句集合,它封装了特定的功能,可以提高执行效率...

    Java调用oracle存储过程通过游标返回临时表

    如果存储过程返回游标,我们需要声明一个`OUT`参数来接收。 4. **执行存储过程**:通过`pstmt.execute()`执行存储过程。这将打开一个游标,我们可以从游标中获取结果。 5. **处理游标结果**:使用`...

    Java实现调用MySQL存储过程详解

    首先,确保你已经安装了MySQL数据库,并且在数据库中创建了一个或多个存储过程。例如,`findAllBook`、`pro_test`和`pro_user`都是在`book`数据库中的存储过程。你可以使用MySQL命令行客户端或者可视化工具(如MySQL...

    Java调用存储过程

    Java调用存储过程是数据库操作中的常见任务,特别是在复杂业务逻辑和数据处理中。存储过程是一种预编译的SQL语句集合,可以在数据库服务器端执行,提高了效率并减少了网络通信量。本文将详细讲解Java如何调用存储...

    Java调用Mysql存储过程

    总之,Java调用MySQL存储过程是一个涉及JDBC、CallableStatement和数据库交互的过程。理解这些步骤并正确地应用它们,可以有效地利用存储过程提高应用程序的性能和效率。记得在实际开发中,根据实际情况调整代码,...

    java调用存储过程源码 sql数据库

    总的来说,Java调用存储过程是数据库交互的一个重要环节,理解其原理和操作流程对于开发高效、可靠的数据库应用至关重要。在实际项目中,根据具体需求选择合适的设计策略,既能保证功能实现,又能兼顾性能和维护性。

    java调用oracle分页存储过程

    Java调用Oracle分页存储过程是一项常见的数据库操作,尤其在处理大数据量时,为了提高查询效率和用户体验,分页查询显得尤为重要。Oracle数据库提供了一种高效的方法,即通过创建存储过程来实现分页功能,而Java作为...

    java 调用存储过程

    `Procedure.java`文件可能是实现了上述步骤的一个Java类示例,而`Java.jpg`可能是一个关于Java调用存储过程的流程图或者代码截图,用于辅助理解和学习。在开发过程中,结合这些资源可以更好地理解和实践Java调用存储...

    JAVA&C#调用存储过程代码

    以一个简单的例子展示Java调用存储过程: ```java import java.sql.*; public class CallProcedure { public static void main(String[] args) { try { Connection conn = DriverManager.getConnection("jdbc:...

    java 调用存储过程列子

    #### 四、Java调用存储过程 下面通过两个Java类来演示如何调用上面创建的存储过程。 ##### 4.1 调用 `ADDDEPT` 存储过程 ```java public class TestProcedure { Connection conn = null; CallableStatement ...

    java 调用存储过程 实例

    此外,对于更复杂的情况,比如存储过程返回多结果集,可能需要使用`ResultSetMetaData`来获取列信息,然后遍历结果集。 参考上述步骤,你可以根据自己的需求修改并实现调用Oracle存储过程的Java代码。确保正确配置...

    Java调用Oracle存储过程的方法

    - 如果存储过程返回一个游标(CURSOR),可以将其注册为`OUT`参数。例如,`registerOutParameter(index, OracleTypes.CURSOR)`。 - 执行存储过程后,通过`CallableStatement.getObject(index)`获取游标对象,然后...

Global site tag (gtag.js) - Google Analytics