随笔 - 26,  文章 - 0,  评论 - 0,  阅读 - 23708

注意区分:

-----在操作数据库时如果是在qlplus命令中来切换登录用户用:conn   用户名/密码

-----在输入用户名和密码之后,需要切换用户名用:  su    -用户名

1.Windowsserver服务器安装数据库忘记对某个用户解锁,比如Scott,我们可以通过system用户来对该用户解锁:

步骤如下:

注:sys/system/oracle数据库用户都是管理员用户

(1)在运行中输入sqlplus,进入Oracle

(2)再使用system用户登录

alter  user  scott account  unlock

 2.oracle常用的sqlplus命令

通过putty或其他工具登录Linux服务器输入root用户名和密码进入系统

--(1)然后输入sqlplus /nolog命令 ,

---(2)若输入的是普通用户用户和密码(如scott这个用户/密码或其他用户/密码)登录Oracle,然后切换另一个用户身份(如切换到system)用户名进行登录,

使用:conn  用户名/密码 (该命令经常用于切换当前用户,因为我们建议大家登录的时候使用普通用户scott,如果确实需要system用户,则可以使用该命令切换为高级别用户)

--(3)show user (查询当前登录的是哪个用户)

   

--(4)若用户需要修改密码,可使用如下命令:

passwd (该命令用于修改用户的密码)

基本用法:

password 用户名:

(如果给自己修改密码,则可以不带用户名;如果给别人修改密码,则需要带用户名(修改密码的前提是(system或者sys)管理员用户给其他用户来修改密码))

--(5)disc   (该命令用户断开和Oracle的连接,但是不退出sqlplus 窗口)

--(6)exit  (该命令是用户断开和Oracle的连接同时退出sqlplus窗口)

---(7)linesize (用于控制每行显示多少个字符,默认80个字符,不设置的话是自动换行,显示很乱)

基本用法:

set   linesize  140   (可以自己加显示行的大小)

---(8)pagesize (用于控制每页显示多少行,不设置的话默认是显示14行就分页了)

基本用法:

set pagesize 100   (可以自己设置每页显示的行数)

---(9) 的用法

例:select * from xxcj_emp where job='&job';

 

 

 3.Oracle用户管理 

通过putty或其他工具登录Linux服务器输入管理员用户名和密码进入系统 

然后输入sqlplus /nolog命令 , 

---(1)创建用户、给用户赋予权限、回收权限、删除用户

connect   ---表示可连接

resource  ----表示可分配资源,什么都可以操作

基本用法: 

create user 用户名  identified by  密码        ----创建用户(在oracle中创建一个新的用户使用create  user语句,一般是具有dba数据库管理员的权限才能创建)

grant   connect  to  用户名    -----给创建的用户赋予连接的权限(connect是连接的权限,让创建的用户能够登录,不赋这个连接的权限无法进行登录)

grant   resource  to  用户名       ---给创建的用户赋予创建表和可操作的权限(增删改查的权限)

revoke   connect  from  用户名       -----把创建连接的用户名进行回收删除(需用管理员的权限在操作)

revoke  resource  from   用户名   ----把赋予给创建用户的操作权限进行回收删除

drop  user  用户名  [cascade]    -----删除创建的用户(如果删除一个用户的时候,这个用户自己已经创建过数据对象(指表或索引或触发器等等),那么我们在删除该用户的时候,需要加选项cascade表示把这个用户删除同时,把该用户创建的数据对象一并删除)

grant  select[insert/update/delete/all]   on  表名   to   用户名     ---用管理员的账号登录,赋予创建的用户查询表信息的权限  

with  admin  option     ---系统权限(如果是系统权限,则带with  admin  uption)

with   grant  option     ----对象权限 (表示得到对象的权限用户,可以把权限继续分配) 

----(2)了解:方案(schema)

理解:当一个用户创建好后,如果该用户创建了任意一个数据对象,这时,我们的dbms就会创建一个对应的方案与该用户对应,并且该方案的名字和用户名一致。

如果希望看到某个用户的方案究竟有什么数据对象,可以使用plsql  developer登录进去查看

----(3)用户练习题:

1.创建用户tea,stu,并给这两个用户resource,connect角色

conn system/oraclehsp    ---通过管理员身份登录

create user tea identified by  tea    ---创建tea用户,密码

grant  resource   to  tea   ---赋予用户resource(增删改查)角色

grant  connect   to tea     ---赋予用户connect(连接权限)角色

create user tea identified by  stu     ---创建tea用户

grant  resoure   to  stu     ---赋予用户resource角色

grant  connect   to stu       ---赋予用户connect角色

2.使用scott用户把对emp表的select权限给tea

conn scott/scott     ----连接scott用户

grant  select on  emp  to  tea  

使用tea查询scott的emp表

conn  tea/tea    -----连接tea用户

select * from scott.emp

使用scott用户把对emp表的所有权限赋给tea

conn  scott/scott   

grant   all  on  emp  to  tea

使用tea更新/删除/插入scott的emp表

conn   tea/tea

update  scott.emp  set  job='teacher'   where job='&job'

delete  form  scott.emp    where   job='&job'

insert into scott.emp   values(6,'fors','teacher',222)

使用scott回收权限

 conn  scott/scott

revoke  select  on  scott.emp   from  tea

revoke  all   on  scott.emp   from  tea

3.想办法将让tea把自己拥有的对scott.emp的权限转给stu

conn  scott/scott

grant all  on  scott.emp  to  tea  with  grant  option

conn  tea/tea

grant all  on scott.emp  to stu

使用stu查询scott用户的emp表

conn  stu/stu

select * from scott.emp

使用tea收回给stu的权限

conn tea/tea

revoke  all  on scott.emp  from stu

4.使用profile文件对口令进行管理

----(1)账户锁定

管理员用户登录,切换至sqlplus命令。

基本语法:

create  profile  文件名  limit  failed_logon_attempts  password_lock_time  2       -----设置用户名输错3次账号锁定2天,2天后才能使用

alert  user   用户名    profile  文件名         ----分配文件(把输错次数就锁用户的方法分配给某个用户(完成输入错误3次锁2天))

----(2)账号解锁

alter   user  用户名   account  unlock     ----被锁的用户进行解锁

-----(3)终止口令

需求:为让用户定期修改密码可以使用终止口令,需管理员身份来操作,一个账号密码最多使用10天,宽限期为2天,到时必须设置新的密码

基本用法:

create  profile   文件名   limit   password_life_time  10  password_grace_time  2      ------设置一个账号密码最多使用10天,宽限期为2天,到时必须设置新的密码

alter  user  用户名  profile    文件名       -------分配文件(把设置账号的期限文件分配给该用户)

