飛翔的起點(diǎn)

          從這里出發(fā)

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          存儲(chǔ)過(guò)程(二)

           

          一:無(wú)返回值的存儲(chǔ)過(guò)程

              存儲(chǔ)過(guò)程為:

            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里調(diào)用時(shí)就用下面的代碼:

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

              }

              }

              }

              }

          當(dāng)然了,這就先要求要建張表TESTTB,里面兩個(gè)字段(I_ID,I_NAME)。

              二:有返回值的存儲(chǔ)過(guò)程(非列表)

              存儲(chǔ)過(guò)程為:

           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里調(diào)用時(shí)就用下面的代碼:

             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)中的數(shù)值2并非任意的,而是和存儲(chǔ)過(guò)程中的out列對(duì)應(yīng)的,如果out是在第一個(gè)位置,那就是proc.getString(1),如果是第三個(gè)位置,就是proc.getString(3),當(dāng)然也可以同時(shí)有多個(gè)返回值,那就是再多加幾個(gè)out參數(shù)了。

              三:返回列表

              由于oracle存儲(chǔ)過(guò)程沒(méi)有返回值,它的所有返回值都是通過(guò)out參數(shù)來(lái)替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage了。所以要分兩部分,

              1, 建一個(gè)程序包。如下:

             CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

              TYPE Test_CURSOR IS REF CURSOR

              end TESTPACKAGE

              2,建立存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程為:

              CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS

              BEGIN

              OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB

              END TESTC

               可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來(lái)返回值的。

              在java里調(diào)用時(shí)就用下面的代碼:

           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、取得存儲(chǔ)過(guò)程返回的值

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

              2、對(duì)存儲(chǔ)過(guò)程賦值時(shí):

              CallableStatement cs= conn.prepareCall("{call proc_fbquery(?)}"); //調(diào)用存儲(chǔ)過(guò)程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) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大余县| 新源县| 眉山市| 山阴县| 类乌齐县| 丹寨县| 启东市| 广州市| 股票| 都昌县| 枣阳市| 德江县| 古浪县| 凯里市| 昂仁县| 毕节市| 连云港市| 太和县| 天津市| 台南县| 金阳县| 和平县| 利辛县| 繁峙县| 堆龙德庆县| 海林市| 通江县| 泰州市| 福贡县| 郎溪县| 沙坪坝区| 丰县| 赤壁市| 普陀区| 濮阳县| 台江县| 堆龙德庆县| 天津市| 普兰店市| 菏泽市| 永定县|