oracle补充

索引

索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据的I/O次数,因此可以显著的提高性能

  • 创建索引的SQL
  • 把下面表中的name字段创建索引
  • create index teachername on teacher(name);
    create index teachername2 on teacher(tid,age);  --可以索引多个字段
  • 创建唯 一索引的SQL
  • create unique index  teacherhao on teacher(hao);
    create unique index teacherhao2 on teacher(hao,hao2);
  • 删除索引的SQL
  • drop index teachername;

序列

序列是Oracle提供的用于产生一系列唯一数字的数据库对象。 在某些数据表的结构中,有些字段需要这种特征: 比如,对于某个学生数据表的学号关键字段,用户可以希望在录入数据时,能够自动在上一个记录的学号字段上自动加1等。

  • 创建序列要有序列权限
  • grant create sequence,select any sequence to 用户名
    --dba权限包括以上权限,所以不用重新赋予
  • 序列的创建
  • CREATE SEQUENCE sequence      --创建序列名称
    [INCREMENT BY n]     --递增的序列值是n  步长为n
    [START WITH n]      --开始的值,递增默认是minvalue 递减是maxvalue
    [{MAXVALUE n | NOMAXVALUE}]     --最大值
    [{MINVALUE n | NOMINVALUE}]    --最小值
    [{CYCLE | NOCYCLE}]     --循环/不循环
    [{CACHE n | NOCACHE}];   --分配并存入到内存中

    SQL例子:

  • create sequence SEQ4 increment by 1 start with 1 minvalue 1 nomaxvalue nocycle nocache; 
  • 序列的使用
  • create table lvling6(
    id number,
    name varchar(20)
    );
    
    insert into lvling6 values(SEQ4.nextval,‘xiaomi2‘);
    select * from lvling6;
  • 删除序列
  • drop   sequence  SEQ4

视图

视图是查看数据表中数据的一种方, 当一些用户需要经常访问和查询数据表中某些字段构成的数据,但管理员从安全角度考虑又不希望他们直接接触数据表时,可以利用Oracle数据库提供的视图这一数据对象。 视图犹如数据表的窗户,用户只能查看他们可以看到的数据,视图不是数据表,它仅是一些SQL查询语句集合,作用是按照不同的要求从数据表中提取不同的数据。

视图优点

因为视图可以有选择性的选取数据库里的一部分,用户通过简单的查询可以从复杂查询中得到结果,维护数据的独立性,视图可从多个表检索数据,对于相同的数据可产生不同的视图

  • 创建视图的SQL
  • create [or replace] view  teacher_view(id,name,age,hao)  as  select   tid,tname,age,hao
    from teacher;
    --or replace 代表如果视图存在则替换,不存在则创建一张新的视图
    
    create [or replace] view  teacher_student_view(id,name,age,hao,sname,sid)  as  select   t.tid,t.tname,t.age,t.hao,s.name,s.studentid
    from   teacher  t,student  s
    where t.tid=s.studentid;
  • 用SQL 查看表的视图
  • select    *   from    teacher_student_view ;
    --和查表一样,表名换成视图名即可
  • 修改视图的SQL
  • create or replace view  teacher_student_view(id,name,age,hao,studname,studid)
    as  select  t.tid,t.tname,t.age,t.hao,s.name,s.studentid
    from   teacher  t,student  s
    where t.tid=s.studentid;
    
    --通过or replace 重新创建同名视图即可,如果视图存在则替换
  • 修改视图的数据SQL
  • create [or replace] view  teacher2_view(id,name,age,hao)
    as  select  t.tid,t.tname,t.age,t.hao
    from   teacher  t;
    
    update   teacher2_view
    set  age=20
    where  id=1;--更新视图表中的数据
    --注:在实际开发中,很少对视图中数据进行修改
  • 设置成只读视图
  • with read only :设置为只读视图
  • create [or replace] view  t_view(id,name,age,hao)
    as  select  t.tid,t.tname,t.age,t.hao
    from   teacher  t
    where age>40
    with read only;
    --不能插入/更新数据
  • 为视图加限制
  • WITH CHECK OPTION:即该数据必须满足视图定义中的子查询中的WHERE条件,否则不允许插入或更新
  • create [or replace] view tab_view(id,name,age,hao)
    as
    select  t.tid,t.tname,t.age,t.hao
    from  teacher  t
    where age>40
    WITH CHECK OPTION; 
    
    --当更新时:
    insert into  tab_view
    values(5,‘lao‘,10,10);
    --10<40 报错
  • 删除视图的SQL
  • drop   view    tab_view;

