Oracle的PL/SQL编程前奏之基础技能实战四

一>PL/SQL代码中只能执行DML语句,不能执行DDL语句。写一段动态sql执行DDL语句。

declarev_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代码块给员工涨薪。

1>封装一个函数create or replace function getaddsalaryratio(p_job varchar2) return numberasv_result number(7,2);beginif p_job='CLERK' thenv_result:=0.10;elsif p_job='SALESMAN' thenv_result:=0.12;elsif p_job='MANAGER' thenv_result:=0.15;end if;return v_result;end;总结:A>函数需要有返回值。

2>编写PL/SQL代码块中循环调用函数给员工涨薪

declarev_job   varchar(100);v_empno varchar(20);v_enamevarchar(60);v_rationumber(7,2);cursor c_emp is select job,empno,ename from emp;beginopen c_emp;loopfetch 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>创建存储过程传入两个参数(员工编号和加薪比例)

create or replace procedure addempsalary(p_ratio number,p_empno number)asdeclarebeginif p_ratio>0 thenupdate emp set sal=sal*(1+p_ratio) where empno=p_empno;end if;dbms_output.put_line('加薪成功');exceptionend;

总结:

1>函数与存储过程区别之一函数有返回值,而存储过程没有返回值。所以return在函数中用要接返回值,return在存储过程中用不用接返回值。

2>函数与存储过程区别之二是在查询语句中可以调用使用函数,而在查询语句中不能调用存储过程。

注意:

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 raisesalarychangeafter update of sal on empfor each rowdeclare    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)

declarev_total integer:=0;beginfor i in 1 .. 3loopv_total:=v_total+1;dbms_output.put_line('循环计数器值'||i);end loop;dbms_output.put_line('循环总计'||v_total);exceptionwhen 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;