笔记SIX

打印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)