您的位置:首页 > 数据库 > Oracle

oracle自定义函数、存储过程

2015-05-20 12:59 447 查看
declare

    v_name varchar2(50);

    v_age number;

begin

    v_name := '孙悟空';

    v_age := 40;

    

    -- 嵌套块

    declare

        v_color varchar2(50);

        v_price number;

    begin

        v_color := '红色';

        dbms_output.put_line(v_name 

            || '-->' || v_color);

        

    end;

    

    -- 外部块无法访问嵌套块的变量

    v_price := 30;

end;

declare

    v_age number;

begin

    v_age := 50;

    

    if v_age > 65 then

        dbms_output.put_line('老年人');

    elsif v_age >45 then

        dbms_output.put_line('中年人');

    elsif v_age > 25 then

        dbms_output.put_line('青年人');

    else

        dbms_output.put_line('其他');

    end if;

end;

declare

    v_count number := 1;

begin

    -- 简单循环,死循环

    loop

         dbms_output.put_line('v_count:' || v_count);

                  

         v_count := v_count + 1;

         -- exit完全类似于Java的break语句

         exit when v_count > 20;

    end loop;

end;

select * from dept;

delete from dept where to_char(deptno) not like '%0';

commit;

declare

    v_count number := 1;

begin

    -- 简单循环,死循环

    loop

        

         -- exit完全类似于Java的break语句

         exit when v_count > 9;

         insert into dept

         values( v_count , '部门' || v_count

              , '位置' || v_count);

         v_count := v_count + 1;

    end loop;

end;

declare

    v_count number := 11;

begin

    while v_count < 20 loop

        insert into dept

        values( v_count , '部门' || v_count

             , '位置' || v_count);

        v_count := v_count + 1;

    end loop;

end;

select * from dept;

begin

    -- for循环的循环计数器无须声明

    for v_index in reverse 2..10 loop

        -- for循环的循环计数器不能被重新赋值

        //v_index := v_index + 1;

        dbms_output.put_line(v_index);

            

    end loop;

end;

declare

    v_count number := 1;

begin

    <<outer>>

    while v_count < 10 loop

         for v_index in 12..19 loop

             dbms_output.put_line(v_count 

                 || '-->' || v_index);

             exit when v_index > 15;           

         end loop; 

         

         v_count := v_count + 1;  

    end loop;

end;

declare

    v_index number := 21;

begin

    <<reinsert>>

    insert into dept 

    values(v_index , '部门' || v_index

         , '位置' || v_index);

    v_index := v_index + 1;

    if v_index < 29 then

        goto reinsert;

    end if;

end;

select * from dept where dname = '部门19';

select * from dept;

begin

      print_boolean(true);

end;

-- 所谓存储过程,就是为匿名块加个头即可。

  -- 如果没有指定参数的传递模式,默认是in

create or replace procedure print_boolean(p_val boolean)

is

begin

     if p_val then

         dbms_output.put_line('真');

     else

         dbms_output.put_line('假');

     end if;

end;

create or replace procedure cal_salary(p_sal number , 

   p_comm number , p_real out number)

is

    v_count number;

begin

    v_count := p_sal + p_comm;

    

    p_real := v_count * 0.8;

end;

declare

    v_sal number;

begin

    -- 对于传出参数来说,执行存储过程时,

    -- 存储过程会改变该传出参数的值。

    -- 调用存储过程时,传出参数只能是变量(存储过程需要为这个参数赋值)

    cal_salary(2000*2 , 200 , v_sal);

    

    dbms_output.put_line(v_sal);

end;

create or replace procedure cal_cube(p_num in out number)

is

    v_count number;

begin

     -- 对于in out 参数来说,程序就要读取参数的值,

     -- 也会在存储过程中改变该参数的值。

     v_count := p_num*p_num*p_num;

     p_num := v_count;

end;

declare

    v_num number := 4;

begin

    cal_cube(v_num);

    

    dbms_output.put_line(v_num);

end;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: