存儲過程 就是一組用於完成特定功能的PL/SQL 具名語句塊,該SQL語句集經過編譯後存儲在資料庫系統中。在使用時候,我們只需要通過指定已經定義的存儲過程名字並給出對應的參數來執行 存儲過程的定義語法 create or replace procedure 過程名(參數名 參數模式 參數類型,參數名 ...
存儲過程 就是一組用於完成特定功能的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 ;