事务处理

为什么引入事务

在单用户的数据库系统中,无需对数据的一致性和完整性做过多的考虑。而在多用户并发系统中,多个用户对同一数据的并发访问要求以某种机制来实现数据的一致性和完整性

什么是事务

事务(Transaction)用于保证数据的一致性,它由一组相关的dml语句(增删改语句)组成,该组的dml语句要么全部成功,要么全部失败。 如:网上转帐就是用事务来处理,用以保证数据的一致性。

3种事务的处理命令

commit命令:commit是事务的提交命令,数据库为了保证事务的唯一性,一致性,在内存中将为每一个客户建立工作区,客户机对数据库进行操作处理的事务都在工作区内完成,只有在输入commit命令后,工作区内修改内容才写到数据库上,称为物理写入,这样可以保证在任意的客户机没有物理提交个修改以前,别的客户机读取的后台数据库中的数据是完整的,一致的。

set  auto  on;   --在运行中输入sqlplus 后进入dos下,打开自动提交功能
set  auto  off;   --取消自动提交功能

rollback命令:rollback是事务的回滚命令,在尚未提交commit命令之前,如果发现delete、insert、update等操作需要恢复的话,可以使用rollback命令回滚到上次commit时的状态

savepoint命令:savepoint 是保存点命令,事务通常由数条命令组成,可以将每个事务划分成若干个部分进行保存,这样每次可以回滚每个保存点,而不必回滚整个事务

创建保存点:savepoint 保存点名; 回滚保存点: rollback to 保存点名;

Oracle 数据备份与还原

exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件

imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库中

将数据库中的表导出,生成dmp文件

exp   hh/hh@orcl   file=E:/lvling.dmp  tables=(lvling)

exp   xiaomi7/xiaomi7@192.168.2.57:1521/orcl   file=E:/meetingroom.dmp  tables=(meetingroom) --远程库

exp   hh/hh@orcl   file=E:/lvling.dmp  tables=(lvling,lvling1)

将生成dmp文件,导入数据库中

imp hh/hh@orcl file=E:/lvling.dmp tables=(lvling)
--注意:导入导出时,用同一用户,同一表空间

将数据库中yy用户表导出,生成dmp文件

exp yy/yy@orcl file=E:/lvling.dmp  owner=(yy)

将生成dmp文件,导入数据库中

imp yy/yy@orcl file=E:/lvling.dmp fromuser=yy

将数据库中yy,tt  用户表导出,生成dmp文件

exp system/orcl@XE file=E:/two.dmp  owner=(yy,tt)             --  sys得给权限,sysdba权限,否则导不出来

将生成dmp文件,导入数据库中

imp system/orcl@XE file=E:/two.dmp  fromuser=tt touser=tt
imp system/orcl@XE file=E:/two.dmp  fromuser=yy touser=yy

将orcl整个数据库导出,生成dmp文件

exp yy/yy@orcl  file=E:/lvling.dmp  full=y

将生成dmp文件,导入orcl整个数据库中

imp  yy/yy@orcl  file=E:/lvling.dmp   full=y  ignore=y         --ignore=y忽略创建错误 因为有的表已经存在,然后它就报错,对该表就不进行导入

PL/SQL程序(过程化SQL语言)

需求:创建一个简单的PL/SQL程序向数据库中插入数据

create  table    lv(sname   varchar2(10),   spassword varchar2(20))

--创建过程:
create [or replace] procedure  lv_one as
begin  --执行部分
for i in 1..10 loop
    insert into lv  values(‘a‘,‘bb‘);
    end loop;
end;

--调用过程:
exec  lv_one;

需求:创建一个简单的PL/SQL程序删除数据库中数据

--创建过程:
create [or replace] procedure  lv_two as
begin--执行部分
delete from lv where sname=‘lv1‘;
end;

--调用过程:
exec  lv_two;

命名规范

当定义变量时,建议用v_作为前缀 v_sal

当定义常量时,建议用c_作为前缀 c_month

当定义游标时,建议用_cursor作为后缀 emp_cursor

