1. 程式人生 > >Oracle的儲存過程、函式和觸發器

Oracle的儲存過程、函式和觸發器

--儲存過程的執行 其實是一個編譯的過程 應該在呼叫時執行
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