-----(4)删除profile口令文件

基本用法:

drop   profile   文件名      ---当不需要某个profile文件时,可以删除该文件

5.Oracle数据库的启动流程

(1)windows操作系统启动步骤

在cmd命令中操作:

lsnrctl   start   ----用于启动监听服务

oradmin   -startup   -sid   数据库实例名     ------启动Oracle实例服务

  ---扩展知识(可显示当前window操作系统的版本,服务器安装时间等详细的系统信息):

systeminfo     ------查询操作系统的详细信息

(2)Linux操作系统启动步骤

lsnctl   start       ----启动监听

sqlplus    sys/change_on_install   as    sysdba      -----以sysdba身份登录,在Oracle10g后这样写(等同于下面的命令)

sqlplus  /nolog        ------切换到sqlplus命令

conn   sys/change_on_install  as  sysdba         -----以sysdba身份登录

startup

6.数据库管理员密码丢失如何找回(前提:Windows服务器系统安装Oracle数据库服务端

---(1)在安装Oracle数据库路径中找到密码文件PWD数据库实例名.ora文件(数据库实例名是自己安装数据库时取的名字)

----(2)把密码文件(PWD数据库实例名.ora)备份

----(3)生成新的密码文件,在dos控制台下输入命令:

orapwd  file=原来密码文件的全路径\密码文件名.ora   password=新密码    entries=10;      (密码文件名一定要和之前的密码文件名一样,entries是允许几个特权用户同时登录)

---(4)修改后重新启动数据库实例,重新登录即可。

  7.数据库表的基本操作语句

 alter table  表名  add  (新的列名   列的数据类型)      ----表中添加一个新的字段,列名和数据类型

alter  table 表名  modify(列名   新字段类型)    ----表中修改一个字段的类型

alter  table   表名  drop column(字段名)            ---删除一个字段,可同时删除几个字段名

rename  旧表的名字   to   新的名字           ---给表修改名字

----用户锁定操作方法:

(1)锁定用户命令:

alter  user  用户名  account   lock;

(2)用户已经不能正常登录到数据库,但系统用户(system)登录依然可以使用它的数据对象

(3)解锁命令:

alter  user  用户名   account  unlock

例题:

删除一个用户,同时保留该用户的数据对象

-1.锁定该用户

alter user   scott  account  lock;

-2.这时用户已经不能登录到数据库,但是system用户依然可以使用她的数据库对象

-3.解锁用户

alter  user  scott  account  unlock;

  -----时间查询语句(可单独查询年或月或日)

例:查1982-1-1后出生的信息

select * from  emp  where to_char(birther,'yyyy-mm-dd')>'1982-1-1'

查四月份出生的信息

select * from  emp  where to_char(birther,'mm')='4'

查23日出生的信息

select * from  emp  where to_char(birther,'dd')='23'

-----看如何取消重复行

例:select distinct  deptno,job  from emp;    -----distinct是去重(返回的数据完全一样才是重复行)

 

 -----函数NVL的使用

NVL(COMM,0)    ------如果comm列中的字段为空,就取0,如果comm列中的字段不为空就取comm列中的字段值(用于处理数据null的问题 )

上面截图中的comm列中,有空字段(空加任何数为空,空乘任何数为空)

 

 ------表中列字段的拼接(拼接符 || )

在查询的时候如果希望把多列拼接成一列返回,可以使用 || ,具体使用如下:

 -----group  by和having的用法

group by      ------用于对查询的结果进行分组;

having      -----子句用于过滤分组显示的结果

例:-1)如何显示每个部门的平均工资和最高工资

select avg(sal),max(sal),deptno from emp group by depto

-2)如何显示每个部门的每种岗位的平均工资和最低工资

select avg(sal),min(sal),deptno,job from emp group by deptno,job orde  by  deptno    ---不同部门的不同岗位的平均工资和最低工资

-3)显示部门平均工资低于2000的部门号和它的平均工资

select avg(sal),deptno  from emp group by deptno having avg(sal)<2000

 

 -----子查询语句all和any的用法(行的子查询)

------all的使用

例:如何显示工资比部门30号的所有员工的工资高的员工的姓名、工资和部门号

select * from emp where sal>all(select sal from emp where deptno=30)

select  * from emp  where sal>(select max(sal) from emp where deptno=30)

----any的使用

例:如何显示工资比部门30号的任意一个员工的工资高的员工的姓名、工资和部门号

select * from emp where sal>any(select sal from emp where deptno=30)

select  * from emp  where sal>(select min(sal) from emp where deptno=30)

------子查询语句(多列子查询)

 例:如何查询与smith的部门和岗位完全相同的所有雇员

思路:先查出Smith所在的部门和岗位

select  deptno,job from emp where ename='smith'

然后查询相同部门和岗位的人

select * from emp where (deptno,job)=(select  deptno,job from emp where ename='smith')

-----用查询结果创建新表

 这个命令是一种快捷的建表方法

create  table  mytable (id,name,sal,job,deptno)   as  select empno,ename,sal,job,depton  from  emp

------自我复制数据(蠕虫复制)

有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此方法为表创建海量数据

select into mytable(id,name,sal,job,deptno) select empno,ename,sal,job,deptno from emp

 8.数据库中的函数及事务、序列

 (1)事务

事务(transaction)基本概念:事务是把对数据库一系列操作看作一个整体,要么全部成功要么全部失败,利用事务我们可以保证数据的完整性,事务具有原子性。

 

 (2)序列

在表中希望田间一条记录的时候,通过序列(sequence)来完成自动增长,该列值能够自动的增长(比如从1开始增长,每次增长1)

例:在sql server和MySQL中都是可以在定义表的时候直接指定自动增长。

sqlserver中:

create table temp1(

id int primary key identity(1,1),

name varchar(36)

)

mysql中

create table temp1(

id int primary key auot incrment,

name varchar(36)

)

解决方式:Oracle是利用创建序列(sequence)来完成,如下:

Oracle创建一个系列:

create sequence myseq        ------myseq序列名

start with  1                   ------序列从1开始

increment by 1             -----序列每次增长1

minvalue   1          ---------最小值是1

maxvalue    3000       -----最大增长至3000

cycle                      -----cycle表示序列增加到3000,从新从1开始。nocycle表示不重新开始

nocache                 ---------nocache表示不缓存,[cache10:表示一次产生10个数供使用,使用缓存产生号,优点是提高效率,缺点是可能产生跳号]

例:下图中的myseq是关键字,nextval是获取下一个数的关键字

 序列的细节:

a.可以为表中的列自动产生值

b.由用户船舰数据库对象,并与由多个用户共享

