plsql_day03

来源:互联网 发布:淘宝立即购买灰色 编辑:程序博客网 时间:2024/03/29 15:40
   14.6  n 
    1+2+3+...+n 
    设计一个存储过程 传入一个参数代表从
    1加到的数  把这个数对应的前n项的和
    存入第二个参数中。调用这个存储过程
    验证存储过程的功能。
    create  or replace  procedure getNumN
      (n  number,var_sum  out number)
    is
    begin
        var_sum:=0; 
        for  var_i in 1..n loop
            var_sum:=var_sum+var_i;
        end loop;
    end;
    /
    
    declare
        var_sum   number:=0;
    begin
        getNumN(10,var_sum);
        dbms_output.put_line('var_sum='
        ||var_sum); 
    end;
    /
    
 十五.函数   function 
    15.1 函数和存储过程的不同
    关键字不同  procedure   function
    函数有返回值类型  和 返回值
        过程没有。
    调用方式不同  过程可以直接在plsql
        中调用,函数必须组成表达式。
    15.2 语法
    设计一个函数 传入两个整数参数 返回
    这两个参数的最大值。
    create or replace function funGetMax
    (var_x in number,var_y  number)
    return number   
    is 
    begin
        if var_x < var_y then
            return  var_y;
        end if;
            return  var_x;    
    end;
    /
   15.3 调用 
   select text from user_source 
       where name='FUNGETMAX'; 
   select  funGetMax(1,2) from dual; 
   declare
       var_res  number:=0; 
   begin
       var_res:=funGetMax(1,123);
       dbms_output.put_line(var_res);
   end;
   /
   
   15.4  设计一个函数 传入两个整数参数
   返回两个参数的最大值。并且把两个参数
   的和放入第二个参数中。调用这个函数
   验证功能。
   create or replace function funGetMaxAndSum
    (var_x in number,var_y in out number)
    return number   
    is 
        var_temp   number;
    begin
        var_temp:=var_y;
        var_y:=var_x+var_y;
        if  var_x < var_temp then
            return  var_temp;
        end if;
            return  var_x;    
    end;
    /          
    
    declare
        var_y   number:=123;
        var_res number:=0;
    begin
        var_res:=funGetMaxAndSum(321,var_y);
        dbms_output.put_line(var_y);
        dbms_output.put_line(var_res);
    end;
    /  
    
  十六.包  package 
   16.1 概念 
   把一组相关的过程 函数 变量 等组织到
   一起,然后为这个逻辑结构命名。
   16.2 系统提供的包
   dbms_output 
       dbms_output.put_line('hello'); 
   dbms_random 
       value(low,hig)
       select  dbms_random.value(1,100)
           from dual;  
       select  trunc(
           dbms_random.value(1,100))
           from dual; 
   dbms_job  定时调用存储过程
       submit(JOB   out  BINARY_INTEGER
       WHAT     VARCHAR2
       NEXT_DATE       DATE
       INTERVAL   VARCHAR2)
       可以把定时调用的任务提交给系统
       系统会分配一个任务编号放入job中
       what 定时调用的存储过程
       第一次程序执行的时间
       第二次调用的时间 
       run(jobno BINARY_INTEGER)
       把对应的定时任务执行起来。
   建立一张表  对这张表设计一个序列
   写一个存储过程 每次可以向表中插入一条
   数据。把这个存储过程配置到定时任务中
   从而验证存储过程可以周期性调用。
   1.create  table  test1405job(
     id   number  primary key,
     name varchar2(30)
     );
   2.create sequence test1405job_id;
   3.create or replace procedure pro1405job 
     is
     begin
         insert  into test1405job values(
         test1405job_id.nextval,
         'test'||test1405job_id.currval);
         commit;
     end;
     /  
   4.写一个匿名块 把任务提交给系统
    declare
        jobno  binary_integer;
    begin
        dbms_job.submit(jobno,
        'pro1405job();',sysdate,
        'sysdate+1/(24*60)');
        dbms_output.put_line('jobno='||jobno);
        dbms_job.run(jobno);
    end;
    /  
   5.select * from  test1405job;  
    
   6.如何取消定时任务
    select  job from user_jobs;
   
    begin
        dbms_job.remove(1645);
    end;
    /
   
  16.3 自定义包 
    在使用包中的数据时 在数据前要加包名。
    建立一个包 类似于c中的头文件
    create  or replace package mypack
       is
           procedure getmax(x number,
             y number);
           function  getmin(x number,
             y number)return number;   
       end;
       /
    实现包 类似于c中的实现文件    
    create or replace package body mypack
       is
           procedure getmax(x number,
             y number)
           is
           begin
               if x<y then
                   dbms_output.put_line(y);
               else
                   dbms_output.put_line(x);
               end if;    
           end;
           function  getmin(x number,
             y number)return number
           is
           begin
               if x<y then
                   return x;
               end if;
                   return y;    
           end;    
       end;
       /         
       
    begin
        mypack.getmax(1,123);
    end;
    / 
 十七.触发器   trigger
    17.1 dml级触发器
    在进行dml操作时  系统可能相应的操作
    做出一些响应。
    17.2 语法
    create  or replace trigger 触发器名
        before|after  DML  on  表名 
        |for each row 
        declare
        begin
        end;
        /
    17.3 举例
    create  table  emp1405bdl as 
        select id,first_name name,salary
        from s_emp;  
    create  or replace trigger emp1405bdl_tri
        after  update  on  emp1405bdl 
        declare
        begin
            dbms_output.put_line
            ('you update emp1405bdl');
        end;
        / 
    update emp1405bdl set 
    salary=salary+100  where id=1;
    update emp1405bdl set 
    salary=salary+100  where id<1;  
    update emp1405bdl set 
    salary=salary+100  where id>1;
    
    无论sql语句影响多少行 只触发一次 
    叫语句级触发器。
    sql语句影响多少行 就触发多少次
    这叫行级触发器。
    create  or replace trigger emp1405bdl_tri
        after  update  on  emp1405bdl 
        for each row
        declare
        begin
            dbms_output.put_line(:old.id
            ||':'||:old.salary);
            dbms_output.put_line
            ('you update emp1405bdl');
            dbms_output.put_line(:new.id
            ||':'||:new.salary);
        end;
        / 
    update emp1405bdl set 
    salary=salary+100  where id=1;
    update emp1405bdl set 
    salary=salary+100  where id<1;  
    update emp1405bdl set 
    salary=salary+100  where id>1; 
    
    update  :old   :new 
    delete  :old   
    insert         :new
    
    触发器中不能使用事务控制语句
                                                       
0 0
原创粉丝点击