總結一下今天學到的oracle之procedure
procedure即oracle 的存儲過程
語法:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1 [{IN|OUT|IN OUT}] datatype
[{:=|DEFAULT} expression]
[(parameter2 [{IN|OUT|IN OUT}] datatype
[{:=|DEFAULT} expression]
...])]
{IS|AS}
[declarations]
BEGIN
code
[EXCEPTION]
exception_handlers]
END
存儲過程的三中參數模式:IN、 OUT 、IN OUT
參數傳遞的方式有兩種:
參數位置對應法
參數命名傳遞法(採用此方法是調用參數的順序不必和定義時的順序一致)
IN 只讀模式 OUT 只寫模式 IN OUT 讀/寫模式
例如:
根據用戶輸入的city值,查詢該城市中每個顧客下的訂單的總額(即dollars的總數)。要求定義一個存儲過程,以city值爲參數。過程中定義以city爲參數的遊標,逐個計算該城市中每個顧客的訂單金額的總額。要求以下列格式顯示查詢的結果:
城市名稱=xxxxx
顧客編號=xxxx 訂單總額=xxxxxx
create or replace procedure show_user_cost (p_city in varchar2) as
type t_customers is ref cursor;
v_CursorVal t_customers;
v_cname customers.cid%type;
v_dollar orders.dollars%type;
begin
open v_CursorVal for select orders.cid,sum(orders.dollars) from orders where orders.cid
in (select customers.cid from customers where customers.city=p_city) group by orders.cid;
if v_CursorVal%rowcount =0 then
DBMS_OUTPUT.PUT_LINE('未找到該城市數據');
else
DBMS_OUTPUT.PUT_LINE('城市名稱='||p_city);
loop
fetch v_CursorVal into v_cname,v_dollar;
exit when v_CursorVal%notfound;
DBMS_OUTPUT.PUT_LINE('顧客編號='||v_cname||' 訂單總額='||v_dollar);
end loop;
end if;
close v_CursorVal;
end show_user_cost;
說到procedure 我們也自然會說到oracle的函數 FUNCTION
CREATE OR REPLACE FUNCTION 函數名
RETURN 返回值類型
IS
聲明部分;
BEGIN
函數體;
RETURN 變量;
END;
在寫一個返回判斷結果的function 時返回的是boolean型。
編譯成功,通過select fun() from dual;時始終不能輸出TRUE OR FALSE;報invalide datatype的錯誤
後來查閱資料才知道,boolean類型式不能直接輸出
begin
if qty_check('P01',9000) then
dbms_output.put_line('Y');
else
dbms_output.put_line('N');
end if;
end;
可以解決了。