如果system使用Scott创建的序列,从什么时候开始增长?-----接着增长

c.一般用于主键或唯一列(unique)

d.可以使用 序列名.currval 来看当前序列号到多少号了

select  序列名.currval   from  dual;

 e.如果希望去查看序列.currval 必须先使用序列.nextval 值,否则出错

 9.索引

 索引的分类

(1)单列索引

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

(2)复合索引

create index  索引名  on  表名(列名1,列名2)

例:

create table  users(name varchar2(30),age  number ,email  varchar2(36));

create index  inx_name  on users(name);

 细节:

a.在大表上建的索引才有意义

b.在where子句或是连接条件上经常引用的列上建索引

select * from 表名  where  列名=‘条件值’

c.索引的层次不要超过4层

d.在逻辑型类型字段上,或者值就是固定几种的列上也不要建立索引

     索引缺点:

     a.建立索引会增加表的大小1.2

     b.索引会影响数据插入,删除,修改的效率

10.管理权限和角色

1)系统权限

系统权限是指执行特定类型sql命令的权利

常用的有:

create session  连接数据库

create table 建表

create  view  建视图

create public synonym  建同义词

create procedure  建过程,函数,包

create  trigger   建触发器

create  cluster  建簇

如何使用select来查询有哪些权限

select * from system_privilege_map  order  by  name ;

例:

---1.创建两个用户ken,tom初始阶段他们没有任何权限,如果登录就会出现错误信息

---1.1创建两个用户,并指定密码

create user ken  indentified by m123;

create user tom  indentified by m123;

---2 给用户ken授权

---2.1授权create  session 权限是带with admin  option

基本用法:

grant  权限名称  to  用户名

例:grant  create  session  to  ken  with  admin  option    ------带with admin option就表示ken可以把他得到权限继续向别的用户转发

---2.2授权create view 时不带with admin option 

grant create view to ken;

2)回收系统权限

使用system回收ken(create session权限)

基本语法:

revoke  权限名称  from  用户名 

例:

revoke  create  session  from  ken;

 1)对象权限

概念:指访问其他方案对象的权限,用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限,比如Smith用户要访问scott.empb表(Scott:方案,emp:表),则必须在Scott.emp表上具有对象的权限。常用的有:

alter 修改  delete 删除  select 查询  insert 添加 update 修改  index 索引  reference 引用 execute  执行

查看Oracle提供的所有的对象权限(需要dba用户可以查看)

select distinct  privilege from dba_tab_privs

基本语法:

grant  对象权限  on  方案.数据对象  to  用户 [with grant  option ]

grant   对象权限  on  方案.数据对象  to  角色 [witn grant  option]

特别说明:可以把权限直接赋给角色

例:

----1)希望mokey可以查询scott.emp表,则必须授予相应的对象权限

grant  select on scott.emp  to mokey

----2)希望mokey可以删除scott.emp表,则必须授予相应的对象权限

grant delete  on  scott.emp  to  mokey

---3)把增删改查的权限都赋给mokey

grant all  on scott.emp  to mokey

----4)在别的方案的表上建立索引,则具有index对象权限,让black可以在scott.emp上建立索引,给其加index的对象权限

conn  scott/tiger

grant  index  on scott.emp to black

---5)使用with grant  option 

该选项用于转授对象权限,但是选项只能被授予用户,而不能授予角色

conn  scott/tiger

grant   select  on emp to blake  with  grant  option

conn  black/shumping

grant  select  on scott.emp  to  jones

2)回收对象权限

可以使用dba用户(sys,system)来完成

回收对象权限后,用户就不能执行相应的sql命令。但是要注意的是对象的权限是会被级联收回

 基本语法

revoke  对象权限   on   方案.数据对象    from   用户

对象的权限是会被级联回

 1)角色管理

 查询用户具有怎样的角色

语法:

 Select * from dba_role_privs where grantee=‘用户名’       -----用户名一定要大写

 角色是一组权限的集合,目的是为了简化对权限的管理,从而达到简化对用户的管理

角色的分类:

 (1)预定义角色

Oracle提供了33种预定义角色,常用的预定义角色connect,resource,dba

如何知道某个角色具有怎样的权限

语法:

Select * from dba_sys_privs where grantee=’DBA’     -----DBA一定要大写(DBA包含了所有的权限,所有不进行截图)

Select * from dba_sys_privs where grantee=’CONNECT’       ------connect一定要大写

 Select * from dba_sys_privs where grantee=’RESOURCE’     ----resource一定要大写

 角色赋给用户的语法

grant   角色名  to  用户名 [with admin option]

---1)connect角色

connect角色具有一般应用开发人员需要的大部分权限,只要给用户授予connect和resource角色就够了,connect具有的系统权限如下:

create  session

可以通过select  *  from dba_sys_privs  where grantee='CONNECT'  语句查询

---2)resource角色

 resource角色具有引用开发人员所需要的其他权限,比如建立存储过程,触发器等,这里需要注意的是resource角色隐含了unlimited  tablespace系统权限。

resource角色包含以下系统权限:

Create cluster

Create indextype

Create table

Create sequence

Create type

Create procedure

Create tigger

可以通过Select * from dba_sys_privs where grantee=’RESOURCE’语句查询权限

---3)dba角色

dba角色具有所有的系统权限,及with admin option选项,默认的dba用户为sys和system他们可以将任何系统权限授权其他用户。

但是dba角色不具备(启动和关闭数据库)

例:

创建一个用户Jack,并把Jack设为具有dba角色的用户 

Create user jack indetified by m123; 

Grant dba to jack 

(2)自定义角色

Oracle设计这认为33种预定义角色可能不能满足所有的需求,所以可以使用自定义角色来解决。

自定义角色根据自己的需求来定义,一般是dba来建立,如果用别的用户来建立,则需要具有create role的系统权限,在建立角色时可以只当验证方式(不验证,数据库验证等)

----1)建立角色(不带验证---常用)

 语法:

create role  角色 名 not  identified;

---2)建立角色(数据库验证)

语法:

create  role  角色名 identified   by   密码;

例:

假如有用户1,2,3为了让他们都拥有权限

a.连接数据库

b.在scott.emp表上select ,insert ,update

---使用自定义角色来完成

create role  myrole  not identified;

---给角色赋权限

grant  create  session  to  myrole;

grant  select  on  scott.emp  to  myrole;

grant  insert on  scott.emp  to  myrole;

grant  update on  scott.emp  to  myrole;

---这是可以把myrole这个自定义角色赋给指定的某个用户hsp

create user hsp identified  by m123;

grant  myrole to hsp ;

(3)删除角色

drop  role  角色名  

预定义角色能删除,但是要慎重,不要删除预定义角色

