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.   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值