序列与索引,同义词,PLSQL语法,游标

序列的作用:模拟自增,一般用来插入主键的值

本质是内存中的数组:

查找数据库里面所有的序列:

select * from user_sequences;

create sequence 序列名
increment by 步长
start with 起始值
maxvalue|nomaxvalue
minvalue|nominvalue
cycle|no cycle
cache|no cache        作用就是缓存,如果有多个表在用这个序列,可以很好的分配  

 

create sequence myseq1 
increment by 2
start with 1
maxvalue 10
cycle
cache 3     cache的个数要小于循环的个数

 

 

create table person(
id number primary key,
name varchar2(20) not null,
age number default 18,
email varchar2(20) check(length(email)>10)
)

 序列的两个属性: 一开始是指向第一个值的前一个值,所以一般从nextval 开始

当前值:currval                                    select myseq.currval from dual;
下一个值:nextval                               select myseq.nextval from dual;

insert into person values(myseq.nextval,'ls',default,default);

 

 修改序列:只需要把create 改成alter 即可;

alter sequence myseq increment by 2;

 

 删除序列:drop

drop sequence myseq1;

 

索引:主键就是一个索引,不用给主键加索引

索引类型:B树索引(默认),位图索引

创建索引: create index 索引名 on 表名(列名)    create index myindex on emp(deptno)   二级索引: create index myindex1 on emp(deptno,sal)

 

 同义词:

 

PL/SQL

set SERVEROUTPUT ON;--要输出打印语句要先执行
declare
begin
  dbms_output.put_line('Hello_World');
end;
declare
  pname varchar2(20); -- 变量的声明是: 变量名  类型  := 赋值  这里这样给pname定义类型不太好,因为最后要把ename的值赋给pname,所以最好写成: pname emp.ename%type
  psex char(3):='';   
begin
  dbms_output.put_line(pname||'---'||psex);  -- ---男
  select ename into pname from emp where empno = 7369;   --把查询出来的值赋给pname
  dbms_output.put_line(pname||'---'||psex);-- SMITH---男
end;

 引用型变量:pname EMP.ENAME%type;

记录型变量(相当于java中的对象,可以把多个变量保存在一个对象里面):empinfo emp%rowtype      可以记录emp中整列的数据

declare
  empinfo emp%rowtype;
begin
  select * into empinfo from emp where empno = 7369;
  dbms_output.put_line(empinfo.ename||'---'||empinfo.deptno||'---'||empinfo.job);
end;

IF 语句:

declare
  pnum number(1):=1;
begin
  if pnum=1 then dbms_output.put_line('');
  elsif pnum=2 then dbms_output.put_line('');
  else dbms_output.put_line('');
  end if;
end;

循环语句:

1.

while 条件
 loop
   .....
 end loop;

declare
  pnum number:=5;
begin
   while pnum<10
    loop
      pnum:=pnum+1;
      dbms_output.put_line(pnum);
    end loop;
end;

 

2.

loop
....
exit when i>5;
end loop;

如果大于5就退出:

declare
   pnum number:=1;
   psum number:=0;
begin
  loop
      exit when pnum>5;
      psum:=psum+pnum;
      pnum:=pnum+1;
    end loop;   
    dbms_output.put_line(psum);
end;

 

3.

for i in 1..5;
loop
...
end loop;

//计算1~5之和:

declare
begin
    for x in 1 .. 5
    loop
        dbms_output.put_line(x);
    end loop;
end;

游标:

 

 

 

 

 使用光标的步骤:

1.先定义光标

2.打开光标

3.把光标的值fetch到变量里面,处理

4.关闭光标

查询所有员工的名字和薪资:

declare
--定义变量,常量,光标等
  cursor cemp is select ename,sal from emp;
  pename emp.ename%type;
  psal emp.sal%type;
begin
  open cemp;--打开光标
  loop  --循环  获取每一行数据
    fetch cemp into pename,psal;---把数据存放至变量中
    exit when cemp%notfound;   --循环到最后就退出
    DBMS_OUTPUT.PUT_LINE(pename||'的薪资是:'||psal);
  end loop;
  close cemp;--关闭光标
  
end;
PL/SQL 过程已成功完成。
SMITH的薪资是:800
JONES的薪资是:2975
FORD的薪资是:3000
ALLEN的薪资是:1600
WARD的薪资是:1250
MARTIN的薪资是:1250
BLAKE的薪资是:2850
CLARK的薪资是:2450
KING的薪资是:5000
TURNER的薪资是:1500
JAMES的薪资是:950
MILLER的薪资是:1300
SCOTT的薪资是:3000
ADAMS的薪资是:1100

根据职位的不同涨薪资:

declare 
  cursor cemp is select empno,job from emp;
  pempno emp.empno%type;
  pjob   emp.job%type;
begin
  open cemp;--打开游标
  loop
    exit when cemp%notfound;
    fetch cemp into pempno,pjob;--一行一行的读取值存放至变量中
    if pjob='PRESIDENT' 
      then update emp set sal=sal+1200 where emp.empno = pempno;
    elsif pjob='MANAGER'
      then update emp set sal=sal+800 where emp.empno = pempno;
    else update emp set sal=sal+400 where emp.empno = pempno;
    end if;
  end loop;
  close cemp;--关闭游标
end;

查询特定部门编号的员工姓名(使用带参数的光标)

declare
  cursor cemp(pno emp.deptno%type) is select ename from emp where deptno =  pno;
  pename emp.ename%type;
begin
  open cemp(20);
    loop    
      fetch cemp into pename;
      exit when cemp%notfound;
      DBMS_OUTPUT.PUT_LINE(pename);
    end loop;
  close cemp;
end;

例外(异常)

 

 自定义例外:

 

declare
 myexc exception;
 pnum number:=1;
 
begin
 if pnum=1 then raise myexc;
 end if;
 exception
  when myexc then DBMS_OUTPUT.PUT_LINE('自定义异常');
end;

 

posted @ 2020-12-22 18:06  Joyce502  阅读(200)  评论(0)    收藏  举报