角色可以包含系统权限,也可以包含对象权限。

11.PLSQL编程

基本概念:plsql实行标准sql语句基础上扩展的一种对Oracle数据库进行编程的语句。可以定义常量和变量,而且可以使用条件语句和循环语句。

因为使用纯sql语句来操作数据库,所有有技术缺陷;

技术缺陷:

a.不能模块化过程,为了完成下订单,可能我们要发出几条sql

b.执行速度

c.安全性问题

d.浪费带宽

解决方法:

使用PL/SQL来编写存储过程,以提高效率  

1)创建存储过程语法

create  procedure  过程名(参数1......,参数2)

is

begin 

//执行语句

end

2)调用存储过程语法

exec 过程名(参数1......,参数2)

例1:

开发一个简单的存储过程,可以完成向某表添加一条记录

create  procedure  pro1

is

begin

insert into emp(emp,ename) values(444,'张三') 

end                                                                                                      

调用执行存储过程

exec  pro1

例2:

接受输入参数的简单存储过程

create  procedure pro2(in_empno  number)

is

begin

delete from emp where empno=in_empno;

end

调用执行存储过程

exec  pro2(444)

PLSQL编写规范:

 

 11.块(block)的介绍 

概念:块是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块。要完成相对简单的应用功能,可能只需要编写一个pl/sql块,但是如果要实现复杂的功能,可能需要一个pl/sql块中嵌套其他的pl/sql块。

块的结构示意图:

pl/sql块中有三个部分构成:定义部分、执行部分、例外处理部分。如下:

declare

//定义部分        -------定义常量、变量、游标、例外、复杂的数据类型(该部分可选的)

begin

//执行部分       -----要执行的pl/sql语句和sql语(执行部分从这里开始,该部分是必须的)

exception

//例外处理部分     -----处理运行时的各种错误(例外处理部分从这里开始,该部分可选)

end;

 

例1:

只包含执行部分的案例

begin

dbms_output.put_line('hello world')

end

特别说明:在默认情况下,hello world不会输出,需要set  serveroutpur on;

dbms_output是Oracle所提供的包,该包包含一些存储过程,put_line就是dbms_output包的一个存储过程。

 例2:

包含部分和执行部分

declare 

v_ename varchar2(36)      -----定义变量格式,变量名称   变量类型

begin

select  ename  into  v_ename   from  emp  where  empno=&empno   ----把查询的ename值放入v_ename变量

dbms_output.put_line('雇员名是‘||v_ename)       -----输出v_ename

end      

 

 ------例2改为存储过程的写法

create procedure pro4(in_empno  number)

is

v_ename varchar2(16);    ---定义变量的格式是:变量名称   变量类型

begin 

 select  ename  into  v_ename  from emp  where empno=in_empno     ----把查询的ename值放入v_ename变量

dbms_output.put_line('雇员名是'||v_ename);

end;

执行存储过程

 exec  pro4(4444);

例3:

包含定义部分、执行部分和例外处理部分的块

(1)比如在实例2中,如果输入了不存在的雇员号,应该做例外处理,如下图所示 

 从上面的案例可以看出,如果输入的用户编号不存在,则系统会提示异常,为了更明确的指出错误,Oracle提供了异常execption处理机制。

快速入门:

declare

v_ename  varchar2(36);     ----定义变量格式,变量名称   变量类型

begin

select  ename  into  v_ename  from  emp  where empno=&empno;      ----把查询的ename值放入v_ename变量

dbms_output.put_line('雇员名是'||v_ename);       -------输出v_ename

execption 

when  no_data_found   then

dbms_output.put_line("输入的编号有误");

end

对该案例系统说明,这里设计到异常处理:

异常处理的基本语法:

execption

when  异常名称   then

//对异常进行处理的代码;

when   异常名称2   then

//对异常处理的代码;

oracle 提供的异常有(详情可参考官方文档) 

 异常处理的作用

(1)可以给出捕获异常,并给出明确提示

(2)有时可以利用异常,来进行业务处理

例4:

 查询的信息不存在,就加入编号为1,名字为张三这么个人的信息

declare

v_ename varchar2(16);    -----定义变量格式,变量名称    变量类型

begin  

select ename  into  v_ename  from  emp  where empno=&empno     ----把查询你的ename值放入v_ename变量

dbms_output.put_line('雇员名为’||v_ename);

exception

when  no_data_found   then

dbms_output.put_line('输入的编号有误,我帮你加一条');

insert into emp (empno,ename)  values(1,'张三')

end;  

 12.存储过程      进一步讲解

 oracle过程可以指定参数是输入的参数(in),还是输出的参数(out)

 基本语法:

create  procedure   过程名(变量名  in 变量类型......,变量名  out  变量类型.....)

//定义变量

is

begin

//执行语句

end;

 例1:

请考虑编写一个存储过程,可以输入雇员名,新工资,可修改雇员的工资

特别说明:当我们编写过程时,可以输入show error来显示具体的错误信息。

create or replace  procedure pro5(in_ename in varchar2,in_new_sal in number)

is

begin

update emp set sal=in_new_sal  where ename=in_ename;

end;

调用存储过程

exec pro5('张三',10)

 使用java代码调用此存储过程:

 对SQLHelper类升级,添加一个可以调用存储过程的方法

//调用存储过程的方法(封装的类)

 

                    

 13 函数

函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。我们可以使用create  function来建立函数,实际案例:

存储过程和函数的区别:

-----1)函数必须有返回值,而存储过程可以没有

----2)函数和存储过程在Java中调用的方式不一样,

           函数是select  自己的函数名(列)from 表

           过程使用   callableStatement  去完成调用

函数语法:

create or replace  function  函数名(参数1......,参数2)

return  返回的数据类型

is

//定义变量;

begin

//执行语句;

end;

调用函数

select  函数名(实际参数) from  dual;         ------在控制台调用

例:

 编写一个函数,可以接收用户的名字并返回用户的年薪

create  or replace function  funl(in_ename  varchar2)

return  number 

is

v_annual_sal number;  ---定义一个变量,来接收年薪

begin

select  (sal+nvl(comm,0))*13  into v_annual_sal  from  emp  where ename=in_ename;

return v_annual_sal;

end;

调用函数:

select funl(‘张三’)  from  dual;        ---dual是虚表,因为函数中已经写了emp实表。

在Java中调用

 

14  包(packages)

 使用包更好的管理自己写的函数、存储过程

(1)包的基本语法

create  [ or replace] package   包名  

is

procedure  过程名(参数1......);         ------声明过程

function    函数名(参数1....) return  返回类型  ;       ----声明函数

