Oracle 的存儲過程以及用jdbc調用存儲過程


存儲過程 就是一組用於完成特定功能的PL/SQL 具名語句塊,該SQL語句集經過編譯后存儲在數據庫系統中。在使用時候,我們只需要通過指定已經定義的存儲過程名字並給出對應的參數來執行 

存儲過程的定義語法

create or replace procedure 過程名(參數名 參數模式 參數類型,參數名 參數模式 參數類型,..... )

is

    這里是聲明變量的區域

begin 

    這里是執行的語句塊

end;

end 過程名;

注意:當我們定義參數類型時 只能定義他的類型 不能定義他的長度 

 參數模式:in 輸入的參數 ,一般為查詢參數

                out 輸出的參數 

                in out 既能當做輸入的參數 也能當做輸出的參數

 如果是沒有參數的存儲過程,則過程名后不能有()

定義一個存儲過程沒有參數

 1 --存儲過程 沒有參數
 2 create or replace procedure first_pro
 3 is
 4 begin 
 5 DBMS_OUTPUT.PUT_LINE('hello_pro');
 6 end first_pro;
 7 
 8 
 9 -- 執行存儲過程
10 begin 
11 first_pro();
12 end;
 1 -- 定義一個存儲過程,要求傳入兩個參數,都是數字,實現兩個數相加,並將結果返回
 2 create or replace procedure sum_pro(x in number ,y out number)
 3 is
 4 
 5 begin
 6 y:=x+y;
 7 end sum_pro; 
10 --執行存儲過程 11 declare 12 res number; 13 begin 14 -- 注意 當參數模式為 out, in out 那么在傳參的時候 我們不能直接去傳值而是應該傳一個變量 15 res:=3; 16 sum_pro(4,res); 17 end;

1 -- 設計一個存儲過程,用於根據員工編號,查詢出一條員工記錄 2 create or REPLACE PROCEDURE getempbyid_pro(eno in emp.empno%type, emp out emp%rowtype) 3 is 4 begin 5 select *into emp from emp where empno=eno; 6 end getempbyid_pro; 7 8 9 -- 執行存儲過程 10 DECLARE 11 -- 這里的eno可在調用過程名的時候直接傳值 也可以將值給一個變量 因為他是一個輸入參數 12 -- eno emp.empno%type:=7369; 13 emp1 emp%rowtype; 14 begin 15 getempbyid_pro(7369,emp1); 16 DBMS_OUTPUT.put_line(emp1.ename); 17 end ; 18

使用jdbc連接並操作數據庫

1.首先要想連接數據庫的話就必須要有一個驅動包 ojdbc6.jar  如果安裝的jdk5.0之前的可以使用6以下的版本 我的是jdk8.0 這個包在我們安裝oracle的時候就已經幫我們下好了

我們只需要在oracle的下載路徑下去找就可以找到 不用下

 

 2 接下來就可以去連接Oracle了 注意當我們創建連接的時候 最好先測試一下看連接是否成功 成功了 然后在往下面編寫代碼 連接成功后

1)先要獲得存儲過程的語句對象

2).然后在為輸入參數賦值

3).注冊輸出參數類型

4).獲取數據

5).關閉資源

 

 1 package jdbc_oracle;
 2 import java.sql.CallableStatement;
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import oracle.jdbc.OracleTypes;
 8 public class Test1 {
 9     public static void main(String[] args) throws SQLException {
10         // 獲取連接
11         Connection con = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/orcl", "hengly", "hengly");
System.out.println("連接成功"); 12 // 獲得可以執行存儲過程的語句對象 , ?代表的是參數, emp_package是我在orcale中定義的包頭的名稱 ,getEmpbyId 是存儲過程的名稱 13 CallableStatement cs = con.prepareCall("call emp_package.getEmpbyId(?,?)"); 14 // 為存儲過程設值 為第一個參數賦值 輸入參數可以直接賦值 15 cs.setInt(1, 7369); 16 // 為cs注冊輸出參數類型 如果為輸出參數就必須要注冊 17 cs.registerOutParameter(2, OracleTypes.CURSOR); 18 // 執行 19 cs.execute(); 20 // 獲取數據 21 ResultSet res = (ResultSet) cs.getObject(2); 22 // 算出有多少列 23 int num = res.getMetaData().getColumnCount(); 24 while (res.next()) { 25 for (int i = 0; i < num; i++) { 26 String s1 = res.getString(i + 1); 27 System.out.print(s1 + " "); 28 } 29 } 30 // 關閉資源, 先開后關閉 31 res.close(); 32 cs.close(); 33 con.close(); 34 35 } 36 37 }
 1 CREATE OR REPLACE PACKAGE emp_package
 2 AS
 3  -- 定義一個動態游標
 4  TYPE emp_cursor IS REF CURSOR;
 5  -- 定義一個根據編號查詢信息的存儲過程
 6  PROCEDURE getEmpbyId(eno emp.empno%type,ec out emp_cursor);
 7 END emp_package ;
 8 
 9 -- 編寫包體
10 CREATE OR REPLACE PACKAGE BODY emp_package
11 AS
12     PROCEDURE getEmpbyId(eno emp.empno%type,ec out emp_cursor)
13     AS
14     BEGIN
15         OPEN ec FOR select * from emp where empno=eno;
16     END getEmpbyId ;
17 END emp_package ;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM