笔记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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354