end;

 例:

 编写一个包,该包有一个存储过程,该存储过程可以接收用户名和新的薪资(将来用于通过用户名去更新薪资),还有一个函数,该函数可以接收一个用户名(将来要实现得到该用户的年薪是多少)

create or replace  mypackage1 

is

procedure  pro1(v_in_ename varchar2,v_in_newsal  number);

function fun1(v_in_ename varchar2)  return number;

end;

如果语句报错可以查看详细的报错信息,用show  error命令可以查看详细报错信息。

(2)包体

包体是用于把包中声明的函数或者存储过程,实现的数据对象

基本语法

create  or repalce  backage  body  包名  

is

create procedure   过程名(参数列表......)is                  -----------实现过程

//定义变量

begin

//执行语句

end;

create  function  函数名(参数列表.....)  return   数据类型      ------实现函数

is

//定义变量

begin

//执行语句

end;

end;

 例:

编写包体的案例 

crate or repalce  pachage body  mypackage1

  is

----实现存储过程

procedure  pro1(v_in_ename  varchar2,v_in_newsal number)   

is

begin

update emp set sal=v_in_newsal where ename=v_in_ename;

end;

-------实现函数

function  fun1(v_in_ename varchar2)  return  number  is

v_annual_sal  number;

begin

select  (sal+nvl(comm,0))*13  into  v_annual_sal  from emp  where ename=v_in_ename ;

return  v_annual_sal;

end;

end;

调用包体:

exec package1.pro1('张三',222)

细节说明

(1)包体中要实现的方法或是存储过程,应当在包中声明。

(2)在调用包中的某个方法的时候需要这样调用:

  • 控制台

exec  方案名.包名.过程名(参数值......);

call   方案名.包名.函数名(参数值.......);

  • 在java中去调用包下的函数或者存储过程应当

string  sql="{call  scott.mypackage1.pro1(?,?)}";

string sql="select scott.mypackage1.fun1('张三') annual  from dual";

15 plsql中的语法

plsql中的数据类型分为:

(1)标量类型

可以理解为就是Oracle数据库里的类型

----(1) 定义一个变长字符串

v_ename  varchar2(10);

-----(2)定义一个小数,范围-9999.99~9999.99

v_sal   number(6,2);

-----(3)定义一个小数并给一个初始值为5.4:=是pl/sql的赋值号

v_sal2 number(6,2):=5.4

------(4)定义一个日期类型的数据

v_hiredate   date;

------(5)定义一个布尔变量,不能为空,初始值为false

v_valid   boolena:=false;

说明:pl/sql在定义一个变量的时候,如果要赋初值,则需要使用  :=

例:v_ename varchar(32):='顺平'

例:

以输入员工号,显示雇员姓名、工资、个人所得税(税率为0.03)为例。说明变量的使用,看看如何编写。

 

 %type类型:

为了让我们在pl/sql编程中,让变量的类型和大小与表的列的大小和类型一致可以使用%type。

 (2)pl/sql 复合变量

 基本语法

type  自己定义的记录名称 id  record(

变量  变量的类型,

变量  变量的类型,

)

例:

编写一个过程,该过程可以接收一个用户编号,并显示该用户的名字,薪水,工作岗位(注意,要用plsql记录实现)

 调用:

 (3)复合类型---plsql表

 基本语法

 type 自己定义的plsq数据类型 is  table  of emp.sal%type  index  by binary_integer;

变量名    自己定义的pl/sql数据类型;        ------定义一个这样的变量

 例: 

 (4)参照变量--(重要)

 ----(1)游标变量(重要)

原来图,通过游标,我们可以取得 返回结果集(结果集往往是select语句的结果)的任何一行数据,从而提供共享的效率

 例1:

 请使用plsql编写一个存储过程,可以输入部门号,并显示该部门所有员工的姓名和他的工资。

 create  or replace  procedure pro(v_in_deptno number ) is

type  hsp_emp_cursor  is  ref  cursor;      -------先定义一个游标变量类型

v_emp_cursor    hsp_emp_cursor;        ------定义一个游标变量

v_ename  emp.ename%type;      ---------定义两个变量

v_sal  emp.sal%type;

begin

open  v_emp_cursor  for  select  ename,sal   from  emp  where deptno=v_in_deptno;      -----执行语句

loop            

fetch   v_emp_cursor   into  v_ename,v_sal;        -----取出游标指向的每行数据,用循环语句

exit  when  v_emp_cursor%notfound;                        ----判断当前游标是否到达最后 

dbms_output.put_line('用户名'||v_ename||’薪水‘||v_sal);    --------输出

end  loop;     

-----关闭游标【完后一定记住关闭游标】

close   v_emp_cursor;

end;

 例2:

 在例1基础上,增加 个条件,如果某个员工的工资低于200元,就加100元。

 

 

 

 16 pl/sql进阶

控制结构

任何语句都有各种控制语句(条件语句,循环结构,顺序控制结构....),在pl/sql中也存在这样的控制结构。

特别说明:字符串的比较是 =  比如‘abc’='ttt'   返回假

(1)条件分支语句

-----1)if....then  

语法:

if  条件表达式   then

//执行语句

//执行语句

end  if;

 ----2)if.....then.....else

语法:

if  条件表达式  then

//执行语句

//执行语句...

else

//执行语句

end  if;

 -----3) if.....then.....elsif....elsif.....-else;

语法:

if  条件表达式   then

//执行语句

elsif  条件表达式  then

//执行语句

[这里可以有很多elsif.....]

else

//执行语句

end  if;

 例:if ...then

编写一个过程,可以输入一个雇员号,如果该雇员的工资低于2000,就给该雇员工资增加10%

create  or replace  procedure pro1(v_in_ename  varchar2)  is

v_sal  emp.sal%type;       -----定义工资变量

begin

select   sal  into  v_sal  from  emp where ename=v_in_ename;

if v_sal<2000  then

update  emp  set  sal=sal*1.1  where ename=v_in_ename;

end if;

end;

调用存储过程

exec pro1('张三');

例: if.....then.....else

编写一个存储过程,可以输入一个雇员名,如果该雇员的补助 不是0就在原来的基础上加100;如果补助为0,就把补助设为200

create or replace  procedure  pro1(v_in_ename varchar)  is

v_comm  emp.comm%type;         ----定义补助

begin

select comm  into  v_comm  from emp  where ename=v_in_ename;

if  v_vomm<>0  then

update  emp  set  comm=comm+100  where  ename=v_in_ename;

else 

update emp  set comm=200  where ename=v_in_ename;

end  if;

end;

调用存储过程:

exec  pro1('张三')

例: if.....then.....elsif....elsif.....-else;

