--p1 begin dbms_output.put_line('你好 世界'); end; --p2 引入變量 declare age number default 90; height number := 175; begin dbms_output.put_line('年齡'||age||'身高'||height); end; --p3 變量開始運算 declare age number default 90; height number := 175; begin dbms_output.put_line('年齡'||age||'身高'||height); age := age + 20; dbms_output.put_line('20年後年齡'||age||'歲'); end; --p4 引入表達式 declare age number default 90; height number := 175; begin if age>70 then dbms_output.put_line('古稀之年'); else dbms_output.put_line('風華正茂'); end if; end; --p5 流程控制 declare age number default 90; height number := 175; gender char(2) := '男'; begin if gender='男' then dbms_output.put_line('你能夠和女性結婚'); end if; if height>170 then dbms_output.put_line('能夠打籃球'); else dbms_output.put_line('能夠踢足球'); end if; if age<20 then dbms_output.put_line('年輕小夥'); elsif age <= 50 then dbms_output.put_line('年輕有爲'); elsif age <=70 then dbms_output.put_line('安享天倫'); else dbms_output.put_line('佩服佩服'); end if; end; --p6 計算1-100的和 declare i number :=0; total number :=0; begin loop i := i+1; total := total + i; if i=100 then exit; end if; end loop; dbms_output.put_line('總和'||total); end; -- p7: 跳出loop的方法 declare i number :=0; total number :=0; begin loop i := i+1; total := total + i; exit when i>=100; end loop; dbms_output.put_line('總和'||total); end; --p8 whlie循環 declare i number :=0; total number :=0; begin while i<100 loop i := i+1; total := total + i; end loop; dbms_output.put_line('總和'||total); end; --p9 for 循環 begin --for 循環變量 in 起始值..結束值 loop --xxxxx --end loop; for i in 1..9 loop dbms_output.put_line(i); end loop; for i in reverse 1..9 loop dbms_output.put_line(i); end loop; end; --p10 沒有返回值的"函數" --作一個求面積的過程 --declare -- area number; -- procedure 過程名(參數名 類型,...) is -- begin -- 主體 -- end; --begin --end; declare area number; procedure mian(a number,b number) is begin area := a * b; dbms_output.put_line(a||'乘'||b||'的面積是'||area); end; begin mian(5,4); mian(6,7); mian(3,7); end; --p11 作一個求面積的函數 --declare -- area number; -- function 過程名(參數名 類型,...) return 類型 is -- begin -- 主體 -- end; --begin --end; declare area number; function mian(a number,b number) return number is begin area := a * b; return area; end; begin dbms_output.put_line(mian(5,4)); dbms_output.put_line(mian(3,7)); dbms_output.put_line(mian(6,9)); end; --p12 自定義變量類型 之記錄類型 declare type student is record ( sno char(5), name varchar2(10), age number ); lisi student; begin lisi.sno := 's1008'; lisi.name := '李四'; lisi.age := 19; dbms_output.put_line('我叫'||lisi.name||',我'||lisi.age||'歲,學號是'||lisi.sno); end; --p13 自定義類型之集合類型 declare type answer is table of char(2); ans answer := answer('a','b','c','d'); begin dbms_output.put_line('共有'||ans.count()||'答案,分別是:'); dbms_output.put_line(ans(1)); dbms_output.put_line(ans(2)); dbms_output.put_line(ans(3)); dbms_output.put_line(ans(4)); end; --p14 聲明數據類型的第3個方法 declare age number; 變量名 另外一個變量%type; age 表名.列名%type; --聲明和列同樣的類型 --簡化聲明record類型 變量名 表名%rowtype; begin end; --p15 測試一下rowtype declare xg student%rowtype; begin xg.sno := 123; xg.name := '小剛'; dbms_output.put_line(xg.sno||xg.name); end; --p16 pl/sql操做數據庫中的數據 --查詢部門的名稱及地區,及部門的總薪水與獎金 declare depart dept%rowtype; total_sal number; total_comm number; procedure deptinfo(dno number) is begin select dname,loc into depart.dname,depart.loc from dept where deptno=dno; select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno; dbms_output.put_line('部門名稱:'||depart.dname||'在'||depart.loc); dbms_output.put_line('這個部門每個月工資及獎金各是'||total_sal||'和'||total_comm); end; begin deptinfo(80); deptinfo(30); end; --p17 引入異常處理 declare depart dept%rowtype; total_sal number; total_comm number; procedure deptinfo(dno number) is begin select dname,loc into depart.dname,depart.loc from dept where deptno=dno; select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno; dbms_output.put_line('部門名稱:'||depart.dname||'在'||depart.loc); dbms_output.put_line('這個部門每個月工資及獎金各是'||total_sal||'和'||total_comm); end; begin deptinfo(80); deptinfo(30); exception when NO_DATA_FOUND then dbms_output.put_line('沒有數據'); when others then dbms_output.put_line('其餘錯誤'); end; --p18:遞歸過程或函數 --求1->N的和,N容許輸入 declare m number; total number; function qiuhe(n number) return number is begin if n>1 then return n + qiuhe(n-1); else return 1; end if; end; begin dbms_output.put_line(qiuhe(10)); end; --p19 存儲過程/存儲函數 create function qiuhe(n number) return number is begin if n>1 then return n + qiuhe(n-1); else return 1; end if; end;
觸發器例子sql
-- g 商品表 create table g (gid number, gname varchar2(20), cnt number ); insert into g values (seq1.nextval,'牛',10); insert into g values (seq1.nextval,'馬',8); insert into g values (seq1.nextval,'狼',7); insert into g values (seq1.nextval,'貓',6); -- o 訂單表 create table o ( oid number, gid number, much number ); 監視:o表 動做: insert 觸發: update g 時間:after create trigger 觸發器名字 觸發時間 監視的動做 on 表名[監視地點] begin 觸發後的動做 end; create trigger t1 after insert on o begin update g set cnt=cnt-new.much where gid=new.gid; end; create trigger t2 after insert on o for each row begin update g set cnt=cnt-:new.much where gid=:new.gid; end; --表級觸發器 create trigger t3 after delete on goods begin dbms_output.put_line('有人觸發我'); end; --行級觸發器 create trigger t4 after delete on goods for each row begin dbms_output.put_line('有人觸發我'); end; --before發生的觸發器,有機會改sql語句的值 create trigger t5 before insert on o for each row declare tmp number; begin select cnt into tmp from g where gid=:new.gid; if :new.much > tmp then :new.much := tmp; end if; update g set cnt=cnt-:new.much where gid=:new.gid; end;