笔记SIX

作者: 喵个酱 | 来源:发表于2019-03-13 15:24 被阅读0次

    打印1-10。

    declare

        i number:=1;

    begin

        while i<=10 loop

        dbms_output.put_line(i);

        i:=i+1;    --pl/sql没有++和--

    end loop;

    end;

    /

    begin

        for i in 1..10 loop

        dbms_output.put_line(i);

        end loop;

    end;

    /

    declare

        i number:=1;

    begin

        loop

        exit when i>10;

            dbms_output.put_line(i);

            i:=i+1;

        end loop;

    end;

    /

    游标(光标,cursor,结果集,(ResultSet)):结果的集合

    cursor 光标的名字;

    对比:pname varchar2(20)的书写顺序

    查询员工表中所有员工的姓名和工资。

    declare

        pname briup_emp.ename%type;

        psal briup_emp.sal%type;

    --定义光标

        cursor cemp is select ename,sal from briup_emp;

    begin

    --开启光标

        open cemp;

    --loop循环

        loop

        fetch cemp into pname psal;

        exit when cemp%notfound;

        dbms_output.put_line(pname||'的工资是'||psal); 

        end loop;

    --关闭光标

    close cemp;

    end;

    /

    fetch:

    1、指针指向的数据返回

    2、指针指向下一条数据

    declare

        cursor cemp is select empno,sal,job from briup_emp;

        pempno briup_emp.empno%type;                                                                      psal briup_emp.sal%type;                                                                                              pjob briup_emp.job%type; 

    begin

        open cemp;

        loop

        fetch cemp into pname psal pjob;

        exit when cemp%notfound;

        if pjob='android' then update briup_emp set sal:=psal+1000 where empno=pempno;

        elsif pjob='ios' then update briup_emp set sal:=sal+500 where empno=pempno ;

        else update briup_emp set psal:=psal+2000 where empno=pempno;

        end if;

        end loop;

    close cemp;

    end;

    /

    例外:和java中的异常

    预定义例外

    no_data_found    没有找到数据

    too_many_rows    匹配了多个行

    zero_divide    除数为0

    value_error    数据类型转型失败,如:'abc'转化为数字失败

    timeout_on_resource    (资源连接超时)

    自定义例外

    案例:模拟no_data_found例外。

    declare

        pname briup_emp.ename%type;

    begin

        select ename into pname from briup_emp where empno=100;

    --有异常执行

    exception

        when no_data_found then dbms_output.put_line('没有找到这个结果');

        when others then dbms_output.put_line('出现了其他例外');

    end;

    pl/sql的存储过程

    指存储在数据库中供所有用户调用的子程序。

    过程是一个被命名的pl/sql代码块。它既可以没有参数,也可以没有参数,既可以in参数,也可以有out参数,但它没有返回值,过程一旦被创建好,就会储存到数据库中。过程是不能被普通的sql语句调用的,第一个调用方式通过execute或者在pl/sql代码块调用,因为过程是提前编译好的代码,所以执行效率很高。

    create [or replace] procedure pro_name[(参数列表 参数类型 数据类型)] 

    is|as --指过程的开始,说明部分(相对于declare,定义)

    begin

    end;

    /

    通过过程打印helloworld。

    create or replace procedure dbms_helloworld

    is

    begin

        dbms_output.put_line('helloworld');

    end;

    /

    create or replace procedure insert_emp

    is

    begin

        insert into briup_emp(ename) valus('胡八一');

    end;

    /

    --commit不应该写在过程中,因为是否提交应该由调用者处理。

    向过程中添加参数(通过编号查询名字)

    create or replace procedure select_emp_by_empno(eno in number)

    is

    pname briup_emp.ename%type;

    begin

        insert ename into pname from briup_emp where empno=eno;

    end;

    /

    exec select_emp_by_empno(2);

    向过程中输出参数(通过编号查询工种和工资)

    create or replace procedure select_emp_by_empno(eno in number)

    is

    pjob briup_emp.ename%type;

    psal briup_emp.ename%type;

    begin

        select job,sal into pjob,psal from briup_emp where empno=eno;

        dbms_output.put_line(eno||'号员工的工种是'||pjob);

    end;

    /

    create or replace procedure select_emp_by_empno(eno in number,

    ejob out varchar(2),

    esal out number)

    is

    begin

        select job,sal into pjob,psal from briup_emp where empno=eno;

    end; 

    /

    declare

        pjob briup_emp.ename%type;

        psal briup_emp.ename%type;

    begin

        select_emp_by_empno(1,pjob,psal);

        dbms_output.put_line(pjob psal);

    end;

    /

    删除过程:drop procedure pro_name;

    pl/sql的存储函数

    函数一般用于计算或者返回一个值,函数在创建的时候和过程很相似,调用的时候需要表达式,函数必须有返回值。

    create [or replace] function fun_name[(参数列表 参数类型 数据类型)]  

    return 返回值类型

    is|as

    begin

        ...

        return 结果;

    [exception]

    end;

    /

    计算一个员工的年工资。

    create or replace function year_salary(eno in number)

    return number

    is

    pys number(10);

    begin

        select sal*12 into pys from briup_emp where empno=eno;

        return pys;

    end;

    /

    declare

      pyear_sal number(10);

    begin

      pyear_sal:=year_salary(1);

      dbms_output.put_line('年薪是'||pyear_sal);

    end;

    /

    删除函数:drop function fun_name;

    相同点:都是执行某个功能的代码块。

    不同点:过程没有return,函数有return。

    相关文章

      网友评论

          本文标题:笔记SIX

          本文链接:https://www.haomeiwen.com/subject/fjizpqtx.html