7.Oracle7

1. 序列sequ ence:自增主键的问题

-- Create sequence 
create sequence SEQ_STUNO
minvalue 1      -- 最小值
maxvalue 999999 -- 最大值
start with 1    -- 开始值
increment by 1  -- 增量(别的数据有auto increament字段)
cache 10;       -- 防止oracle挂掉缓存个数

在这里插入图片描述

补: 建立外键的时候指定删除模式:

  • – cascade主表删除,关联的子表一起删除
  • – 主表删除,关联的子表字段变为null
  • – 开发时不设置:要先删子表,再删主表

2. 视图:虚拟表

经常用的复杂查询可以定义视图。视图一般不做修改,只查询

create view 视图名 as (select ....)

3. 索引

提高查询效率

  • unique: 唯一索引
  • nomal; 普通(范围索引)
  • bitmap: 重复多的数据快

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

4. 同义词

  • 起个别名代替emp

CREATE SYNONYM emp1 for emp;
select * from emp1;


5. PL

行类型:record

select * from emp1;

begin
   
   DBMS_OUTPUT.put_line('hell');
end;

declare
  v_empno number(5);
  v_ename varchar2(10);
  
begin
  select empno, ename into v_empno, v_ename
  from emp
  where empno = 7369;
  DBMS_OUTPUT.put_line(v_empno || v_ename);
end;


declare
begin 
  for i in 1..100 loop
     DBMS_OUTPUT.put_line(i);
  end loop;
end;
----
declare
a emp%rowtype; -- 行类型 emp表中一行的数据类型
begin
  select * into a
  from emp where empno = 7369;
  DBMS_OUTPUT.put_line(a.empno || a.ename);
end;
--
declare
type type1 is record(empno1 number, ename1 varchar2(200)); -- 自定义record类型レコード
a type1;
begin
  select empno, ename into a
  from emp where empno = 7369;
  DBMS_OUTPUT.put_line(a.empno1 || a.ename1);
end;


5.2 游标cursor

游标指向一个检索结果,

要打开,要关闭,通过fetch指向下一行。

for可以自动开关和fetch.

---游标
declare
a emp%rowtype;
cursor CUR_EMP is select * from emp;
begin
   open CUR_EMP;
        -- 循环获取
        fetch cur_emp into a; -- 游标指向新的一行
        loop
          exit when not CUR_EMP%FOUND; -- 游标没有指向数据
          DBMS_OUTPUT.put_line(a.empno || a.ename || a.job);
          
          fetch cur_emp into a; -- 指向新的一行
        end loop;
   close CUR_EMP;
end;
--
declare
a emp%rowtype;
cursor CUR_EMP is select * from emp;
begin
    for a in cur_emp loop -- for 自动开关游标和fetch游标
        DBMS_OUTPUT.put_line(a.empno || a.ename || a.job);
    end loop;
end;

5.3 存储过程procedure

参数可以是, in或out或in out组合。

create or replace procedure getCount(in_job in EMP.JOB%type, in_outcount in out number) is
v_count number;
begin
  if in_job is not null then
    select count(*) into in_outcount
    from emp
    where job = in_job;
  else
    in_outcount:=0;
  end if;
  -- Dbms_Output.put_line(v_count);
end getCount;
-------
-- Created on 2021/4/20 by ASUS 
declare 
  -- Local variables here
  i integer;
  in_job varchar(20) := 'SALESMAN';
  v_count number;
begin
  -- Test statements here
  getCount(in_job => 'SALESMAN', in_outcount =>:v_count );
  DBMS_OUTPUT.put_line(v_count);
end;

5.4. 函数Function

  • 有返回值 (存储过程可以用out参数做返回)
create or replace function add11(inp1 in number, inp2 in number) return number is -- FUnction特有
  v_result number;
begin
  v_result := nvl(inp1, 0) + nvl(inp2, 0);

  return v_result;
end add11;

-- Created on 2021/4/20 by ASUS 
declare 
  -- Local variables here
  i integer;
  in_job varchar(20) := 'SALESMAN';
  v_count number;
  rec emp%rowtype;
  cursor CUR_EMP is select * from emp;
begin
  -- Test statements here
  getCount(in_job => 'SALESMAN', in_outcount =>:v_count );
  for rec in CUR_EMP loop
      select add11(sal, comm) into v_count
      from emp where empno = rec.empno;
      DBMS_OUTPUT.put_line(v_count);
  end loop;
end;

5.5 触发器triger

  • 第一种:DML触发器※
  • 第二种:DDL触发器
create or replace trigger EMP_TRI
  AFTER delete
  on emp 
  FOR EACH ROW
declare
  -- local variables here
begin
  insert into emp_bak1(empno, ename) values (:old.empno,:old.ename);
end EMP_TRI;

replace trigger EMP_TRI
AFTER delete
on emp
FOR EACH ROW
declare
– local variables here
begin
insert into emp_bak1(empno, ename) values (:old.empno,:old.ename);
end EMP_TRI;





































  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值