oracle简单的存储过程和函数以及触发器的使用

      连续写了两篇文章,实在写的头疼,所以此刻出去溜个弯,就着春风的惬意,舒缓一下大脑,来写下面的内容,于是我提笔就开始,生怕错过了下面的时间而耽误了我回去的事情,毕竟嘛,春节到了,该回家了(15个例子)。

   1.create or replace function fun_prac(id number)(函数的使用)
    return varchar2
    is
   begin
   dbms_output.put_line('这是第一个函数');
   return 'id的值是:'||id;

   end;

    2.--定义一个函数,获取给定部门的工资总和,要求:部门号定义为参数,工资总额定义为返回值
   create or replace function sum_emp_sal(dno number)(函数的使用)
   return number
   is
    v_sal emp.sal%type;
    begin
   select sum(sal) into v_sal from emp where deptno=dno;
   return v_sal;

    end;

   3.----删除数据之后然后备份数据到另外一个表中
  create or replace trigger backup_data(触发器的使用)
  after delete on emp
  for each row
  begin
  insert into emptest values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno) ;

  end;

  4.查询某个部门的员工工资总和

   create or replace function ls_sum_emp_sal(dno number,sum_empno_account out number)(函数的使用)
   return number
   is
  sum_sal number(10):=0;
  cursor emp_cursor is select sal from emp where deptno=dno;--定义游标查询每个部门下每个员工的工资
  begin
   sum_empno_account:=0;
   for v_sal in emp_cursor loop
   sum_sal:=sum_sal+v_sal.sal;
   sum_empno_account:=sum_empno_account+1;
   end loop;
   return sum_sal;

   end;

 5.求1到100的和用for in loop 循环(函数的使用)

 create or replace function sum_count
return number
is 
---定义变量
v_sum number(10):=0;
begin
  for v_temp in 1..100 loop
  v_sum:=v_sum+v_temp;
  end loop;
 return v_sum;

 end;

6. loop  exit when 求1到100的和(函数的使用)

create or replace function sum_count1
return number
is
v_sum number(10):=0;
v_a number(10);
begin
 v_a:=1;
 loop
 v_sum:=v_sum+v_a;
 v_a:=v_a+1;
 exit when v_a>100;
 end loop;
 return v_sum;

 end;

7.while loop 求1到100的和(函数的使用)

create or replace function sum_count2
return number
is
v_sum number(10):=0;
v_a number(10);
begin
  v_a:=0;
  while v_a<=100 loop
   v_sum:=v_sum+v_a;
   v_a:=v_a+1;
   end loop;
   return v_sum;

   end;

8.动态更新sql(存储过程的使用)

CREATE OR REPLACE PROCEDURE proc_update1(sno NUMBER,sname VARCHAR2) AS
mysql VARCHAR2(500);  

BEGIN  

 mysql:='UPDATE student SET sname=:1 WHERE sno=:2';  

 EXECUTE IMMEDIATE mysql USING sname,sno;  

 END proc_update1;

9.往学生表中插入1000条数据(存储过程的使用)

create or replace procedure proc_while_insert(v_typ varchar2) is
cnt number;
begin
for r in 1 ..1000 loop
    insert into student (sno,sname)
      select 'st'||r ,'测试'||r from dual;
  end loop;
 Exception
   when NO_DATA_FOUND
     then
       dbms_output.put_line('数据不存在');       
end;

10.存储过程游标的使用

create or replace procedure pro_add_sal(dno number,total_sal out number) is(存储过程的使用)
---一个部门下有多个员工,所以需要定义游标
cursor emp_cursor is select sal,hiredate from emp where deptno=dno;
v_temp number(5,2);
begin
  ---使用for in 循环
  total_sal:=0;
  for v_result in emp_cursor loop
    if to_char(v_result.hiredate,'yyyy')<'1995' then v_temp:=0.05;
    elsif to_char(v_result.hiredate,'yyyy')<1998 then v_temp:=0.03;
    else v_temp:=0.01;
    end if;
     total_sal:=total_sal+v_result.sal*v_temp;
    update emp set sal=sal*(1+v_temp) where deptno=dno;
   end loop;

end;

11.存储过程的更新和查询语句

create or replace procedure update_emp(v_empno number,v_result out number) is(存出过程的使用)
begin
  update emp set sal=100 where empno=v_empno;
  select sal into v_result from emp where empno=v_empno;

end update_emp;

12.插入emp表数据时触发(触发器的使用)

create or replace trigger insert_prac
after insert on emp
for each row
begin
 insert into emptest(empno,ename,job) values(:new.empno,:new.ename,:new.job);

end;

13.更新emp表的时候触发(触发器的使用)

create or replace trigger update_prac
after update on emp
for each row
begin
 update emptest set empno=:new.empno;

 end;

14.create or replace procedure proc_selectall(cno in number,s_result out sys_refcursor) is(存储过程使用)
cnt number;
begin
  select sno into cnt from student where sno=cno;
  if cnt>0 then
  open  s_result for  
   select  * from student  where sno=cno;
   else 
       open  s_result for  
     select  * from  student;
    end if;
 Exception
   when NO_DATA_FOUND
     then
       dbms_output.put_line('数据不存在');     

      end proc_selectall;

15.存储过程的删除语句

create or replace procedure proc_delete(cno in number) is(存储过程使用)

begin
  delete from student where sno=cno;
end proc_delete;


























你可能感兴趣的:(oracle存储过程,函数,触发器的使用,数据库)