1. 程式人生 > >Oracle-day04 中

Oracle-day04 中

Oracle

(六)循環
1.無條件循環
語法結構


loop
--循環語句
end loop;

範例:輸出從1開始的100個數

declare
v_num number:=1;
begin
loop
dbms_output.put_line(v_num);
v_num:=v_num+1;
exit when v_num>100;
end loop;
end ;

2、條件循環
語法結構

while 條件
loop

end loop;

範例:輸出從1開始的100個數

declare
v_num number:=1;
begin
while v_num<=100
loop
dbms_output.put_line(v_num);
v_num:=v_num+1;
end loop;
end ;

3、for循環
基本語法

for 變量 in 起始值..終止值
loop
end loop;

範例:輸出從1開始的100個數

begin
for v_num in 1..100
loop
dbms_output.put_line(v_num);
end loop;
end;

(七)遊標
1.什麽是遊標
遊標是系統為用戶開設的一個數據緩沖區,存放 SQL 語句的執行結果。我們
可以把遊標理解為 PL/SQL 中的結果集。

技術分享圖片

2.語法結構及示例
在聲明區聲明遊標,語法如下:

cursor 遊標名稱 is SQL 語句;
使用遊標語法

open 遊標名稱
loop
fetch 遊標名稱 into 變量
exit when 遊標名稱%notfound
end loop;
close 遊標名稱

需求:打印業主類型為 1 的價格表
代碼:

declare
v_pricetable T_PRICETABLE%rowtype;--價格行對象
cursor cur_pricetable is select * from T_PRICETABLE where
ownertypeid=1;--定義遊標
begin

open cur_pricetable;--打開遊標
loop
fetch cur_pricetable into v_pricetable;--提取遊標到變量
exit when cur_pricetable%notfound;--當遊標到最後一行下面退
出循環
dbms_output.put_line( ‘價格:‘
||v_pricetable.price ||‘噸位:
‘||v_pricetable.minnum||‘-‘||v_pricetable.maxnum );
end loop;
close cur_pricetable;--關閉遊標
end ;

運行結果如下:
技術分享圖片
3.帶參數的遊標
我們的查詢語句的條件值有可能是在運行時才能決定的,比如性業主類型,
可能是運行時才可以決定,那如何實現呢?我們接下來學習帶參數的遊標,修改
上述案例

declare
v_pricetable T_PRICETABLE%rowtype;--價格行對象
cursor cur_pricetable(v_ownertypeid number) is select *
from T_PRICETABLE where ownertypeid=v_ownertypeid;--定義遊
標
begin

open cur_pricetable(2);--打開遊標
loop
fetch cur_pricetable into v_pricetable;--提取遊標到變量
exit when cur_pricetable%notfound;--當遊標到最後一行下面退
出循環
dbms_output.put_line(‘價格:‘||v_pricetable.price ||‘噸
位:‘||v_pricetable.minnum||‘-‘||v_pricetable.maxnum );
end loop;
close cur_pricetable;--關閉遊標
end ;

4.for循環提取遊標值
我們每次提取遊標,需要打開遊標 關閉遊標 循環遊標 提取遊標 控制循環的
退出等等,好麻煩!有沒有更簡單的寫法呢?有!用 for 循環一切都那麽簡單,
上例的代碼可以改造為下列形式

declare
cursor cur_pricetable(v_ownertypeid number) is select *
from T_PRICETABLE where ownertypeid=v_ownertypeid;--定義遊
標
begin
for v_pricetable in cur_pricetable(3)
loop
dbms_output.put_line(‘價格:‘||v_pricetable.price ||‘噸
位:‘||v_pricetable.minnum||‘-‘||v_pricetable.maxnum );
end loop;
end ;

二、存儲函數
(一)什麽是存儲函數
存儲函數又稱為自定義函數。可以接收一個或多個參數,返回一個結果。
在函數中我們可以使用 P/SQL 進行邏輯的處理。
(二)存儲函數語法結構
創建或修改存儲過程的語法如下:

CREATE [ OR REPLACE ] FUNCTION 函數名稱
(參數名稱 參數類型, 參數名稱 參數類型, ...)
RETURN 結果變量數據類型
IS
變量聲明部分;
BEGIN
邏輯部分;
RETURN 結果變量;
[EXCEPTION
異常處理部分]
END;

(三)案例
需求: 創建存儲函數,根據地址 ID 查詢地址名稱。
語句:

create function fn_getaddress(v_id number)
return varchar2
is
v_name varchar2(30);
begin
select name into v_name from t_address where id=v_id;
return v_name;
end;

測試此函數:

select fn_getaddress(3) from dual
輸出內容
技術分享圖片
需求:查詢業主 ID,業主名稱,業主地址,業主地址使用剛才我們創建的函數
來實現。

select id 編號,name 業主名稱,fn_getaddress(addressid) 地址
from t_owners

查詢結果如下:

技術分享圖片

Oracle-day04 中