Oracle笔记2

建立序列
create sequence my_seq
start with 1001  //开始
increment by 1   //每次增长1
nomaxvalue   //  无最大值
minvalue 1001   //  最小值
cycle /nocycle   // 循环/不循环
cache 100 /nocache   // 缓存/不缓存

select my_seq.currval from dual ;--查询序列当前值,序列建立后不能直接用该方法
建立索引

创建B—树索引的语法:

create index 索引名 on 表名(列名)[tablespace  表空间];

创建位图索引语法:

create bitmap index 索引名 on 表名(列名);

删除索引:drop index 索引名
分类:
按照数据存储方式,可以分为B树、反向索引、位图索引;
B
-树索引建立在重复值很少的列上,而位图索引则建立在重复值很多、不同值相对固定的列上。
对于包含低基数列以及在SQL语句的WHERE子句中使用许多AND或OR运算符的数据仓库环境,非常适合使用位图索引
按照索引列的个数分类,可以分为单列索引、复合索引;
按照索引列值的唯一性,可以分为唯一索引和非唯一索引.
此外还有函数索引,全局索引,分区索引…

PL/SQL块
declare
      说明部分    (变量说明,例外说明 〕
begin
      语句序列   (DML语句〕… 
exception
      例外处理语句   
end;

数据类型

1、%type

v_ename emp.ename%type;  --定义和emp表的ename相同的类型

2、%rowtype

v_dept_row dept%rowtype;  --定义和dept相同的行类型

3、%record

type emp_record_type is record (  --定义一个记录类型,包含员工信息
  ename emp.ename%type,
  sal emp.sal%type,
  comm emp.comm%type,
  total_sal sal%type);
v_emp_record emp_record_type;--声明记录类型变量

4、table类型

type dept_table_type is table of dept%rowtype
index by binary_integer;  --定义一个记录类型
v_dept_table  dept_table_type;  --声明记录类型变量
流程控制语句

一、if 选择

if  条件表达式  then
     语句段
 end if;
if 条件表达式 then
	语句段1
else
	语句段2
end if;
if 条件表达式1 then
语句段1
elsif 条件表达式2 then
语句段2
elsif 条件表达式3  then
语句段3
......
elsif 条件表达式n
语句段n
end if;

二、case when选择

case
when 条件表达式1 then
语句段1;
when 条件表达式2 then
语句段2;
......
else
语句段n;
end case;

三、loop循环

loop
   <程序块 1>
   if <条件表达式> then
       exit
   end if
   <程序块 2>
end loop;
loop
   <程序块 1>
   exit  when<条件表达式>
   <程序块 2>
end loop;
while <条件表达式>  loop
     <程序块>
end loop;

四、for循环

for <循环变量>  in  <初始值>..<终止值> loop
     <程序块>
end loop;
存储过程

什么是存储过程:存储过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程。
创建存储过程:

create or replace procedure pro_do(参数名  in/out  类型...)
 as   声明部分
begin
   执行部分
  dbms_output.put_line('这是一个存储过程');
exception
  异常处理部分
end;

in 为输入类型参数,out 为输出类型参数

调用过程:
1、在pl/sql 块中调用:过程名();
2、call 过程名()
3、exec 过程名()

函数

函数用于返回特定数据,如果在应用程序中经常需要通过执行SQL语句来返回特定数据,则可以基于这些操作创建特定的函数。
函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型。
语法:

create or replace function 函数名(参数类型)
 return 返回值类型
as 声明部分
begin
   执行部分
  return
exception
  异常处理部分
end;

函数调用:
1,在pl/sql 块中调用:函数名();
2,select 函数名() from dual;

过程与函数比较

1、过程与函数有许多相同的功能及特性
都使用IN模式的参数传入数据、OUT模式的参数返回数据;
输入参数都可以接收默认值,都可以传值;
调用时的实参都可以使用位置表示法或名称表示法;
都有声明部分、执行部分和异常处理部分;
2、不同:
一般而言,如果需要返回多个值或不返回值,就使用过程;
如果只需要返回一个值,就使用函数;
虽然函数带OUT模式的参数也能返回多个值,但是一般都认为这种方法属于不好的编程习惯或风格,过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。

视图

创建或修改视图:
create or replace view 视图名 as select... [with read only];
删除视图:drop view 视图名;

同义词

语法:

create synonym 同义词 for 对象;
--删除
drop synonym 同义词;
游标

游标分为显式游标和隐含游标两种,隐含游标用于处理SELECT INTO和DML语句 ;显式游标则用于处理SELECT语句返回的多行数据。
一、显示游标

--定义游标 
 cursor cursor_name IS
select_statement;
--打开游标
OPEN cursor_name;
--提取数据 
 fetch cursor_name into variable1,variable2,...;
--将游标中的数据一次性地提取到表结构中
fetch cursor_name bulk collect into collect1…;
--关闭游标 
 close cursor_name;

游标属性使用格式为:游标名 + 属性名
%ISOPEN
用于确定游标是否已经打开。如果游标已经打开,则返回值为TRUE;否则返回FALSE

%FOUND
检查是否从结果集中提取到数据。如果提取到数据,则返回值为TRUE;否则返回FALSE

%NOTFOUND
与%FOUND属性恰好相反,如果提取到数据,则返回值为FALSE;否则返回TRUE

%ROWCOUNT
返回到当前行为止已经提取到的实际行数
二、参数游标
定义:
cursor cursor_name(参数,类型) is select_statement;
参数只能指定类型,而不能指定长度。
把参数作为查询条件,打开游标时传参。

触发器

1、DML触发器:对数据库表进行DML操作时触发。
定义语法

create or replace trigger 触发器名字
before|after
update|insert|delete on table_name
for each row
begin
    ...
end;

2、instead of 触发器:为了在不能执行DML操作的复杂视图上执行DML操作,必须基于视图创建instead of 触发器。
语法:

create or replace trigger 触发器名字
instead of 
delete/update/insert on view_name 
for each row
  begin
        ...;
  end;

3、系统触发器:指基于oracle系统事件所创建的触发器
事件属性函数及功能:
ora_client_ip_address : 返回客户端的IP地址
ora_database_name :返回当前数据库名
ora_dict_obj_name :返回DDL操作所对应的数据库对象名
ora_dict_obj_owner :返回DDL操作所对应的数据库对象的所有者名
ora_dict_obj_type :返回DDL操作所对应的数据库对象的类型
ora_instance_num :返回历程号
ora_is_alter_column(column_name in varchar2) :检测特定列是否被修改
ora_is_drop_column(column_name in varchar2) :检测特定列是否被删除
ora_login_user :返回登录用户名
ora_sysevent :返回触发触发器的系统事件名

删除触发器:drop trigger 触发器名字;
禁用触发器:alter trigger 触发器名字 disable;
启用触发器:alter trigger 触发器名字 enable;
启用emp表上所有触发器:alter table emp enable all trigger;

oracle优化

一、优化
1、合理的数据库设计
2、建立优化索引
3、避免在索引列上使用计算
4、注意组合索引的顺序
5、where子句的连接顺序
6、减少对表的查询,减少访问数据库的次数
7、select子句中避免使用 *
8、用where子句替代having
9、尽量多使用commit
10、使用表的别名
二、删除重复行
删除emp表中的重复行

delete from emp e1
 where e1.rowid >
       (select min(e2.rowid) from emp e2 where e1.empno = e2.empno);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值