数据库中<>的含义:
<>为不等号,常见的其它写法有: !=
数据库中decode的使用方法:
decode(表达式,表达式的值,满足条件后的取值)
decode(表达式,表达式的值,满足条件后的取值,不满足条件的取值)
PL/SQL块结构体
DECLARE
/* 声明变量 */
BEGIN
/*sql语句的操作:select … into … from … where …
主体部分 */
EXCEPTION
/*异常部分 */
END;
流程控制:
- 条件判断(两种)
- 方式一:if … then … elsif … then … else … end if;
- 方式二:case … when … then … end;
- 循环结构(三种)
- 方式一:loop … exit when … end loop;
- 方式二:while … loop … end loop;
- 方式三:for i in … loop … end loop;
- goto/exit
循环(简单)
例:从1打印到100
- LOOP循环
--1.初始化条件2.循环体3.循环条件4.迭代条件
declare
v_i number(5):=1;
begin
loop
dbms_output.put_line(v_i);
exit when v_i>=100;
v_i:=v_i+1;
end loop;
end;
- WHILE循环
--1.初始化条件2.循环体3.循环条件4.迭代条件
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循环
begin
for c in 1..100 loop
dbms_output.put_line(c);
end loop;
end;
- 在in后加reverse代表逐次递减(从100一次打印到1)
例:输出从2-100的素数
- WHILE方法
declare
v_i number(10):=2;
v_j number(10):=2;
v_flag number(1):=1;
begin
while v_i <= 100 loop
while v_j <= sqrt(v_i) loop
if v_i mod v_j = 0 then v_flag := 0;
end if;
v_j := v_j+1;
end loop;
if v_flag = 1 then dbms_output.put_line(v_i);
end if;
v_j := 2;
v_flag := 1;
v_i := v_i+1;
end loop;
end;
- FOR方法
declare
v_flag number(1):=1;
begin
for v_i in 2..100 loop
for v_j in 2..sqrt(v_i) loop
if mod(v_i,v_j) = 0 then v_flag := 0;
goto lable;
end if;
end loop;
<<lable>>
if v_flag = 1 then dbms_output.put_line(v_i);
end if;
v_flag := 1;
end loop;
end;
游标
游标属性
例:打印出80部门的所有员工的工资:salary:xxx
- 普通游标
--打印出80部门的所有员工的工资:salary:xxx
declare
v_sal employees.salary%type;
--定义游标
cursor emp_sal_cursor is select salary from employees
where department_id = 80;
begin
--打开游标
open emp_sal_cursor;
--提取游标
fetch 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;
--关闭游标
close emp_sal_cursor;
end;
- 使用FOR游标
--打印出80部门的所有员工的工资:salary:xxx
declare
--定义游标
cursor emp_sal_cursor is select salary,employee_id,hire_date from employees
where department_id = 80;
begin
for c in emp_sal_cursor loop
dbms_output.put_line('empid:'||c.employee_id||'salary:'||c.salary||
'hire_date:'||c.hire_date);
end loop;
end;
记录类型
--声明一个记录类型:
type emp_record is record (
v_sal number(10,2);
v_name varchar2(20);
)
--声明一个记录类型的变量
v_emp_record emp_record;
异常
自定义异常
declare
e_deleteid_exception exception;
pragma exception_init(e_deleteid_exception,-2292);
begin
delete from employees where employee_id = 100;
exception
when e_deleteid_exception then dbms_output.put_line('违反完整性约束条件,故不可删除此用户');
end;
编写存储函数
--要求:定义一个函数,获取给定部门的工资总和,和该部门员工总数(定义为OUT类型的参数)
--部门号定义为参数,工资总和定义为返回值
create or replace function get_sal(dept_id number,total_count out number)
return number
is
v_sumsal number(10):=0;
cursor salary_cursor is select salary from employees
where department_id = dept_id;
begin
total_count:=0;
for c in salary_cursor loop
v_sumsal:=v_sumsal + c.salary;
total_count:=total_count+1;
end loop;
return v_sumsal;
end;
存储函数格式
--函数的声明(有参数的写在小括号里)
create or replace function func_name(v_param varchar2)
--返回值类型
return varchar2
is
--PL/SQL块变量、记录类型、游标的声明(类似declare)
begin
--函数体(返回值需要return)
return 'helloworld'||v_logo;
end;
存储过程
/*
对给定部门(作为输入参数)的员工进行加薪操作,若其到公司的时间在 (?,95)期间,为其加薪5%
[95,98) 3%
[98,?) 1%
得到以下返回结果:为此次加薪公司每月需要额外付出多少成本(定义一个OUT类型的输出参数)
*/
create or replace procedure add_sal(dept_id number,temp out number)
is
cursor sal_cursor is select employee_id,salary,hire_date from employees where department_id = dept_id;
v_i number(4,2):=0;
begin
temp:=0;
for c in sal_cursor loop
if to_char(c.hire_date,'yyyy')<'1995' then v_i:=0.05;
elsif to_char(c.hire_date,'yyyy')<'1998' then v_i:=0.03;
else v_i:=0.01;
end if;
update employees set salary = c.salary*(1+v_i) where employee_id = c.employee_id;
temp:=temp+c.salary*v_i;
end loop;
dbms_output.put_line(temp);
end;
执行:
declare
v_temp number(10):=0;
begin
add_sal(80,v_temp);
end;
触发器
创建触发器
例:编写一个触发器,在对my_map记录进行删除的时候,在my_map_back表中备份对应的记录
--编写一个触发器,在对my_map记录进行删除的时候,在my_map_back表中备份对应的记录
create table my_emp
as
select employee_id,salary from employees
create table my_emp_back
as
select employee_id,salary from employees
where 1=2
--创建触发器
create or replace trigger delete_emp_trigger
before
delete on my_emp
for each row
begin
insert into my_emp_back
values(:old.employee_id,:old.salary);
end;
delete from my_emp
select * from my_emp
select * from my_emp_back
- 数据库入门基础完结啦!
- 主要是根据尚硅谷的视频总结的!
- 以后也要多多努力!
- 拜拜❀❀❀❀❀