存儲過程基礎

覺得很有必要把基礎的東西寫下來備忘。

 

  • 語句塊定義:

Sql代碼  

decalre
-- 變量聲明
var1 number(2);                -- 僅聲明
var2 char(2) := '11';          -- 在聲明的同時初始化
begin
        -- 語句
end; -- 語句塊結束

 

  • if 語句

Sql代碼  
if a = 1 or b = 2 then
elsif c = 3 then
else
end if;

 

  • case 語句

case語句如果作爲分支控制語句,最後結束語句是end case,如果是作爲select語句裏的控制語句則只需要end。

Sql代碼  

declare
num number(10) := 1;
begin
    case 
        when num = 0 then dbms_output.put_line( 'zero');
        when num = 1 then dbms_output.put_line( 'one');
        else  dbms_output.put_line( 'default');
    end case;
    
    case num
        when 0 then dbms_output.put_line( 'zero');
        when 1 then dbms_output.put_line( 'one');
        else  dbms_output.put_line( 'default');
    end case;
end;

 

  • for 循環

for循環主要有兩個用處。

 

循環一個範圍
格式:for i in [start .. end] loop ... end loop;
Sql代碼  
for i in 0..9 loop   
    dbms_output.put_line('i:' || i);   
end loop;  
  for i in 0..9 loop
      dbms_output.put_line('i:' || i);
  end loop;

 


2、遍歷隱式遊標

隱式遊標的好處是不需要手動關閉,方便

Sql代碼  

for currow in (   
   select t.col1, t.col2   
   from tableName t   
   where ...   
) loop   
    if currow.col1 = 0 then  
       return;    -- 中止sp,返回   
   end if;   
end loop;  
for currow in (
   select t.col1, t.col2
   from tableName t
   where ...
) loop
    if currow.col1 = 0 then
       return;    -- 中止sp,返回
   end if;
end loop;
isok := 9;   
while isok >= 0 loop   
      isok := isok - 1;   
        
      if isok = 8 then  
         continue;                -- 與編程語言的 continue 語義一樣,跳過當前循環的剩餘語句,回到循環開始   
      end if;   
        
      if isok = 4 then  
         exit;                    -- 與編程語言的 break 語義一樣,跳出循環   
      end if;   
  
      dbms_output.put_line('isok:' || isok);   
end loop;   
  
dbms_output.put_line('outside while loop .');  
    isok := 9;
    while isok >= 0 loop
          isok := isok - 1;
         
          if isok = 8 then
             continue;                -- 與編程語言的 continue 語義一樣,跳過當前循環的剩餘語句,回到循環開始
          end if;
         
          if isok = 4 then
             exit;                    -- 與編程語言的 break 語義一樣,跳出循環
          end if;
          dbms_output.put_line('isok:' || isok);
    end loop;
   
    dbms_output.put_line('outside while loop .');

 

  • 存儲過程定義

Sql代碼    

create or replace procedure sp_name (
        -- 入參、出參列表, 逗號分隔。
        uid in varchar2,                          -- 不能帶長度信息
        startDate in date,                        -- 第二個輸入參數
        defaultVar in varchar2 default "",        -- 默認參數,如果不傳,要注意參數的順序
        isok out number,                          -- 輸出參數
        result out varchar2                       -- 第二個輸出參數
)
as
-- 變量聲明,每個聲明用分號結束。可以在聲明的同時初始化
var1 varchar2(11);
var2 number(2) := 123;
begin
        -- 字符串拼接用 ||
        dbms_output.put_line('isok:' || 'abc');
       
        -- 調用其他存儲過程
        sub_sp_name(param1, prarm2, outParam1, outParam2);
end;        -- 存儲過程結束

 

  • 函數定義

Sql代碼    

create or replace function func  (
        -- 入參、出參列表, 逗號分隔。
        uid in varchar2,                          -- 不能帶長度信息
        startDate in date,                        -- 第二個輸入參數
        defaultVar in varchar2 default "",        -- 默認參數,如果不傳,要注意參數的順序
        isok out number,                          -- 輸出參數
        result out varchar2                       -- 第二個輸出參數
)
return number      -- 定義返回類型
as
-- 變量聲明,每個聲明用分號結束。可以在聲明的同時初始化
var1 varchar2(11);
var2 number(2) := 123;
begin
        -- 字符串拼接用 ||
        dbms_output.put_line('isok:' || 'abc');
       
        return ret_val;
end;

 

  • 存儲過程與函數異同

1、兩者定義類似,都可以帶輸入輸出參數。
2、函數有返回值,存儲過程沒有。
3、函數的調用要在select語句裏;而存儲過程不用,可以獨立調用。

  • 遊標

隱式遊標
隱式遊標的好處是不需要手動關閉,方便

Sql代碼   

for currow in (
   select t.col1, t.col2
   from tableName t
   where ...
) loop
    if currow.col1 = 0 then
       return;    -- 中止sp,返回
   end if;
end loop;

 

顯式遊標

Sql代碼    

declare
isok integer;
v_event_id number(10);
v_isagain number(2);
v_rate number(2);
v_sender char(11) := '13800138000';
cursor cursorVar is select event_id, isagain, rate from call_event where sender = v_sender; -- 聲明遊標
begin
    open cursorVar;    -- 打開遊標
    loop
         fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值
         exit when cursorVar%notfound;                             --當沒有記錄時退出循環
         dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate);
    end loop;
   
    close cursorVar;   -- 關閉遊標
   
    --遊標的屬性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT; 
    --%FOUND:已檢索到記錄時,返回true 
    --%NOTFOUNRD:檢索不到記錄時,返回true 
    --%ISOPEN:遊標已打開時返回true 
    --%ROWCOUNT:代表檢索的記錄數,從1開始 
end;

 

帶參數遊標

Sql代碼  

declare  
isok integer;   
v_event_id number(10);   
v_isagain number(2);   
v_rate number(2);   
  
v_sender char(11) := '13800138000';   
  
cursor cursorVar(p_sender varchar2) is select event_id, isagain, rate from call_event where sender = p_sender; -- 聲明遊標   
  
begin  
    open cursorVar(v_sender);    -- 打開遊標,在括號裏傳參。   
    loop   
         fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值   
         exit when cursorVar%notfound;                             --當沒有記錄時退出循環   
         dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate);   
    end loop;   
      
    close cursorVar;   -- 關閉遊標   
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章