-- PL/SQL簡介:
1.PL/SQl是過程語言PL與結構化語言SQL結合而成的程式語言
2.PL/SQL引擎駐留在Oracle伺服器中
3.該引擎接收PL/SQL塊並對其進行編譯
-- PL/SQL 塊:
是構成PL/SQL的基本組成單元,將邏輯上相關的宣告和語句組合在一起
PL/SQL分為三個部分,宣告部分,可執行部分,和例外處理部分
-- PL/SQL 語法:
[declare
宣告部分]
[begin
可執行部分
]
[exception
例外處理部分
end
]
/*
PL/SQL是一種強型別的程式語言,所有的變數都必須在宣告之後才可以使用,
變數都要求在declare部分進行宣告,對於變數名稱有如下規定:
1.變數名可以是字母數位下劃線$#等組成
2.所有的變數名稱要求以字母開頭,不能是Oracle中的關鍵字
3.變數的長度最多隻能為30個字元
-- 為了提高PL/SQL的可讀性,所有變數採用"v_變數名"進行定義
*/
declare
v_name varchar2(20) :='我是誰?';
begin
-- 輸出操作
dbms_output.put_line('pl/sql的輸出操作' || v_name); -- PL/SQL 中字串使用||連線
end;
-- 使用into為變數賦值
declare
v_name varchar2(20);
begin
-- 通過SQL語句和into關鍵字為變數賦值
select uname into v_name from user_book where userid=9999;
dbms_output.put_line(v_name); -- 列印
end;
-- %type指定的欄位的型別
declare
v_name user_book.uname%type;
v_id user_book.userid%type;
begin
-- 為欄位賦值
select user_book.uname,user_book.userid into v_name,v_id
from user_book
where user_book.userid=9999;
-- 輸出看結果
dbms_output.put_line(v_id || v_name);
end;
-- %rowtype 代表表中的整行的資料
declare
v_row user_book%rowtype;
begin
-- 賦值
select * into v_row from user_book where user_book.userid=9999;
-- 輸出行中的資料: 注意此時必須手動將行內的所有欄位寫入輸出語句,否則會報錯
dbms_output.put_line(v_row.uname||v_row.userid||v_row.urole );
end;
-- 條件判斷語句
/* 1. if else 語句:
if 條件1
then 滿足條件1時執行的語句
else 條件2
then 滿足條件2時執行的語句
*/
/* 2. case when 語句:
case when 條件1
then 滿足條件1時執行的程式碼
when 條件2
then 滿足條件2時執行的程式碼
when 條件3
then 滿足條件3時執行的程式碼
else 以上條件都不滿足時執行的程式碼
end case;
*/
-- 迴圈
/* -- 1.exit when 退出迴圈:
loop
迴圈執行的語句塊;
exit when迴圈結束條件;
步進語句;
end loop;
*/
declare
v_i int := 0; -- 宣告變數
begin
loop
dbms_output.put_line(v_i); -- 迴圈塊: 列印v_i
exit when v_i >= 10; -- 結束條件
v_i := v_i+1; -- 步進語句
end loop;
end;
/* -- 2.while迴圈:
while 迴圈結束條件
loop
迴圈體;
步進語句;
end loop;
*/
declare
v_i int := 0; -- 宣告變數
begin
while exit when v_i >= 10; -- 結束條件
loop
dbms_output.put_line(v_i); -- 迴圈塊: 列印v_i
v_i := v_i+1; -- 步進語句
end loop;
end;
/* -- 3.for in 迴圈:
for 迴圈索引變數 in [recerse] -- reverse: 反向
迴圈區域下限..迴圈區域上線
loop
迴圈語句塊;
end loop ;
*/
declare
begin
for i in 1..10 -- 從1到10 正序
loop
dbms_output.put_line(i); -- 列印i
end loop;
end;
-- 例外處理
/*
1.定義:在執行異常時出現的錯誤叫做異常
2.特點: 發生異常後,語句將停止執行,控制權轉移到PL/SQL塊的例外處理部分
3.異常的三種型別:
預定義異常:當PL/SQL程式違反Oracle規則或超越系統限制時隱式引發;
使用者不需要在程式中定義;
非預定義異常:當PL/SQL程式違反Oracle規則或超越系統限制時引發;
使用者需要在程式中定義;
使用者定義異常:需要使用者在程式中定義,顯式的在程式中引發;
*/
-- 例外處理程式的語法:
begin
常規程式碼塊;
exception
when 異常條件1滿足 then 異常條件1滿足時執行的程式碼
when 異常條件2滿足 then 異常條件2滿足時執行的程式碼
when others then 都不滿足時執行的程式碼
end;
-- 常見的系統異常:
-- 資料過多: to_many_rows
-- 查詢的資料不存在: no_data_found
declare
v_error exception;
v_name user_book.uname%type;
begin
select uname into v_name from user_book where user_book.userid=100000; -- 此時的userid是不存在的
end;
-- 使用者自定義異常
-- -----------------------------------
declare
v_error exception;
v_name user_book.uname%type;
begin
select uname into v_name from user_book where user_book.userid=100000;
if v_name = '張三' then -- 如果滿足條件則返回v_error
raise v_error;
end if;
exception
when v_error then -- 當出現此異常的時候觸發
dbms_output.put_line('原來是張三啊,拋個異常給你吧');
end;