数据库知识点记录

数据库中<>的含义:

<>为不等号,常见的其它写法有: !=


数据库中decode的使用方法:

decode(表达式,表达式的值,满足条件后的取值)

decode(表达式,表达式的值,满足条件后的取值,不满足条件的取值)


在这里插入图片描述


PL/SQL块结构体

DECLARE
/* 声明变量 */
BEGIN
/*sql语句的操作:select … into … from … where …
主体部分 */
EXCEPTION
/*异常部分 */
END;


流程控制:

  1. 条件判断(两种)
  • 方式一:if … then … elsif … then … else … end if;
  • 方式二:case … when … then … end;
  1. 循环结构(三种)
  • 方式一:loop … exit when … end loop;
  • 方式二:while … loop … end loop;
  • 方式三:for i in … loop … end loop;
  1. goto/exit

循环(简单)

例:从1打印到100

  1. 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;

  1. 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;

  1. FOR循环
begin
  for c in 1..100 loop
      dbms_output.put_line(c);
  end loop;
end;

  • 在in后加reverse代表逐次递减(从100一次打印到1)

例:输出从2-100的素数

  1. 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;
  1. 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

  1. 普通游标
--打印出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;
  1. 使用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


  • 数据库入门基础完结啦!
  • 主要是根据尚硅谷的视频总结的!
  • 以后也要多多努力!
  • 拜拜❀❀❀❀❀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值