Oracle的PL/SQL編程前奏之基礎技能實戰四sql
一>PL/SQL代碼中只能執行DML語句,不能執行DDL語句。寫一段動態sql執行DDL語句。編程
declare v_sqlstr varchar(200):='create table books(id int not null,bookName varchar2(100) null)'; begin execute immediate v_sqlstr; end;
總結: 1>oracle最小代碼塊: declare----可選 begin----必須 exception----可選 end;----必須 2> begin dbms_output.put_line('這是最簡單的PL/SQL語句塊'); end; 3> begin null;----什麼也不作的佔位符 end;
二>封裝一個函數給不一樣職位的得到不一樣的漲薪比例。而後使用PL/SQL代碼塊給員工漲薪。oracle
1>封裝一個函數 create or replace function getaddsalaryratio(p_job varchar2) return number as v_result number(7,2); begin if p_job='CLERK' then v_result:=0.10; elsif p_job='SALESMAN' then v_result:=0.12; elsif p_job='MANAGER' then v_result:=0.15; end if; return v_result; end; 總結:A>函數須要有返回值。
2>編寫PL/SQL代碼塊中循環調用函數給員工漲薪ide
declare v_job varchar(100); v_empno varchar(20); v_enamevarchar(60); v_rationumber(7,2); cursor c_emp is select job,empno,ename from emp; begin open c_emp; loop fetch c_emp into v_job,v_empno,v_ename; exit when c_emp%notfound; v_ratio:=getaddsalaryratio(v_job); update emp set sal=sal*(1+v_ratio); dbms_output.put_line('已經爲員工'||v_empno||':'||v_ename||'成功加薪'); end loop; close c_emp; end;
三>建立爲員工加薪的存儲過程,傳入兩個參數(員工編號和加薪比例)函數
1>建立存儲過程傳入兩個參數(員工編號和加薪比例)oop
create or replace procedure addempsalary(p_ratio number,p_empno number) as declare begin if p_ratio>0 then update emp set sal=sal*(1+p_ratio) where empno=p_empno; end if; dbms_output.put_line('加薪成功'); exception end;
總結:fetch
1>函數與存儲過程區別之一函數有返回值,而存儲過程沒有返回值。因此return在函數中用要接返回值,return在存儲過程當中用不用接返回值。spa
2>函數與存儲過程區別之二是在查詢語句中能夠調用使用函數,而在查詢語句中不能調用存儲過程。get
注意:it
3>在存儲過程和函數中能夠有多個return語句,可是隻有一個return語句會被執行。
四>當爲emp表中的每一個員工加薪時,假定人事部但願保留一份加薪記錄,爲了保存加薪記錄,建立了一個名爲raisesalarylog的表(包括員工編號,加薪日期,加薪前薪資,加薪後薪資)。
而後爲emp表建立一個觸發器,該觸發器將監測emp表的sal字段的更新,若是更新了就查詢raisesalarylog表是否已存在加薪記錄,若是存在則更新表,不然向該表插入一條新的記錄。
1>建立raisesalarylog表 create table raisesalarylog ( empno number(10) not null primary key, ----員工編號 raiseddate Date, ----加薪日期 originalSal number(10,2), ----加薪前薪資 raisedSal number(10,2) ----加薪後薪資 ) 2>爲emp定義觸發器代碼(DML觸發器,AFTER行級觸發器,能夠對每一行監測) create or replace trigger raisesalarychange after update of sal on emp for each row declare v_reccount int; begin select count(*) into v_reccount from raisesalarylog where empno=:OLD.empno; if v_reccount=0 then insert into raisesalarylog values(:OLD.empno,sysdate,:OLD.sal,:NEW.sal); else update raisesalarylog set raiseddate=sysdate,originalSal=:old.sal,raisedSal=:new.sal where empno=:old.empno; end if; exception when others then dbms_output.put_line(sqlerrm); end;
總結:
A.OLD謂詞:是在執行前的字段的值的名稱,好比在update一個表時,使用old.empno能夠引用到更新以前的員工編號值。
B.NEW謂詞:是在執行後的字段的值的名稱,好比在update一個表時, 使用new.empno能夠引用到更新以後的員工編號值。
五>使用for...loop循環輸出計數;使用while...loop循環輸出計數;
1>編寫PL/SQL代碼塊(for...loop)
declare v_total integer:=0; begin for i in 1 .. 3 loop v_total:=v_total+1; dbms_output.put_line('循環計數器值'||i); end loop; dbms_output.put_line('循環總計'||v_total); exception when others then null; end;
2>編寫PL/SQL代碼塊(while...loop)
declare i number(10,2):=1; j number(10,2):=0; begin while(i<=3) loop dbms_output.put_line('循環計數器值'||i); i:=i+1; j:=j+1; end loop; dbms_output.put_line('循環總計值'||j); exception when others then null; end;