Oracle的儲存過程、函式和觸發器
阿新 • • 發佈:2019-02-16
--儲存過程的執行 其實是一個編譯的過程 應該在呼叫時執行 create or replace procedure prg_add1(p1 number, p2 number, p3 in out number) as begin dbms_output.put_line(p3); p3:=p1+p2; end; --in表示修飾的引數是隻讀的 不允許修改 declare i number:=5; begin prg_add1(1, 12, i); syso(i); end; --在定義形參的時候不能定義位元組數 create or replace procedure syso(str varchar2) as begin dbms_output.put_line(str); end; call syso('nihao'); --sql語句 exec syso('nihao'); --sql命令 --函式 create or replace function fun_add(p1 number, p2 number) return number as begin return p1+p2; end; begin syso(fun_add(1,2)); end; --儲存過程和函式有什麼共同點 1.他們都是預編譯的 一次編譯多次執行 多次執行省略編譯的時間 可以提高效率 會生成統計資訊 提高查詢的效率 --儲存過程和函式有什麼區別 1.函式是一個特殊的儲存過程。函式可以直接定義返回值 儲存過程只能使用 out 來實現返回值 2.函式可以在任意的地方呼叫,包括sql語句。儲存過程只能在dos視窗和plsql中執行 --觸發器 create or replace trigger tri_dept before insert or update or delete on dept for each row --每操縱一行資料都會觸發一次 begin if(inserting) then syso('插入了一條資料'); elsif(deleting) then syso('刪除了一條資料'); elsif(updating) then syso('修改了一條資料'); end if; end; insert into dept values(85,'aaa','bbb'); delete from dept where deptno>50; update dept set loc='abc' where deptno=12; select * from dept; create table myorder( orderid number, unit number, quantity number, total number ) --插入的是 新值 --刪除的是 舊值 --更新的是 舊值和新值 --新增使用新值 在插入時after觸發器不能修改列的值 create or replace trigger tri_order before insert on myorder for each row begin :new.total:=:new.unit*:new.quantity; end; insert into myorder(orderid,unit,quantity) values(1,5,10); select * from myorder; --刪除使用的是舊值 create or replace trigger tri_order after delete on myorder for each row begin syso(:old.orderid); end; delete from myorder