重温Oracle(7)

第十八章 序列、同义词

 

创建序列

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

 

CycleCache

用了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;

 

 

张文海

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值