--異常測試declarev_ename emp.empno%type;--定義變數beginselect ename into v_ename from emp where empno = &gno;dbms_output.put_line('名字:' || v_ename);exception when no_data_found then dbms_output.put_line('未找到');end;/
pl/sql是什麼
pl/sql(procedural language/sql)是oracle在標準的sql語言上的擴充。pl/sql不僅允許嵌入sql語言,還可以定義變數和常量,允許使用條件陳述式和迴圈語句,允許使用例外處理各種錯誤,這樣使得它的功能變得更加強大。
看圖:
為什麼學pl/sql
學習必要性
1.提高應用程式的運行效能
2.模組化的設計思想【分頁的過程,訂單的過程,轉賬的過程。。】
3.減少網路傳輸量
4.提高安全性(sql會包括表名,有時還可能有密碼,傳輸的時候會泄露。PL/SQL就不會)
為什麼PL/SQL會快呢?看圖:
不好的地方:
移植性不好(換資料庫就用不了),
用什麼編寫pl/sql
sqlplus開發工具
sqlplus是oracle公司提供的一個工具,這個因為我們在以前介紹過的:
舉一個簡單的案例:
編寫一個預存程序,該過程可以向某表中添加記錄。
1.建立一個簡單的表
Sql代碼
- create table mytest(name varchar2(30),passwd varchar2(30));
createtable mytest(name varchar2(30),passwd varchar2(30));
2.建立過程
Sql代碼
- create or replace procedure sp_pro1 is
- begin--執行部分
- insert into mytest values('韓順平','m1234');
- end;
- /
create or replace procedure sp_pro1 is
begin--執行部分
insert into mytest values('韓順平','m1234');
end;
/
replace:表示如果有sp_pro1,就替換
如何查看錯誤資訊:showerror;
如何調用該過程:
1)exec 過程名(參數值1,參數值2...);
2)call 過程名(參數值1,參數值2...);
pl/sqln developer開發工具
pl/sql developer是用於開發pl/sql塊的整合式開發環境(ide),它是一個獨立的產品,而不是oracle的一個附帶品。
舉一個簡單案例:
編寫一個預存程序,該過程可以刪除某表記錄。
Sql代碼
- create or replace procedure sp_pro2 is
- begin--執行部分
- delete from mytest where name='韓順平';
- end;
createor replace procedure sp_pro2 is
begin--執行部分
deletefrom mytest where name='韓順平';
end;
pl/sql介紹
介紹
開發人員使用pl/sql編寫應用模組時,不僅需要掌握sql語句的編寫方法,還要掌握pl/sql語句及文法規則。pl/sql編程可以使用變數和邏輯控制語句,從而可以編寫非常有用的功能模組。比如:分頁預存程序模組、訂單處理預存程序模組、轉賬預存程序模組。而且如果使用pl/sql編程,我們可以輕鬆地完成非常複雜的查詢要求。
pl/sql可以做什麼
簡單分類
|————過程(預存程序)
|
|————函數
塊(編程)—————|
|————觸發器
|
|————包
編寫規範
1.注釋
單行注釋 --
Sql代碼
- select * from emp where empno=7788; --取得員工資訊
select* from emp where empno=7788; --取得員工資訊
多行注釋 /*...*/來劃分
2.標誌符號的命名規範
1).當定義變數時,建議用v_作為首碼v_sal
2).當定義常量時,建議用c_作為首碼c_rate
3).當定義遊標時,建議用_cursor作為尾碼emp_cursor
4).當定義例外時,建議用e_作為首碼e_error
pl/sql塊介紹
介紹
塊(block)是pl/sql的基本程式單元,編寫pl/sql程式實際上就是編寫pl/sql塊,要完成相對簡單的應用功能,可能只需要編寫一個pl/sql塊,但是如果想要實現複雜的功能,可能需要在一個pl/sql塊中嵌套其它的pl/sql塊。
塊結構n
pl/sql塊由三個部分構成:定義部分,執行部分,例外處理部分。
如下所示:
Declare
/*定義部分——定義常量、變數、遊標、例外、複雜資料類型*/
begin
/*執行部分——要執行的pl/sql語句和sql語句*/
exception
/*例外處理部分——處理啟動並執行各種錯誤*/
end;
定義部分是從declare開始的,該部分是可選的;
執行部分是從begin開始的,該部分是必須的;
例外處理部分是從exception開始的,該部分是可選的。
可以和java編程結構做一個簡單的比較。
pl/sql塊的執行個體(1)
執行個體1-只包括執行部分的pl/sql塊
Sql代碼
- set serveroutput on --開啟輸出選項
- begin
- dbms_output.put_line('hello');
- end;
setserveroutput on --開啟輸出選項
begin
dbms_output.put_line('hello');
end;
相關說明:
dbms_output是oracle所提供的包(類似java的開發包),該包包含一些過程,put_line就是dbms_output包的一個過程。
pl/sql塊的執行個體(2)
執行個體2-包含定義部分和執行部分的pl/sql塊n
Sql代碼
- declare
- v_ename varchar2(5); --定義字串變數
- begin
- select ename into v_ename from emp where empno=&aa;
- dbms_output.put_line('僱員名:'||v_ename);
- end;
- /
declare
v_ename varchar2(5); --定義字串變數
begin
select ename into v_ename from emp whereempno=&aa;
dbms_output.put_line('僱員名:'||v_ename);
end;
/
如果要把薪水也顯示出來,那麼執行部分就應該這麼寫:
Sql代碼
- select ename,sal into v_ename,v_sal from emp where empno=&aa;
selectename,sal into v_ename,v_sal from emp where empno=&aa;
相關說明:
& 表示要接收從控制台輸入的變數。看圖:
pl/sql塊的執行個體(3)
執行個體3-包含定義部分,執行部分和例外處理部分n
為了避免pl/sql程式的運行錯誤,提高pl/sql的健壯性,應該對可能的錯誤進行處理,這個很有必要。
1.比如在執行個體2中,如果輸入了不存在的僱員號,應當做例外處理。
2.有時出現異常,希望用另外的邏輯處理,[網示]
我們看看如何完成1的要求。
相關說明:
oracle事先預定義了一些例外,no_data_found就是找不到資料的例外。