Oracle的PL/SQL编程前奏之基础技能实战四(存储过程)

                                                                         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;
相关文章
相关标签/搜索