oracle存儲過程實戰練習

總結一下今天學到的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;
可以解決了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章