oracle存儲過程4811838814.doc_第1頁
oracle存儲過程4811838814.doc_第2頁
oracle存儲過程4811838814.doc_第3頁
oracle存儲過程4811838814.doc_第4頁
oracle存儲過程4811838814.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

、什么是存儲過程。存儲過程是數(shù)據(jù)庫服務(wù)器端的一段程序,它有兩種類型。一種類似于SELECT查詢,用于檢索數(shù)據(jù),檢索到的數(shù)據(jù)能夠以數(shù)據(jù)集的形式返回給客戶。另一種類似于INSERT或DELETE查詢,它不返回數(shù)據(jù),只是執(zhí)行一個動作。有的服務(wù)器允許同一個存儲過程既可以返回數(shù)據(jù)又可以執(zhí)行動作。2、什么時候需要用存儲過程如果服務(wù)器定義了存儲過程,應(yīng)當(dāng)根據(jù)需要決定是否要用存儲過程。存儲過程通常是一些經(jīng)常要執(zhí)行的任務(wù),這些任務(wù)往往是針對大量的記錄而進行的。在服務(wù)器上執(zhí)行存儲過程,可以改善應(yīng)用程序的性能。這是因為:.服務(wù)器往往具有強大的計算能力和速度。.避免把大量的數(shù)據(jù)下載到客戶端,減少網(wǎng)絡(luò)上的傳輸量。例如,假設(shè)一個應(yīng)用程序需要計算一個數(shù)據(jù),這個數(shù)據(jù)需要涉及到許多記錄。如果不使用存儲過程的話,把這些數(shù)據(jù)下載到客戶端,導(dǎo)致網(wǎng)絡(luò)上的流量劇增。不僅如此,客戶端可能是一臺老掉牙的計算機,它的運算速度很慢。而改用存儲過程后,服務(wù)器會很快地把數(shù)據(jù)計算出來,并且只需傳遞一個數(shù)據(jù)給客戶端,其效率之高是非常明顯的。3、存儲過程的參數(shù)要執(zhí)行服務(wù)器上的存儲過程,往往要傳遞一些參數(shù)。這些參數(shù)分為四種類型:第一種稱為輸入?yún)?shù),由客戶程序向存儲過程傳遞值。第二種稱為輸出參數(shù),由存儲過程向客戶程序返回結(jié)果。第三種稱為輸入/輸出參數(shù),既可以由客戶程序向存儲過程傳遞值,也可以由存儲過程向客戶程序返回結(jié)果。第四種稱為狀態(tài)參數(shù),由存儲過程向客戶程序返回錯誤信息。要說明的是,并不是所有的服務(wù)器都支持上述四種類型的參數(shù),例如,InterBase就不支持狀態(tài)參數(shù)。4、oracle 存儲過程的基本語法 1.基本結(jié)構(gòu)CREATE OR REPLACEPROCEDURE 存儲過程名字( 參數(shù)1 IN NUMBER, 參數(shù)2 IN NUMBER) IS變量1 INTEGER :=0;變量2 DATE;BEGIN END 存儲過程名字2.SELECT INTO STATEMENT 將select查詢的結(jié)果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條 記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 變量1,變量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END;一:無返回值的存儲過程存儲過程為:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGIN INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);END TESTA;然后呢,在java里調(diào)用時就用下面的代碼: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,里面兩個字段(I_ID,I_NAME)。二:有返回值的存儲過程(非列表)存儲過程為:CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) ASBEGIN SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; END TESTB;在java里調(diào)用時就用下面的代碼: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并非任意的,而是和存儲過程中的out列對應(yīng)的,如果out是在第一個位置,那就是proc.getString(1),如果是第三個位置,就是proc.getString(3),當(dāng)然也可以同時有多個返回值,那就是再多加幾個out參數(shù)了。三:返回列表由于oracle存儲過程沒有返回值,它的所有返回值都是通過out參數(shù)來替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage了.所以要分兩部分,1, 建一個程序包。如下:CREATE OR REPLACE PACKAGE TESTPACKAGE ASTYPE 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 參數(shù)來返回值的。在java里調(diào)用時就用下面的代碼: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) ex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論