编写一个存储过程,可以输入一个雇员编号,如果该雇员的职位是president就给他的工资增加1000,如果该雇员的职位是manager就给他的工资增加500,其他职位的雇员工资增加200

create  or replace  procedure pro1(v_in_empno  number )is

v_job  emp.job%type;      ---定义职位变量

begin

select job into v_job from emp  where empno=v_in_empno;

if  v_job='persident'  then

update  emp  set   sal=sal+1000  where empno=v_in_empno;

elsif  v_ job='manager' then 

update  emp  set   sal=sal+500  where empno=v_in_empno;

else 

update  emp  set   sal=sal+200  where empno=v_in_empno;

end  if;

end;

执行存储过程

exec  pro1('333');

(2)循环控制语句

-----1)loop循环

语法:

loop

//执行语句

exit  when  '条件表达式'

end  loop;

说明:这里的条件表达式如果为true,则继续执行,否则退出

例:

编写一个存储过程,可输入用户名,和添加用户的个数n;

循环添加个用户到users表中,用户编号从1开始增加,直到n

create  table  users5(

id  number  primary key,

name varchar2(32)

)

 create or replace  procedure  pro1(v_in_ename  varchar2, n  number) is

v_empno  number:=1;       ---定义变量,赋初值

begin

loop

insert into users5 values(v_empno,v_in_ename);    ----执行添加任务

exit  when v_empno=n;

v_empno:=v_empno+1;   ---自增

end loop;

end;

执行存储过程

exec  pro1('张三',20); 

 ------2)while循环

 语法:

 while   条件表达式   loop

 //执行语句

end  loop;

例:

 请编写一个过程,可输入用户名,并循环添加10个用户到users 表中,用户从编号200号开始增加。 

 例:两道判断题

 结论:上面的存储过程是错误,原因是在is.....begin间不能对变量赋值,如果要重新赋值,则需要在begin....end间。

结论:上面存储过程中,不能对输入参数的值进行重新赋值。

-----3)for循环

推荐使用loop循环结构,不推荐使用for循环。

(3)顺序控制语句

----1)goto控制语句

goto语句用于跳转到特定标号去执行语句

说明:

PL/SQL支持goto和标号的使用

goto语句不要轻易的使用

例:

 

 ----2)null控制语句

null主要的用处是提高代码的可读取性,其实他是什么都不做。

17  PL/SQL编写分页过程

通过分页过程,目的是让大家把前面学习的各个技术综合运行。

因为分页过程比较复杂,所以采用循序渐进的方式学习。

----1)在Java中调用没有返回值的过程;

 

 

 

 ---2)在Java中如何调用返回,非列表的值

 例:

编写一个存储过程,可以输入雇员编号,返回该雇员的姓名。

 说明:定义变量中的in是定义变量(v_in_empno )的输入变量,out变量是定义变量(v_out_ename )的输出变量

----定义输出变量的类型

create  or replace  procedure  pro1(v_in_empno in  number,v_out_ename   out  varchar2)

 is

begin

select ename into  v_out_ename  from  emp  where empno=v_in_empno;

end;

 在Java中去调用该存储过程,并接受 返回的用户名

 

 

 说明:(1)对于存储过程的输入值,使用setXXX,对于输出值,使用registerOutparameter,问号的顺序要对应,同时考虑类型。

(2)取出存储过程返回值的方法是用CallableStatement提供的getXXX(输出参数的位置);同时要考虑输出的参数的类型。

 -------3)在Java中调用返回列表中(集合/表)

 例:

编写一个存储过程,输入部门,返回该部门所有雇员信息

1创建包:

create or  replace  package  pack1  is         -----创建一个包,在该包中定义一个游标类型

type  my_cursor  is  ref cursor;          -------定义一个游标数据类型

end;

2 编写存储过程:

 create  or  replace  procedure  pro1(v_in_deptno in  number ,v_out_result out pack1.my_cursor)

Is 

begin

open  v_out_result for select * from  emp  where deptno=v_in_deptno;

--------不能在这里关游标,是为了让Java程序可以使用游标

end;

3.编写java程序:

-----4)完成一个分页存储过程

例:

编写一个存储过程,要求可以输入表名,每页显示记录数、当前页,返回返回的结果集。

1.建包   使用  游标类型(如果又这个游标数据类型,则可以直接使用)

create  or replace package  pack1  is            ----定义一个游标类型

type my_cursor  is  ref  cursor;

end;

2.编写存储过程

3Java调用存储过程

分页的select查询语句实例:

select t2.*  from (Select  t1.* ,rownum rn  from (select *from emp) t1  where rownum<=9)  t2 where rn>=4

例:对上面分页的存储过程进行扩展,让分页过程更加灵活,更加实用

编写一个存储过程,要求可以输入表名,每页显示记录数,当前页,返回返回的结果集,返回共有多少页,返回共有多少条记录。

Java调用存储过程

18 视图

视图时Oracle的又一种数据对象,视图的主要用处时简化操作,提高安全,可以满足不同用户的查询需求,视图不是一个真正存在的物理表,他是根据别的表,动态生成的。

(1)创建视图

语法

create  view  视图名字  as select 语句[with  read  only]

说明:如果我们创建视图的时候,我们带了with  read  only则表示该视图只能读,不能进行其他的操作,如果没有带with  read  only则可以进行其他的操作,删除视图中的一条数据原表中的一条数据也会被删除。

如果创建视图的时候不希望用户通过视图对原表进行其他操作,则建议带with  read  only。

例:

创建一个视图和emp表(empno,ename,job)完全一致的视图

create  view  empview as select empno,ename,jog  from emp;

视图可以简化操作:

比如:希望查询雇员的名字和部门编号和部门名称。

存在查询两张表,可以用视图进行查询。

create or replace view myview  as select emp.ename,dept.deptno ,dept.dname from emp,dept where emp.deptno=dept.deptno  with  read  only

(2)创建视图和修改视图

create  or replace  view  视图名 sa  select语句 [with  read only]

(3)删除视图

drop  view  视图名

19 触发器

触发器是一个隐含执行的过程,不是有程序员或者dba来显示调用,而是因为某个操作引发执行的。

触发器的分类:

dml(insert,delete,update)触发器;

ddl(create table,createview,drop…)触发器;

系统触发器(与系统相关的触发器,比如用户登录,退出,启动数据库,关闭数据库)

语法:

 create or replace trigger  触发器名称

{before/after }  {update/delete/insert}   on  表名

[for  each row]

begin

//执行语句

end; 

-----before/after :触发器是在数据操作之前还是之后执行;

----insert/update/delete:指定触发器是在插入、更新、还是删除操作;

-----表名:指触发器指定的表;