当定义异常时,建议用e_作为前缀 e_error

什么是PL/SQL块

块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是在编写块,要完成简单的功能,可能需要一个块,复杂的功能,要一个块中嵌套另一个块

PL/SQL块由三个部分组成:定义部分、执行部分、异常处理部分

declare
/*定义部分——定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分——要执行pl/sql语句和sql语句*/
exception
/*异常处理部分——处理运行的各种错误*/
end;

实例1:只包括执行部分的pl/sql块

/*只要涉及输入就需要打开输出选项*/set  serveroutput  on --打开输出选项
--set  serveroutput  off  关闭输出选项

begin
dbms_output.put_line(‘hello‘);
end;
/--在命令窗口上执行最后得加/

/*相关说明: dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是dbms_output包的一个过程。*/

实例2:PL/SQL包含定义部分,执行部分和异常处理部分

declare
    v_ename varchar2(5); --定义字符串变量
    v_sal number(7,2);
begin
    select ename,sal into v_ename,v_sal from scott.emp where empno=&aa;  --& 表示要接收从控制台输入的变量,赋值给aa;
    dbms_output.put_line(‘雇员名:‘ ||v_ename||v_sal);
exception
    when no_data_found
     /*no_data_found:找不到数据的异常,是Oracle定义好的异常*/
    then dbms_output.put_line(‘编号不对‘);
end;

实例3:需求:输入员工号,显示雇员姓名、工资、个人所得税(税率为0.03)

declare
   c_shuilv number(3,2):=0.03;--税率常量用c
   v_sname varchar2(3);  --姓名变量用v
   v_sal number(10);      --工资
   v_shui number(10);     --个人所得税
begin
    --执行
    select   sname,sal  into  v_sname,v_sal  from lv where id=&id;
    v_shui:=c_shuilv*v_sal; --个人所得税
    dbms_output.put_line(‘姓名是‘||v_sname||‘工资‘||v_sal||‘税‘||v_shui);
end;

-- ‘:=‘就是赋值的意思,相当于java中的‘=‘

%type

实例3会产生漏洞,当要查的人员姓名大于v_sname varchar2(3)时会报错

可以使用%type属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度

标识符名 表名.列名%type;

v_sname varchar2(3); 可以换成v_sname lv.sname%type;

%rowtyp

使用%rowtype,可以使变量获得整个记录的数据类型

declare
    lvtable  lv  %rowtype;
begin
    --执行
    select *  into  lvtable  from lv  where id=1;
    dbms_output.put_line(lvtable.sname);
    dbms_output.put_line(lvtable.sal);
end;

if..then..else..end if:相当于if else语句,then后的是如果条件成立执行的语句,语句结束使用end if,同样支持嵌套

loop..exit..end loop:相当于while,配合if..then exit;退出循环,语句结束使用end loop;

for..in..loop..end loop:相当于for语句,for 循环变量 in 循环上界..循环下界 loop 循环处理语句段; end loop;

goto labelOffLOOP(标签名):跳到标签处,标签定义语句:<<labelOffLOOP>>

Oracle PL/SQL过程

需求:创建一个PL/SQL过程修改员工的工资

create [or replace] procedure lv_three (lvName in varchar2,newSal number) as --默认不写时是in
begin
    update lv set sal=newSal where sname=lvName;
end;

--调用过程:
exec  lv_three(‘jerry‘,4000);
--或
call  lv_three(‘jerry‘,4000);

--注:当遇到error时,用show error;查看错误
--类似于函数调用,过程可以被另一个过程调用

需求:创建一个PL/SQL过程查询员工的姓名

create [or replace] procedure lv_four (sid in number,stname out varchar2)
as  --或is
begin
    select  sname  into stname  from  lv  where id=sid;
end;

--调用过程:
declare
    ming varchar(10);
    sid number(10);
begin
    sid:=1;
    lv_four (sid,ming);
    dbms_output.put_line(ming);
end;

需求:创建一个PL/SQL过程查询员工的年工资

create or replace procedure  getsal(saly in out number) as
begin
    select  sal *12 into saly from lv where sal=saly;
exception
    when  no_data_found
    then dbms_output.put_line(‘没有找相关数据‘);
end;

--调用过程:
declare
    ssal number(10);
begin
    ssal:=1;
    getsal(ssal);
    dbms_output.put_line(ssal);
