注意区分:
-----在操作数据库时如果是在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 3 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整个关于数据库的视频笔记完成,感谢观看!============================================================
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库