Oracle检查要注意的知识点。

审查内容:

SQL的基本语法、记录类型、进程控制、游标的使用,

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

为了帮助您遵循我的Notes实践,为此,将数据库表文件提供给每个人下载:我下载

为了获得输出,请在编写这个PL / SQL程序之前运行这个句子:

进行设置

结构:

声明

-声明变量、类型、游标

开始

程序的执行部分(类似于主()方法在java)

例外

-为开始块中出现的异常提供处理的机制。

当…然后…

当…然后…

结束;

例1:




声明
v_sal号码(10);(注意每个句子没有遗忘的分号,如java)。
开始
选择薪酬为员工在v_sal employee_id = 100;
dbms_output.put_line(v_sal);
结束;



例2:




声明
v_sal号码(10);(注意大小的空间在这里宣告不小于原表)
v_email VARCHAR2(20);
v_hire_date日期;
开始
选择薪酬、电子邮件、hire_date为v_sal,v_email,从员工那里employee_id = v_hire_date
100;
dbms_output.put_line(v_sal | | ',' | | v_email | | ',' | | v_hire_date);
结束;
或:
声明
v_sal员工工资的百分之式;
v_email电子邮件%型员工;
v_hire_date hire_date %型员工;
开始
选择薪酬、电子邮件、hire_date为v_sal,v_email,从员工那里employee_id = v_hire_date
100;
dbms_output.put_line(v_sal | | ',' | | v_email | | ',' | | v_hire_date);
结束;



记录uff1a




声明
型emp_record记录(
v_sal员工工资的百分之式,
v_email电子邮件%型员工,
v_hire_date hire_date %型员工。
);
v_emp_record emp_record;
开始
选择薪酬、电子邮件、hire_date为v_emp_record员工在employee_id = 100;
dbms_output.put_line(v_emp_record。v_sal | | ',' | | v_emp_record。v_email | | ',' | |
v_emp_record v_hire_date);
结束;



1,基本语法格式

2、记录类型类型…是...记录(,,);

三.过程控制:

3.1条件判断(两种)

方式一:如果…然后,然后…其他的…最后如果;

方式二:案例…什么时候...然后…结束;

3.2周期结构(三种)

方式一:循环…退出时…结束循环;

方式二…环…结束循环;

方式三:我在…环…结束循环;

3.3转到,退出

使用4。游标(类似迭代器在java)

5。异常处理

6。将编写一个存储函数(返回值)、一个存储过程(不返回值)

7。将触发触发器

检查记录类型:




声明
型emp_record记录(
- v_emp_id employee_id %型员工,
- v_sal员工工资的百分之式。
v_emp_id数= 120(10),
v_sal数(2):= 12000
);
v_emp_record emp_record;
开始
选择employee_id,工资从哪里v_emp_record员工employee_id = 123;
dbms_output.put_line('employee_id:| | v_emp_record。v_emp_id | || | 'salary:| |)
v_emp_record v_sal);
结束;



还可以升级,如果要输出表的所有列,则应注意与表中的列表同名的输出名称。




