加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle复习笔记之PL/SQL程序所要了解的知识点

发布时间:2020-12-12 17:00:29 所属栏目:百科 来源:网络整理
导读:PL/SQL的基本语法、记录类型、流程控制、游标的使用、 异常处理机制、存储函数/存储过程、触发器。 为了要有输出的结果,在写PL/SQL程序前都在先运行这一句: 结构: --声明变量、类型、游标 --程序的执行部分(类似于java里的main()方法) --针对begin块中

PL/SQL的基本语法、记录类型、流程控制、游标的使用、

异常处理机制、存储函数/存储过程、触发器。

为了要有输出的结果,在写PL/SQL程序前都在先运行这一句:


结构:

--声明变量、类型、游标

--程序的执行部分(类似于java里的main()方法)

--针对begin块中出现的异常,提供处理的机制
--when...then...
--when...then...

举例1:

举例2:


1、pl/sql基本的语法格式
2、记录类型
3、流程控制:
3.1 条件判断(两种)
方式一: ;
方式二: ;
3.2 循环结构(三种)
方式一:;
方式二:;
方式三:;
3.3 goto、exit
4.游标的使用(类似于java中的Iterator)
5.异常的处理

6.会写一个存储函数()、存储过程(
7.会写一个触发器

复习记录类型:

也可以升级一下,要是想对表的所有列都输出,则:(须注意输出的列名要跟表中的列名要一样)


查询150号员工的工资,若其工资大于或等于10000 则打印‘salary >= 10000';
若在5000到10000之间,则打印‘5000 <= salary <10000';否则打印‘salary < 5000'

= 10000 then dbms_output.put_line('salary >= 10000'); elsif v_sal > 5000 then dbms_output.put_line('10000 > salary >= 5000'); else dbms_output.put_line('salary < 5000'); end if; dbms_output.put_line('salary:'||v_sal); end; 利用case ... when ... then ... when ...then ... else ... end实现上题; declare v_sal employees.salary%type; v_temp varchar2(20); begin select salary into v_sal from employees where employee_id =150; v_temp := case trunc(v_sal/5000) when 0 then 'salary < 5000' when 1 then '5000 <= salary < 10000' else 'salary >= 10000' end; dbms_output.put_line('salary:'||v_sal||' '||v_temp); end;


查询出122号员工的job_id,若其值为 ‘IT_PROG',则打印‘GRADE:A'
‘AC_MGT',则打印‘GRADE:B'
‘AC_ACCOUNT',则打印‘GRADE:B'
否则打印‘GRADE:D'

使用循环语句打印:1-100

begin
loop
dbms_output.put_line(v_i);
exit when v_i >=100;
v_i := v_i + 1;
end loop;
end;
使用while实现:
declare
v_i number(5) :=1;
begin
while v_i <= 100 loop
dbms_output.put_line(v_i);
v_i := v_i + 1;
end loop;
end;
使用for...in...loop...end loop;实现:
begin
for c in 1..100 loop
dbms_output.put_line(c);
end loop;
end;



利用for循环实现输出2-100之间的质数:

可以用goto改进一下:

> if v_flag=1 then dbms_output.put_line(v_i); end if; v_flag := 1; end loop; end;

打印1-100的自然数,当打印到50时,跳出循环 ,输出‘打印结束':

> dbms_output.put_line('打印结束'); end; 或者: begin for i in 1..100 loop if i=50 then dbms_output.put_line('打印结束'); exit; end if; dbms_output.put_line(i); end loop; end;


打印出80部门的所有的员工的工资:salary:XXX
declare
v_sal employees.salary%type;

emp_sal_cursor

salary from employees where department_id = 80;
begin

emp_sal_cursor;

emp_sal_cursor into v_sal;
while emp_sal_cursor%found loop
dbms_output.put_line('salary:'||v_sal);
fetch emp_sal_cursor into v_sal;
end loop;

emp_sal_cursor;
end;
可以进行优化如下:

或者使用记录再优化一下:

可以使用for循环最优化:(


利用游标,调整公司中员工的工资:
工资范围 调整基数
0 - 5000 5%
5000 - 10000 3%
10000 - 15000 2%
15000 - 1%

用for循环实现

更新员工salary(涨工资10),如果该员工没有找到,则打印“查无此人”信息:


:(预定义异常,

100; dbms_output.put_line(v_sal); exception when too_many_rows then dbms_output.put_line('输出的行数过多'); when others then dbms_output.put_line('出现其它的异常了'); end;



10000 then raise e_sal_hight; end if; exception when e_sal_hight then dbms_output.put_line('工资太高了'); when others then dbms_output.put_line('出现其它的异常了'); end;

通过select...into...查询某人的工资,若没找到则打印出“未找到此数据”:


更新指定员工工资,增加100;若指定员工不在,则抛出异常:NO_RESULT;



写个简单的hello_world存储函数


的存储函数:


定义一个获取系统时间的函数:




定义一个函数:获取给定部门的工资总和,要求:部门号定义为参数,工资总额为返回值:


OUT类型的参数)。
要求:部门号定义为参数,工资总额定义为返回值。


获取给定部门的工资总和(通过out参数),要求部门号和工资总额定义为参数。
(注意:存储过程和存储函数是不一样的,存储函数有返回值而存储过程没有,调用时候存储过程直接调用)


对给定部门(作为输入参数)的员工进行加薪操作,若其到公司的时间在(?,95)期间,为其加薪5%

(95,98) 3%

(98,?) 1%
得到以下返回结果:为此次加薪公司每月额外付出多少成三(定义一个OUT型的输出参数)

update employees
set salary = salary * (1+v_temp)
where employee_id = c.employee_id;

temp := temp + c.salary*v_temp;
end loop;
dbms_output.put_line(temp);
end;
调用:
declare
v_i number(10):=0;
begin
add_sal(80,v_i);
end;


:在INSERT,UPDATE,DELETE情况下会触发TRIGGER

该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)

该TRIGGER被触发之后的目的和意图,正是触发器本身要做的事情,如PL/SQL块

有语句级(STATEMENT)触发器和行级(ROW)触发器
写一个简单的触发器:




编写一个触发器,在对记录进行删除的时候,在表中备份对应的记录

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读