PL/SQL块分类

来源:互联网 发布:人丑还颜控 知乎 编辑:程序博客网 时间:2024/05/21 07:47

  1. PL/SQL块分类

    1.匿名块

    declare

     v_avgsal number(6,2);

    begin

     selectavg(sal)into v_avgsalfrom emp

     where deptno=&no;

     dbms_output.put_line('平均工资:'||v_avgsal);

    end;

     

    2.命名块

    <<outer>>

    declare

     v_deptno number(2);

     v_dname varchar2(10);

    begin

     <<inner>>

     begin

             select deptnointo v_deptnofrom emp

             wherelower(ename)=lower('&name');

     end;--<<inner>>

     select dnameinto v_dnamefrom dept

     where deptno=v_deptno;

     dbms_output.put_line('部门名:'||v_dname);

    end;--<<outer>>

     

    3.子程序(子程序包括过程、函数和包)

    (1)过程

     过程用于执行特定操作。当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out)

     createprocedure update_sal(newnamevarchar2,newsalnumber)

     is

     begin

            update empset sal=newsal

            wherelower(ename)=lower(newname);

     end;

    调用该过程时,可以使用execute命令或call命令。示例如下:

    execute update_sal('scott',2000)

    call update_sal('scott',2000)

     

    (2)函数

     函数用于返回特定数据。当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句的返回数据。

     createfunction annual_income(newnamevarchar2)

     returnnumberis

            annual_salary number(7,2);

     begin

            select sal*12+nvl(comm,0)into annual_salary

            from empwherelower(ename)=lower(newname);

            return annual_salary;

     end;

     

    调用

     var income number

     call annual_income('scott')into :income

     print income

     

    (3)

     包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数。

     createpackage emp_pkgis

            procedure update_sal(newnamevarchar2,newsalnumber);

            function annual_income(newnamevarchar2);

     end;

     

     createpackagebody emp_pkgis

            procedure update_sal(newnamevarchar2,newsalnumber)

            is

            begin

                      update empset sal=newsal

                      wherelower(ename)=lower(newname);

            end;

            function annual_income(newnamevarchar2)

            returnnumberis

                      annual_salary number(7,2);

            begin

                      select sal*12+nvl(comm,0)into annual_salary

                      from empwherelower(ename)=lower(newname);

                      return annual_salary;

            end;

     end;

     

    当调用包的过程和函数时(包名.子程序名)

     execute emp_pkg.update_sal('scott',2000)

     

    4.触发器

     触发器是隐含执行的存储过程。当定义触发器时,必须要指定触发器事件以及触发操作,常用的触发事件包括insertupdatedelete语句,而触发操作实际是一个PL/SQL块。

     createtrigger update_cascade

            afterupdateof deptnoon dept

            foreachrow

     begin

            update empset deptno=:new.deptno

            where deptno=:old.deptno;

     end;

 

0 0
原创粉丝点击