-----for  each  row:可选项,表示触发器对每行数据都执行一次,如果不指定该选项,则触发器整个语句执行一次。

例:

在某张表(my_emp)添加一条数据的时候,提示‘添加了一条数据’

1建表

create  table my_emp(

id number,

name varchar2(32)

)

2创建一个触发器

create or replace trigger tri1

after insert on

scott.my_emp

begin

dbms_output.put_line(‘添加了一条数据’);

end;

3执行语句

set  serveroutput  on;         ---------是设置提示信息输出能看见

insert into my_emp values(1,'shumping');       --- ---添加一条数据

执行结果截图:

(1)行级触发器和语句级触发器

for each row 行级触发器的标志。没有的是语句级触发器

例:

在某张表(my_emp)修改多条数据的时候,提示‘多次’修改了数据。

create or replace  tigger tri2

after update on

scott.emp

for each  row   ----表示这是一个行级触发器

begin

dbms_output.put_line(‘修改了一条数据’);

end;

执行结果:

示例中使用的emp表的结构:

(2)dml触发器

例1:

为了禁止工作人员在休息日改变员工信息,开发人员可以建立before语句触发器,从而实现数据的安全。

create  or replace trigger tri2

before delete on

scott.emp

begin

if to_char(sysdate,’day’) in(‘星期日’,‘星期六’) then

dbms.output.put_line(‘对不起,休息日不能删除员工’);  ----该信息只是提示信息,没有其他用途

raise_application_error(-20001,’对不起,休息日不能删除员工’);   ------该语句是阻止程序对信息进行删除。

end  if;

end;

特别说明:raise_application_error这个存储过程是Oracle提供的,可以传入两个参数,第一个是自定义的错误号(-20000~-20999之间),第二个参数是提示一个信息。

例2

使用条件谓词来精确提示用户的操作。

为了禁止工作人员在休息日改变员工信息,开发人员可以建立before语句触发器,从而实现数据的安全,在给出提示时,明确提示用户是进行的insert,update还是delete操作。

(3)触发器的   :old和:new 的使用

当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值。

:new  修饰符访问操作完成后列的值

:old  修饰符访问操作完成前列的值

特性 insert  update delete
old null 有效 有效
new 有效 有效 null

例:

(1)在修改emp表雇员的薪水时,显示雇员工资修改前和修改后的值;

(2)如何确保在修改员工工资不能低于原有工资。

例1:

编写一个触发器的时候,保证当用户在删除一张表(emp)记录的时候,自动把删除的记录的id和name两个字段备份到另外一张表(emp_bak)中。

1创建备份表

create table emp_bak(

id number,

name varchar2(2000)

)

2创建触发器

3执行删除语句

 例2:

编写一个新的触发器,如何控制员工的新工资不能低于原来的工资,同时也不能高出原来工资的20%,使用约束显示无法实现该规则

create  or  replace  trigger tri5

before  update on

scott.emp

for each row

begin

if (:new.sal<:old.sal or :new.sal>:old.sal*1.2) then

dbms_output.put_line('工资范围不对!');

raise_application_error(-20010,'工资范围不对');

end if;

end;

语句执行结果:

 例3:

阻止把小于18岁的用户添加到数据库的表中,编写一个触发器完成该操作。

1创建一张表,表中字段有birthday

create  table emp2(

id number primary key,

name  varchar2(32),

birthday  date

)

2创建触发器

create  or replace trigger tri6

before  insert on

scott.emp

for each row

begin

if  add_month( :new.birehday,18*12)>  sysdate  then

dbms_output.put_line('你年龄小');

raise_application_error(-20011,'你年龄小');      ------阻止添加

end  if;

end;

 3执行添加语句

 (4)系统触发器    (数据库的用户需是管理员的用户,才能创建ddl触发器)

 系统触发器,主要针对Oracle事件的触发器,比如用户登录(logon,logoff )数据库的启动或者关闭(startup,shutdown)

常用的属性函数

ora_client_ip address    -----返回客户端的IP

ora_database_name     -----返回数据库名

ora_login_user   -----返回登陆用户名

ora_sysevent      -----返回触发触发器的系统事件名

ora_des_encrypted_password     -----返回用户des(md5)加密后的密码

基本语法

create  or  replace  trigger  触发器名

after [before]  logon[logoff]  on  database

begin

//执行语句

end;

 例:

完成数据库的登录(logon)和退出(logoff)触发器   -----需管理员用户

1创建一张表用于保存用户登录或者退出的情况

create  table  log_table(

username varchar2(20),

logon_time date,

logoff_time  date,

address  varchar2(20)

)

2创建登录触发器

create  or replace trigger  tri7

after  logon on database

begin

insert into log_table(username,logon_time,address)  values(ora_login_user,sysdate,ora_client_ip address )

end;

3创建退出触发器 

 create  or replace trigger  tri8

before  logoff on database

begin

insert into log_table(username,logoff_time,address)  values(ora_login_user,sysdate,ora_client_ip address )

end;

(5)ddl触发器   (数据库的用户需是管理员的用户,才能创建ddl触发器)

 ddl触发器主要的用途是记录在Oracle中发生的ddl操作

基本语法:

create  or replace trigger  触发器名

after  ddl  on  方案名.schema     -------如scott.schema   ( scott是数据库管理员用户名schema是关键字)

begin

//执行语句

end;

 例:

编写一个触发器,可以记录某个用户进行的ddl操作

1创建一张表

create  table  my_ddl_record(

event  varchar2(64),

username  varchar2(64),

ddl_time  date

)

2创建触发器

create  or replace trigger  tri9

after  ddl  on  scott.schema     ------scott是管理员用户

begin

insert  into  my_ddl_record  values(ora_sysevent,ora_login_user ,sysdate);

end;

触发器总结:在oracle中dml触发器需要手动提交(如果没有手动提交,当退出控制台时,Oracle会自动提交),ddl触发器语句自动提交

(6)管理触发器

管理触发器使用管理员账号登录数据库

  • 禁止触发器

指让触发器临时失效

 alter trigger  触发器名  disable;

  • 激活触发器

 alter  trigger  触发器名  enable;

  • 禁止或是激活表的所有触发器

 alter  table 表名 disable  all  triggers;  ---禁止一张表所有触发器

 alter  table  表名enable  all  triggers;   ----激活一张表所有触发器

  •  删除触发器

drop  trigger  触发器名

 20.Oracle例外(异常)处理

 在pl/sql执行过程中发生异常时系统所作的处理称为一个例外情况(exception)。通常情况有三种:

----预定义的Oracle例外情况,对于这种预定义的例外情况无须再程序中定义,由Oracle自动触发(重点)。下图是帮助文档的预定义的例外情况文档。

 -----非预定义的Oracle例外情况由使用者增加定义例外情况,然后Oracle自动将其触发执行