end;

删除过程

drop  procedure  过程名;
时间: 2024-08-08 05:39:01

oracle补充的相关文章

AIX系统逻辑卷管理

前言: 前期项目需要部署多套AIX环境下RAC集群,之前很少接触AIX系统,上来被创建逻辑卷等基本命令打脸了,其实网上搜下资料很多,决定总结一下,总结起来也是方便自己日后查阅. 创建逻辑卷 1.查看所有磁盘设备 # lsdev -Cc disk hdisk0  Available 50-T1-01 Huawei XSG1 FC Disk Drive hdisk1  Available 50-T1-01 Huawei XSG1 FC Disk Drive hdisk2  Available 50-

【我的Oracle学习笔记(二)】----- select语句补充

一.多表查询 多表查询是指从多个有关联的表中查询数据,其语法与单表查询类似.一般来说,多表查询的表要用连接联系起来,如果没连接,则查询结果是这多个查询表的笛卡尔积(注释1). 模拟查询雇员姓名和所在部门名称: select [雇员姓名],[部门名称] from [雇员表] a,scott,[部门表] b where a.[部门编号]=b.[部门编号]; 上例中,为每一个查询表指定了别名,便于SQL语句的书写. 模拟查询在”sales“部门工作的雇员其雇员姓名 select [雇员姓名] from

Oracle中的补充日志(supplemental log)

原网址:http://sugarlovecxq.blog.51cto.com/6707742/1693092 在配置DG的时候,有涉及到补充日志的知识,故做以整理. 补充日志不是独立的一种日志,是对重做记录中变更矢量的补充信息,增加了变更矢量记载的记录量,Oracle数据库某些功能要求启用补充日志才能正常地或更好的工作,如logminer.DG.闪回事务查询.闪回事务. Oracle中insert.delete命令在默认情况下产生的重做记录足以表明被修改的行的每个字段在被修改前后的值是什么,in

Oracle自我补充之Decode()函数使用介绍

decode()函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能. DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能.DECODE有什么用途 呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%:工资在8000元以上的加15%,通常的做法是,先选出记录 中的工资字

oracle导入导出文件补充

这两天做了oracle的导入导出表数据. 1.oracle 提供了三种方式的导入导出文件,(1)Oracle export/Import   (2)slq export/import (3)PL/SQL导出导入 第二种方式适合于单个或者几个表的导入导出,导入导出的数据量较小. 如果是大数据量或者表比较多了,最好使用第一种方式.第三种方式必须有PL/SQL. 2. 注意事项 (1)导出表时,第二种方式不能导出带blob或者clob字段的表,必须使用第一种方式. (2)导入表时,第一,二种方式都不能

Oracle自我补充之trunc()函数使用介绍

oracle trunc函数使用介绍 核心提示:oracle trunc函数使用介绍 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去.忽略它则由最近的日期截去 下面是该函数的使用情况: TRUNC(TO_DATE('24-Nov-1999 08:00 pm'),'dd-mon-yyyy hh:mi am') ='24-Nov-

Oracle存储过程详解(引用)+补充(转)

一.过程 (存储过程) 过程是一个能执行某个特定操作的子程序.使用CREATE OR REPLACE创建或者替换保存在数据库中的一个子程序.示例1:声明存储过程,该过程返回dept表行数 DECLARE PROCEDURE getDeptCount AS deptCount INT; BEGIN SELECT COUNT(*) INTO deptCount FROM DEPT; DBMS_OUTPUT.PUT_LINE('DEPT表的共有记录数:'||deptCount); END getDep

漫谈Oracle体系结构(慢慢补充......)

在正式开始学习Oracle体系结构之前,我们先通过图片对Oracle体系结构有个初步把握. 一. Oracle服务体系(Oracle Service)由实例(Instance)和数据库(Database)两部分内容组成. 其中数据库是我们计算机上实实在在存在的一系列磁盘文件,而实例则是由一组管理数据库的内存结构和进程结构两部分内容组成:

oracle 11g SQL语句补充学习

添加列: alter table tablename add columnName datatype (not null);        -------需要注意一点的是在添加一列为非空的时候, 表必须是空表. 删除列: alter table tablename drop column columnName 改变列的数据类型: alter table tablename modify columnName datatype 改变列名: alter table tablename rename