序列与索引,同义词,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;
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号