声明
v_emp_record员工%ROWTYPE;
开始
SELECT *为v_emp_record员工在employee_id = 123;
dbms_output.put_line('employee_id:| | v_emp_record。employee_id | || | 'salary:| |)
v_emp_record工资);
结束;
使用记录执行更新操作:
声明
v_emp_id号(10);
开始
v_emp_id:= 123;
更新员工
设定工资=工资+ 100
在employee_id = v_emp_id;
dbms_output.put_line('execution成功!~);
结束;



过程控制:

查询150,雇员的工资,如果工资大于或等于10000打印工资> = 10000;

如果在5000到10000之间,则打印5000 < =工资> 10000;工资> 5000或打印




声明
v_sal员工工资的百分之式;
开始
选择薪酬为员工在v_sal employee_id = 150;
如果v_sal然后dbms_output.put_line('salary > = 10000 > = 10000);
elsif v_sal 5000然后dbms_output.put_line('10000 > >薪水> = 5000);
其他dbms_output.put_line('salary<5000);
最后如果;
dbms_output.put_line('salary:| | v_sal);
结束;
使用案例…什么时候...然后…什么时候...然后…其他的…结束执行问题;
声明
v_sal员工工资的百分之式;
v_temp VARCHAR2(20);
开始
选择薪酬为员工在v_sal employee_id = 150;
v_temp:= =
案例trunc(v_sal / 5000)当0 then'salary<5000
当'5000工资10000的<< = 1
else'salary = 10000
结束;
dbms_output.put_line('salary:| | v_sal | || | v_temp);
结束;





查询员工122号job_id,如果其值为it_prog,打印成绩:

ac_mgt ',然后打印的等级:B

ac_account ',然后打印的等级:B

否则,打印等级:D




声明
v_job_id job_id %型员工;
v_temp VARCHAR2(20);
开始
选择job_id为v_job_id员工在employee_id = 122;
v_temp:= =
案例v_job_id when'it_prog'then'a
when'ac_mgt'then'b
when'ac_account'then'c
别人会
结束;
dbms_output.put_line('job_id:| | v_job_id | || | v_temp);
结束;



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




声明
v_i数= 1(5);

开始

dbms_output.put_line(v_i);
退出时,v_i > = 100;
v_i:= v_i + 1;
结束循环;
结束;
用时实施:
声明
v_i数= 1(5);
开始
而v_i 100环路
dbms_output.put_line(v_i);
V_i: = v_i + 1;
结束循环;
结束;
使用…在…环…端环;实现:
开始
对于C在1…100循环
dbms_output.put_line(C);
结束循环;
结束;






在输出2-100质量数




声明
v_i数= 2(3);
v_j数= 2(3);
v_flag数= 1(1);
开始
而v_i <= 100环路
而v_j <= sqrt(v_i)环
如果国防部(v_i,v_j)= 0然后v_flag:= 0;
最后如果;
v_j:= v_j + 1;
结束循环;
如果v_flag = 1然后dbms_output.put_line(v_i);
最后如果;
v_j:= 2;
v_i:= v_i + 1;
v_flag:= 1;
结束循环;
结束;



该输出2-100质量利用for循环:




声明
v_flag数= 1(1);
开始
对于v_i 2 .. 100环
For v_j in 2..Sqrt (v_i) loop
如果国防部(v_i,v_j)= 0然后v_flag:= 0;
最后如果;
结束循环;
如果v_flag = 1然后dbms_output.put_line(v_i);
最后如果;
v_flag:= 1;
结束循环;
结束;



可以改进与转到:




声明
v_flag数= 1(1);
开始
对于v_i 2 .. 100环
对于v_j 2 .. Sqrt(v_i)环
如果国防部(v_i,v_j)= 0然后v_flag:= 0;
goto标签;
最后如果;
结束循环;
>
如果v_flag = 1然后dbms_output.put_line(v_i);
最后如果;
v_flag:= 1;
结束循环;
结束;



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




开始
对于我在1….. 100圈
如果i = 50,然后转到标签;
最后如果;
dbms_output.put_line(我);
结束循环;
>
dbms_output.put_line(打印);
结束;
或:
开始
对于我在1….. 100圈
如果我= 50然后dbms_output.put_line(打印);
出口;
最后如果;
dbms_output.put_line(我);
结束循环;
结束;





光标:

打印出80部门所有员工的工资:工资:XXX

声明

v_sal员工工资的百分之式;

-光标的定义

光标emp_sal_cursor是选择从员工那里department_id = 80的工资;

开始

-打开游标

打开emp_sal_cursor;

提取游标

取emp_sal_cursor为v_sal;

而emp_sal_cursor %发现循环

dbms_output.put_line('salary:| | v_sal);

取emp_sal_cursor为v_sal;

结束循环;

-关闭光标

近emp_sal_cursor;

结束;

它可以优化如下:




声明
v_empid employee_id %型员工;
v_lastname last_name %型员工;
v_sal员工工资的百分之式;
光标emp_sal_cursor是选择employee_id,last_name,工资从员工那里
department_id = 80;
开始
打开emp_sal_cursor;
取emp_sal_cursor为v_empid,v_lastname,v_sal;
而emp_sal_cursor %发现循环
dbms_output.put_line('employee_id:| | v_empid | | ',' | | 'last_name:| | v_lastname | |,
| | 'salary:| | v_sal);
取emp_sal_cursor为v_empid,v_lastname,v_sal;
结束循环;
近emp_sal_cursor;
结束;



或者使用记录再次优化它。




声明
型emp_record记录(
v_empid employee_id %型员工,
v_lastname last_name %型员工,
v_sal员工工资的百分之式。
);
v_emp_record emp_record;
光标emp_sal_cursor是选择employee_id,last_name,工资从员工那里
department_id = 80;
开始
打开emp_sal_cursor;
取emp_sal_cursor为v_emp_record;
而emp_sal_cursor %发现循环
dbms_output.put_line('employee_id:| | v_emp_record。v_empid | | ',' | | 'last_name:| |)
v_emp_record。v_lastname | | ',' | | 'salary:| | v_emp_record v_sal);
取emp_sal_cursor为v_emp_record;
结束循环;
近emp_sal_cursor;
结束;



for循环优化可以使用:(注意:在for循环中,它自动打开游标,提取光标,并自动提取它内部的数据。

关闭游标)




声明
光标emp_sal_cursor是选择employee_id,last_name,工资从员工那里
department_id = 80;
开始
C emp_sal_cursor环
dbms_output.put_line('employee_id:| | c.employee_id | | ',' | | 'last_name:| | c.last_name | |,
| | 'salary:| | c.salary);
结束循环;
结束;





用光标调整公司员工的工资。

工资幅度调整基数

0-5000 5%

5000-10000 3%

10000-15000 2%

15000 - 1%

实现uff1a




声明
光标emp_cursor是选择employee_id,从员工工资;
v_empid employee_id %型员工;
v_sal员工工资的百分之式;
v_temp数(4,2);
开始
打开emp_cursor;
取emp_cursor为v_empid,v_sal;
而emp_cursor %发现循环
如果v_sal<5000然后v_temp:= 0.05;
elsif v_sal<10000然后v_temp:= 0.03;
elsif v_sal<15000然后v_temp:= 0.02;
其他v_temp:= 0.01;
最后如果;
dbms_output.put_line(v_empid | | ',' | | v_sal);
更新员工
设置工资=工资*(1 + v_temp)
在employee_id = v_empid;
取emp_cursor为v_empid,v_sal;
结束循环;
近emp_cursor;
结束;



for循环的实现




声明
光标emp_cursor是选择employee_id,从员工工资;
v_temp数(4,2);
开始
C emp_cursor环
如果c.salary<5000然后v_temp:= 0.05;
Elsif c.salary << 10000 v_temp:= 0.03;
Elsif c.salary << 15000 v_temp:= 0.02;
其他v_temp:= 0.01;
最后如果;
更新员工
设置工资=工资*(1 + v_temp)
在employee_id = c.employee_id;
结束循环;
结束;



隐式游标:更新员工工资(提高工资10),如果找不到员工,则不需要此人打印信息:




开始
更新员工
设定工资=工资+ 10
在employee_id = 1001;
如果SQL %发现然后dbms_output.put_line(‘选中没有这个人);
最后如果;
结束;



异常:

预定义异常:(有24个预定义异常,检查表)




声明
v_sal员工工资的百分之式;
开始
选择从员工工资v_sal
在employee_id > 100;
dbms_output.put_line(v_sal);
例外
当too_many_rows然后dbms_output.put_line(行输出的'overnumber);
当别人再dbms_output.put_line(其他异常);
结束;



非预定义异常:




声明
e_deleteid_exception例外;
语用exception_init(e_deleteid_exception,- 2292);
开始
删除员工
在employee_id = 100;
例外
当e_deleteid_exception然后dbms_output.put_line(完整性约束,'violation所以你不能删除此用户);
当别人再dbms_output.put_line(其他异常);
结束;



用户自定义异常:




声明
e_sal_hight例外;
v_sal员工工资的百分之式;
开始
选择薪酬为员工在v_sal employee_id = 100;
如果v_sal > 10000提出e_sal_hight;
最后如果;
例外
当e_sal_hight然后dbms_output.put_line(工资太高);
当别人再dbms_output.put_line(其他异常);
结束;



挑选某人的薪水…成…如果找不到,就打印出数据。




声明
v_sal员工工资的百分之式;
开始
选择薪酬为员工在v_sal employee_id = 1001;
例外
当no_data_found然后dbms_output.put_line(不是发现这个数据);
当别人再dbms_output.put_line(其他异常);
结束;
更新指定的员工工资,如低于300,工资加100,处理no_data_found例外,too_many_rows。
声明
v_sal员工工资的百分之式;
开始
选择薪酬为员工在v_sal employee_id = 1001;
如果v_sal<300更新员工工资=底薪+ 100套,employee_id = 101;
最后如果;
例外
当no_data_found然后dbms_output.put_line(不是发现这个数据);
当too_many_rows然后dbms_output.put_line(太多行输出);
当别人再dbms_output.put_line(其他异常);
结束;



自定义异常:

更新指定的员工工资,增加100;如果指定雇员不引发异常:no_result;




声明
no_result例外;
开始
更新员工工资=底薪+ 100套,employee_id = 1001;
如果SQL %未提出no_result;
最后如果;
例外
当no_result然后dbms_output.put_line(‘选中没有这个数据,更新失败);
当别人再dbms_output.put_line(其他异常);
结束;





存储过程:

写一个简单的hello_world存储功能




创建或替换功能hello_world
返回空
是(相当于声明,您可以定义一个变量,一个记录,一个光标在它后面)
开始
return'helloworld;
结束;
存储函数的调用:
开始
dbms_output.put_line(hello_world);
结束;
或:
选择hello_world双;





带有参数的存储函数:




创建或替换功能hello_world1(v_logo VARCHAR2)
返回空

开始
return'helloworld| | v_logo;
结束;
呼叫:
选择hello_world1('shellway)从双
或:
开始
dbms_output.put_line(hello_world1('shellway '));
结束;





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




创建或替换功能get_sysdate
返回空

开始
to_char(SYSDATE返回,'yyyy-mm-dd hh24:MI:SS);
结束;





用一个参数定义一个函数,增加两个数




创建或替换功能add_param(v_num1数,v_num2号)
返回数

v_num3号(10);
开始
v_num3:= v_num1 + v_num2;
返回v_num3;
结束;
呼叫:
选择add_param(2,5)从双;
或:
开始
dbms_output.put_line(add_param(5,4));
结束;





定义一个函数:得到给定部门的工资总和,要求部门号被定义为参数,工资总额是返回值。




创建或替换功能get_sal(dept_id号)
返回数

v_sumsal数= 0(10);
光标salary_cursor是选择从员工那里department_id = dept_id工资;
开始
C salary_cursor环
v_sumsal:= v_sumsal + c.salary;
结束循环;
返回v_sumsal;
结束;
呼叫:
选择get_sal(80)从双;





定义一个函数:得到给定部门的工资总和和部门的总雇员数(定义为输出类型的参数)。

要求:部门号被定义为一个参数,工资总额被定义为一个返回值。




创建或替换功能get_sal(dept_id数,total_count号)
返回数

v_sumsal数= 0(10);
光标salary_cursor是选择从员工那里department_id = dept_id工资;
开始
total_count:= 0;
C salary_cursor环
v_sumsal:= v_sumsal + c.salary;
total_count:= total_count + 1;
结束循环;
返回v_sumsal;
结束;
呼叫:
声明
v_count号(4);
开始
dbms_output.put_line(get_sal(80,v_count));
dbms_output.put_line(v_count);
结束;





定义一个存储过程:获取给定部门的工资总和(通过out参数),这需要将部门号和总工资定义为参数。

注意:存储过程不同于存储函数,存储函数具有返回值,存储过程则不存在,存储过程在调用时直接调用)。




创建或替换程序get_sal1(dept_id数了数,sumsal)

光标salary_cursor是选择从员工那里department_id = dept_id工资;
开始
sumsal:= 0;
C salary_cursor环
sumsal:= sumsal + c.salary;
结束循环;
dbms_output.put_line(sumsal);
结束;
呼叫:
声明
v_sal数= 0(10);
开始
get_sal1(80,v_sal);
结束;





一个给定部门的工资增加(如果是时间的话),在公司里95)在这段期间,薪金增加了5%。

(95, 98)3%

(98,)1%

获得以下回报:加薪公司每月额外增加三英镑(定义一个输出类型参数)




创建或替换程序add_sal(dept_id数了数,温度)

光标sal_cursor是选择employee_id,工资,hire_date
从员工那里department_id = dept_id;
v_temp数(4,2):= 0;
开始
温度=0;
C sal_cursor环
如果to_char(c.hire_date,'yyyy)< '1995然后v_temp:= 0.05;
elsif to_char(c.hire_date,'yyyy)<显示的那么v_temp:= 0.03;
其他v_temp:= 0.01;
最后如果;

更新员工
设置工资=工资*(1 + v_temp)
在employee_id = c.employee_id;

温度:温度+ c.salary * v_temp =;
结束循环;
dbms_output.put_line(临时);
结束;
呼叫:
声明
v_i数= 0(10);
开始
add_sal(80,v_i);
结束;




触发器:

触发事件:在插入、更新和删除的情况下触发触发器触发器

触发时间:触发器在触发事件之前(之前)或之后(之后)。

触发器本身:触发器触发后的目的和意图是触发器本身想要做的事情,如。

触发频率:语句级(语句)触发器和行级(行)触发器

写一个简单的触发器:




创建触发器update_emp_trigger

更新员工
对于每一行(行级触发器,即每更新一个记录将输出a'helloworld',如果没有这个语句是一个语句级触发器)
开始
dbms_output.put_line('helloworld);
结束;





用法:新的,旧的修饰语:




1,
创建表的EMP1
作为
选择employee_id,工资,员工在department_id = 80电子邮件;
2,
创建触发器update_emp_trigger2

更新EMP1
每一行
开始
dbms_output.put_line(老工资:| |:老。工资| |新工资:| |:新的待遇。);
结束;
三,
更新设置工资=工资+ 100 EMP1;





写一个触发器,备份在my_emp_bak表中相应的记录时,my_emp记录被删除。




1。创建一个my_emp表:
创建表my_emp
作为
选择employee_id,从员工工资;
2。创建一个my_emp_bak表:
创建表my_emp_bak
作为
选择employee_id,从员工那里1 = 2的工资;
三.检查创建表中的记录:
SELECT * FROM my_emp
SELECT * FROM my_emp_bak
4。创建触发器:
创建触发器delete_emp_trigger
之前
删除my_emp
每一行
开始
插入my_emp_bak
价值观(::老。employee_id,:老。工资);
结束;
5。执行包含触发器时间的语句:
删除从my_emp
6。检查触发器后的结果。
SELECT * FROM my_emp
SELECT * FROM my_emp_bak