-----自定义例外,这个用的比较少。

预定义的例外情况有如下几种: 

 例外常见的几种异常:

-------(1)cast_not_found案例 

 -------(2)no_data_found案例

 -------(3)too_many_rows案例

 基本语法:

begin

//执行语句

exception

//捕获异常

when  例外名称  then

//执行语句

when  例外名称  then

when  others then

//其他

end;

 例:

编写一个存储过程 ,可接收雇员的编号,并显示该雇员的姓名,如果编号不存在就会抛出异常(捕获异常的目的:给用户提示更加明确;可能需要对异常进行业务处理。)

create  or  replace  procedure  pro1(v_in_empno  number)  is

v_ename  emp.ename%type;

begin 

select ename into  v_ename  from emp  where  empno=v_in_empno;

dbms_output.put_line('名字是' || v_ename);

exception

when  NO_DATA_FOUND  then

dbms_output.put_line('你输入的编号不存在');

when  others  then

dbms_output.put_line('不明错误')

 end;

 21.Oracle数据库和表的备份和恢复

  •  数据库管理员和对数据库(方案、表)的备份和恢复

每个Oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但一个大的数据库可能需要多个dba分担不同的管理职责。

数据库管理员主要的职责:

---(1)安装和升级Oracle数据库;

----(2)建库、表空间、表、视图、索引......

-----(3)制定并实施备份与恢复计划

-----(4)数据库权限管理、调优、故障排除

-----(5)对于高级dba,要求能参与项目开发,会编写sql语句、存储过程、触发器、规则、约束、包

  • 数据库管理员

 管理数据库的用户主要是sys和system;(sys相当于董事长,system相当于总经理)

两个用户的区别:

(1)从重要性的区别,存储的数据的重要性不同

sys:所有Oracle数据字典的基表和视图都是放在sys用户中,这些基表和视图对于Oracle的运行是至关重要,由数据库自己维护,任何用户都不能手动更改。sys用户拥有dba(角色)、sysdba(系统权限)、sysoper(系统权限)角色或权限,是Oracle权限最高的用户。

system:用于存放次一级的内部数据,如Oracle的一些特性或工具的管理信息。system用户拥有dba角色 、sysdba系统权限。

(2)其次的区别,权限不同

sys用户必须以as  sysdba或as  sysoper形式登录。不能以normal方式登录数据库。

system如果正常登录,它其实就是一个普通的dba用户,但是如果以as  sysdba登录,其结果实际上它是作为sys用户登录的,这一点类似Linux里面的su的感觉,从登录信息里面我们可以看出来。

 (3)sys和system用户的比较

sys用户 对应方案存放的数据更重要  system用户对应的方案存放次一级的数据

sys用户只能以as sysdba或者as  sysoper登录 system  可以用normal登录 

  •  使用import和export对数据库(方案、表)进行备份和恢复

 逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程 ,

逻辑恢复是指当数据库对象被误操作后使用工具import利用备份的文件把数据对象导入到数据库的过程。

物理备份即可在数据库open的状态下进行也可在关闭数据库后进行,但是逻辑备份和恢复只能在open的状态下进行。

 原理图:

  •  导出表:

 导出具体的分为:导出表、导出方案、导出数据库三种方式。

导出使用exp命令来完成的,该命令常用的选项有你:

(1)导出自己的表

exp  userid=用户名/密码@数据库实例名 tables=(表名1,表名2.....)  file=备份路径

 例:导出scott.emp表

exp  userid=scott/m123@orclhsp  tables=(emp,dept)  file=d:/emp.dmp

特别说明:该命令需要在dos命令下 执行。

                  备份文件的后缀名一般是.dmp但是这个不是必须的。

   (2)导出其他方案的表

 如果用户要导其他方案的表,则需要dba的权限或是exp_full_database的权限,比如system就可以导出scott的表。

exp  userid=用户名/密码@数据库实例名  tables=(方案名.表名1,方案名.表名2.......)  file=备份路径

如果希望导出其他方案的表(其他数据对象),则往往是system用户来完成

(3)导出表的结构

exp  userid=用户名/密码@数据库实例名  tables=(表名1.....)  file=备份路径    rows=n

rows=n表示不要行数,n是no的意思。

 (4)使用直接导出方式(数据量比较大可以使用,提高导出速度)

exp  userid=用户名/密码@数据库实例名   tables=(表名1....)  file=备份路径   direct=y

direct=y表示直接导出的意思,y是yes的意思。

 这种方式比默认的常规方式速度要块,当数据量大时,可以考虑使用这样的方法。

这时需要数据库的字符集要与客户端字符集完成一致,否则会报错。

  •  导出方案 

 导出方案是指使用export工具导出一个方案或是多个方案中的所有对象(表、索引、约束.....)和数据。并列放到文件中。

(1)导出自己的方案

exp  用户名/密码@数据库实例名  owner=用户名   file=备份路径

(2)导出其他方案

如果用户要导出其他方案,则需要dba的权限或是exp_full_database的权限,例如system用户就可以导出任何方案

 exp  用户名/密码@数据库实例名   owner=(所有者1,所有者2) file=备份路径

所有者1,所有者2是指导出的数据库的用户名

说明:如果用户权限够大,则可一次性导出多个用户的方案,比如system.

  • 导入表

当某张表被破坏,我们可以使用imp命令来恢复数据

基本语法:

imp  userid=用户名/密码@数据库实例名   tables=(表名1.....)  file=备份文件

例:

imp  userid=scott/m123@orclhsp  tables=(emp,dept)  file=d:/emp.dmp

 22 Oracle的卸载

 一般运用程序,安装后,可以通过uninstal工具来卸载,但是Oracle没有。

 Oracle卸载步骤如下:

1.停止Oracle的相关服务

2.使用universal  installer来完成初步卸载,该工具不会把Oracle注册表的信息清除,所以

 就会给我们后续安装oracle、升级Oracle带来麻烦。

 3.到注册表中删除Oracle的注册信息,运行regedit命令,删除以下内容:

 4.删除环境变量

删除环境变量classpath,path中含有Oracle字样的值。

5.最后在文件系统内删除Oracle相关的文件及目录,删除系统盘符:c\program  files\oracle目录,删除Oracle_base目录。

在默认情况下,Oracle卸载不会删除你的数据库文件,所以需要手动删除,如果删除出现错误,则需重启机器在删除。(数据库文件在安装盘下的\oracle目录。) 

 

 ======================================2023.12.10整个关于数据库的视频笔记完成,感谢观看!============================================================

posted on   雪之缘  阅读(3521)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示