第十八章 序列、同义词
创建序列
Create sequence myseq --创建序列myseq
Start with 1 --序列开始为1
Increment by 1 --每次增加1
Order
Cache 20 --oracle缓存20个序列的值
Nocycle; --值不循环,如果循环,则需要设置最大值,当currval达到最大值时,执行nextval后,值将变成start with的值。
NextVal, CurrVal
Select myseq.nextval from dual;
Select myseq.currval from dual;
注意:新创建的序列,必须先调用nextval之后,才有currval。每次调用nextval值自增1。
Cycle,Cache
用了nocycle,就可以确保当该序列用于多张表的时候,ID是唯一的。(待确定)
用cycle,需要设置最大值,当currval达到最大值时,执行nextval后,值将变成start with的值。
Create sequence myseq2 start with 1 increment by 1 cycle maxvalue 3 nocache;--达到3之后,重新从1开始
如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取得快些。Cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号,比如数据库突然不正常宕掉(shutdown abort),cache中的sequence就会丢失,所以可以在create sequence 的时候用nocache防止这种情况。
修改序列
不能改变当前值,但是可以改变增量inrement by,最大值maxvalue,是否循环cycle/nocycle,是否缓存cache/nocache
Alter sequence myseq increment by 3; --修改序列myseq的增量值为3,即每次自增3。
删除序列
Drop sequence myseq;
同义词
在任何一个用户下,都可以直接访问dual,而不需要加上前缀的用户名如:scott.emp
Select * from dual;
为什么?因为同义词的存在。
Dual其实是sys用户下的一张表
Select * from dual;
Select * from sys.dual;
Select table_name from user_tables where lower(table_name) = ‘dual’; --需要sys用户登录才能查询到。
Select table_name from all_tables where lower(table_name) = ‘dual’;
作用:
很方便的操作不同用户下的对象;
能使两个应用程序使用不同的名字指向同一张表;
使用不同的用户指向同一张表。
Create synonym dept for scott.dept; --创建私有的同义词,只有创建者才有权限用
Drop synonym dept;
Create public synonym dept for scott.dept; --创建公有同义词,所有人都可以用
Drop public synonym dept;
第十九章 PL/SQL
PL/SQL块
PL/SQL块是在SQL语言之上发展起来的一种应用,可以集中的处理各种复杂的SQL操作
语法:
Declare
--声明部分
Begin
--编写主题
Exception
--捕获异常
End
/
简单的PL/SQL块:
Declare
i number;
Begin
i:=30;
DBMS_OUTPUT.putline(“I的内容是:”||i);
End;
/
此时,直接执行程序即可。
注意:执行之后发现没有任何的输出,是因为oracle在系统设置中默认设置了输出不显示,如果要显示的话,输入命令:set serveroutput on
异常处理PL/SQL块:
Declare
I number;
Begin
I:=1/0;
Exception
When ZERO_DIVIDE then
Dbms_output.put_line(‘error’);
End;
/
PL/SQL块还可以接受用户的输入信息,例如:用户输入一个雇员编号,查询出雇员的姓名。
Declare
eno number; --eno emp.empno%TYPE
en varchar2(30);
Begin
eno:=&no; --输入信息保存在eno里
Select ename into en from emp where empno=eno;--根据eno的值查询ename,并保存到en
Dbms_output.put_line(‘编号为:’||eno||’的雇员的姓名为:’||en);
Exception
When no_data_found then
Dbms_output.put_line(‘没有此雇员’);
End;
/
说明:
Emp.empno%TYPE::表示以emp表中的empno字段的类型定义变量
Dept dept%rottype:表示dept是一行数据,类似于hibernate 的PO对象
e.ename,e.empno into en,eno:一次可以同时放入多个值
LOOP循环(do…while)
PL/SQL之中也包含了:循环、分支等条件控制语句
语法:
LOOP
--循环语句;
EXIT WHEN 终止条件;
--循环条件值改变;
END LOOP;
循环输入1..10:
Declare
cou number;
Begin
cou:=1;
LOOP
Dbms_output.put_line(‘cou’||cou);
EXIT WHEN cou>10;
cou:=cou + 1;
END LOOP;
End;
/
此循环式先执行一次之后再判断
While循环
语法:
While(判断循环的条件) loop
--循环的语句;
--循环条件的改变;
End loop;
此语句,是先判断,如果条件满足则执行。
For循环
语法:
For 变量名称 in 变量的初始值..结束值 loop
--循环语句
End loop;
IF语句
语法:
If 条件 then
--执行语句
End if;
IF..ELSE语句
语法:
If 条件 then
--条件成立
Else
--条件不成立
End if;
IF..ELSIF..ELSE语句
语法:
If 条件1 then
--条件1成立
Elsif 条件2 then
--条件2成立
Else
--所有条件都不成立
End if;
GOTO语句
无条件跳转语句
语法:
<<myloop>>
If sal < 3000 then
Sal := sal + 1000;
Goto myloop;
End if;
张文海