1 CREATE OR REPLACE PROCEDURE MyProName IS
2 BEGIN
3 NULL; 4 END;
行1:CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle數據庫去建立一個叫作skeleton存儲過程, 若是存在就覆蓋它;sql
行2:IS關鍵詞代表後面將跟隨一個PL/SQL體。數據庫
行3:BEGIN關鍵詞代表PL/SQL體的開始。函數
行4:NULL PL/SQL語句代表什麼事都不作,這句不能刪去,由於PL/SQL體中至少須要有一句;oop
行5:END關鍵詞代表PL/SQL體的結束spa
如今想給存儲過程加上參數,定義變量怎麼處理呢?以下code
1 CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as 2 v_cnt number; --定義變量1 3 tablename1 varchar2(80); --定義變量2 4 sqlTxt varchar2(2000); --定義變量2 5 BEGIN 6 --處理邏輯 7 NULL; 8 END;
(1)存儲過程參數不帶取值範圍,in表示傳入,out表示輸出;類型能夠使用任意Oracle中的合法類型。blog
(2) 變量帶取值範圍,後面接分號事務
CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as v_cnt number; --定義變量1 tablename1 varchar2(80); --定義變量2 sqlTxt varchar2(2000); --定義變量2 BEGIN --處理邏輯 NULL; commit;--提交事務 Exception When others then Dbms_output.Put_line(sqlerrm);--打印輸出錯誤 Rollback;--回滾事務 END;
提交事務,存在異常則回滾事務;it
遊標遍歷io
CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2, param2 out varchar2) as v_cnt number; --定義變量1 tablename1 varchar2(80); --定義變量2 sqlTxt varchar2(2000); --定義變量2 BEGIN --定義遊標 cursor c_tab_temp1 is select t.modelnumber, t.tablename from d_modelmap t; c_bom_row1 c_tab_temp1%rowtype; --處理邏輯 --循環遊標 for c_bom_row1 in c_tab_temp1 loop tablename1 := c_bom_row1.tablename; --取遊標中的值 END LOOP; commit; --提交事務 Exception When others then Dbms_output.Put_line(sqlerrm); --打印輸出錯誤 Rollback; --回滾事務 END;
返回遊標
create or replace procedure test( res out varchar2, p_cur out sys_refcursor) as Begin open p_cur for select * from tableName res:=''; end;
--分支判斷 if tablename1 <> '' then --處理邏輯 null; else --處理邏輯 null; end if;
--拼接動態sql sqltxt := 'update ' || tablename1 || ' t set t.partid=(select t3.f_id from i_partlist t3 where t3.part_no=t.part_no and nvl(t3.part_techstate,'' '')=nvl(t.part_techstate,'' '')) where not exists(select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)'; --執行動態sql execute immediate sqlTxt;
(1)用select XX into xx給變量賦值
select count(1) into v_count from A t where t.A='aaa';
(2)直接賦值
V_TEST := 123;
WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP;
在判斷語句前最好先用count(*)函數判斷是否存在該條操做記錄
--判斷是否存在,v_count是定義的數值變量 select count(1) into v_count from A t where t.A='aaa'; if v_count = 0 then else end if;