飛翔的起點

          從這里出發

          導航

          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          統計

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          存儲過程(二)

           

          一:無返回值的存儲過程

              存儲過程為:

            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("<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、取得存儲過程返回的值

               CallableStatement cs = conn.prepareCall("{call proc_fbquery(?,?,?)}"); //調用存儲過程cs.setString(1,mem);cs.setInt(2,n);cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);cs.execute();rs=(ResultSet)cs.getObject(3);

              2、對存儲過程賦值時:

              CallableStatement cs= conn.prepareCall("{call proc_fbquery(?)}"); //調用存儲過程cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);cs.setCursorName(cusorName);  //提供result的名稱cs.setString(1,rs);rs=cs.executeQuery();rs =(ResultSet)cs.getObject(1);

          posted on 2008-04-23 09:45 forgood 閱讀(135) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 双辽市| 霍山县| 互助| 崇文区| 鹤山市| 阿克| 华宁县| 晋城| 遂平县| 汝城县| 新津县| 和政县| 察隅县| 澄迈县| 安龙县| 高要市| 平潭县| 朝阳县| 突泉县| 叶城县| 宜都市| 鹿邑县| 乌兰浩特市| 区。| 遵化市| 湘阴县| 平定县| 安宁市| 龙口市| 宣威市| 贡山| 秭归县| 合阳县| 宁德市| 柘城县| 泌阳县| 辰溪县| 衡阳市| 中江县| 自贡市| 浦北县|