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

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

存儲過程的定義語法sql

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

isoracle

    這裏是聲明變量的區域測試

begin spa

    這裏是執行的語句塊設計

end;code

end 過程名;對象

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

 參數模式: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 ;
相關文章
相關標籤/搜索