Oracle 事物 过程和函数

事物

事务的特点ACID
原子性 (atomicity) :组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性 (consistency) :在事务处理执行前后,数据库是一致的 ( 数据库数据完整性约束 )
隔离性 ( isolcation ) :一个事务处理对另一个事务处理的影响。
持续性 (durability) :事务处理的效果能够被永久保存下来。
一个事务只会有一个结果:要么 成功 、要么 失败
Oracle中的事务
事务的开始 DML 语句的执行即开始一个事务。
以下情况之一为事务的结束:
显式的结束:执行了 commit 或是 rollback;
隐式的提交:执行了 DDL,DCL 语句,或是 exit 退出。
隐式的回滚:系统异常关闭,死机,断电。
保存点的创建和回滚
使用 SAVEPOINT 语句在当前事务中创建保存点。
使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
UPDATE...
SAVEPOINT update_done;
Savepoint created.
INSERT...
ROLLBACK TO update_done;
Rollback complete.
提交或回滚前的数据状态:
改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作。
提交后的数据状态:
数据的改变已经被保存到数据库中。
改变前的数据已经丢失。
所有用户可以看到结果。
锁被释放,其他用户可以操作涉及到的数据。
所有保存点被释放。

Oracle中事务的隔离级别

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读:对于两个事务T1, T2, T1 读取了已经被T2 更新但还没有被提交的字段.之后, T2 回滚,T1读取的内容就是临时且无效的.
不可重复读:对于两个事务T1, T2, T1 读取了一个字段,然后 T2更新了该字段.之后, T1再次读取同一个字段,值就不同了.
幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行.之后, 如果T1 再次读取同一个表,就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
数据库提供的4 种事务隔离级别:
Oracle支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
Oracle 同时提供了一个 Read only 的隔离级别。
Mysql 支持 4 中事务隔离级别 . Mysql 默认的事务隔离级别为 : REPEATABLE READ

存储过程

存储过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程。
创建存储过程
CREATE [OR REPLACE] PROCEDURE procedure_name

(argument1 [mode1]datatype1, argument2 [mode2] datatype2, ...)

IS [AS]

声明部分

BEGIN

执行部分

EXCEPTION

异常处理部分

END;
参数类型:in为输入类型参数     out为输出类型参数
不接收参数的过程:
create or replace procedure P1
as
begin
           dbms_output.put_line('Current date is:'||to_char(sysdate,'yyyy-mm-dd'));
end;
--调用方法1(sqlplus)
set serveroutput on;
exec P1();
--调用方法2
set serveroutput on;
begin
  p1();
end;

接收输入类型的参数:

当为过程定义参数时,如果不指定参数模式,则默认为 输入参数
create or replace procedure pro2(p_id in varchar2,p_name in varchar2)
as
begin
   insert into person values(p_id,p_name);
end;
--调用
set serveroutput on;
exec pro2('P100','Marray');
使用过程时多参传递:
为形参传递变量和数据可以采用
位置传递
名称传递
组合传递

在调用过程时为参数传递变量和数据:

按位置传递
按位置传递是指在调用时按参数的排列顺序依次写出实参的名称,将形参与实参关联起来进行传递
在这种方法中,形参与实参的名称是相互独立、没有关系的,次序才重要
它比按名称传递方法在书写上简单,但如果更新了一个过程的形参的次序,则对应该过程的所有调用都必须进行相应的更新,所以会增加维护应用程序

按名称传递
按名称传递是指在调用时按照形参与实参的名称写出实参所对应的形参,将形参与实参关联起来进行传递
在这种方法中,形参与实参的名称是相互独立、没有关系的,名称的对应关系很重要,但次序不重要
名称传递在调用子程序时指定参数名,并使用关联符号“ =>” 为其提供相应的数值或变量
组合传递
可以将按位置传递、按名称传递两种方法在同一调用中混合使用
但前面的实参必须使用按位置传递方法,而后面其余的实参则可以使用按名称传递的方法

函数

函数用于 返回特定数据 ,如果在应用程序中经常需要通过执行 SQL 语句来返回特定数据,则可以基于这些操作创建特定的函数
函数和过程的结构类似,但 必须有一个 RETURN 子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。
创建函数:
当创建函数时,通过使用输入参数,可以将应用的数据传递到函数中,最终通过执行函数可以将结果返回到应用程序中
当定义参数时,如果不指定参数模式,则默认为输入参数
create or replace function fun_getrandom return number
as
v_num number;
begin
  	v_num:=floor(dbms_random.value(1,10));
  	return v_num;
end;
declare
	num number;
begin
  	num:=fun_getrandom();
  	dbms_output.put_line(num);
end;
无参函数示例:
返回字符串
create or replace function f1
return varchar2
as
begin
  return 'hello';
end;
--调用
select f1() from dual;
有参函数示例:
根据员工编号,返回员工姓名
create or replace function f2
(
v_empno number
)
return varchar2
as 
v_ename emp.ename%type;
begin
select ename into v_ename from emp where empno=v_empno;
return v_ename;
end;
--调用
select f1(7369) from dual;

过程与函数的比较:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的数据库(sql server,mysql , access) 教程推荐:oracle使用教程, 深入浅出oracle 记住:欲速则不达,做任何事情要遵循他的规律,循序渐进,信心很重要 成为一个oracle高手过程:理解小知识点->做小练习->把小的只是点连成线->做oracle项目->形成只是面->深刻理解 Oracle基础部分:oracle基础使用; oracle用户管理; oracle表管理 Oracle高级部分:oracle表的查询; oracle函数; oracle数据库管理;oracle 的权角色; pl/sql 编程; 索引,约束和事物。 期望目标: 1 学会安装、启动、卸载oracle 2 使用sql *plus工具 3 掌握oracle用户管理 4 学会在oracle中编写简单的select语句 第1讲:基础语法 内容介绍: 1.为什么学习oracle 2.介绍oracle及其公司的背景 3.学会安装、启动、卸载oracle 4.oracle开发工具 5.Sql*plus的常用命令 6.oracle用户管理 一、主流数据库包括: ?微软:sql server 和 access ?瑞典:mysql AB公司 ?IBM公司:DB2 ?美国sybase公司:sybase ?IBM公司:infromix ?美国oracle公司:oracle(目前最流行的之一) 数据库分类: 小型数据库 中型数据库 大型数据库 mysql Sybase access sql server Oracle informix DB2 负载量在100人内,比如比如在负载日访问量负载可以处理海量数据板,信息系信息留言统。 5000-15000 库 sybase<oracle<db2 成本低 成本在万元内 大型数据库的安全性能 安全性要求不高 比如商务网站 高,价格也很昂贵~万 元以上 二、oracle安装,启动及卸载 1.系统要求: 操作系统最好为windows2000 内存最好在256M以上 硬盘空间需要2G以上 2.oracle安装会自动的生成sys和system两个用户 2 说明: 1Sys用户 是 超级用户,具有最高权限,具有sysdba角色,create database? 的权限,默认密码是manager 2System 用户 是 管理操作员,权限也很大,具有sysoper角色,没有create ? database权限,默认密码是 change_on_install 3一般讲,对数据库维护,使用system用户登录就可以了 ? 3.启动oracle 右键单击我的电脑->服务和应用程序:服务->启动OracleServiceMYORA1(MYORA1 是安装oracle时起的名字各有不同)和OracleOracleHome90TNSLlistener 4.卸载oracle 1、先关掉oralce,net stop OracleServiceORCL(ORCL是我的实例名字,换成你的),或者去我的电脑服务中关闭 2、开始,,程序,,Oracle - oracle的版本号,我的是10ghome,,Oracle Installation Products,, Universal Installer 卸载oracle 3、进注册表,regedit,删除选择 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE下所有的key。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\App lication这个里面所有有oracle这个字眼的,删除 4、删除c盘\Program Files\Oracle目录的东西以及oracle安装目录下所有的文件以及文件夹 5、环境变量中删除有关oracle的classpath和path ,, 三、oracle开发工具, Sqlplus是Oracle自带的工具软件,主要用于执行sql语句,pl/sql块。,如何使用:,, 1)在开始,程序,oracle,orachome90,, ,,application,development,sql*plus(这个是在dos下操作), 2)在运行栏中输入:sqlplusw或者sqlplus即可, 3)在开始,程序,oracle,orahome90,, Application,development,sql*plus,worksheet,,4)pl/sql,developer,属于第三方软件,主要用于开发,测试,优化oracle,pl/sql,的 存储过程.如:触发器,此软件oracle不带,需要单独安装。,5)oracle的企业管理器(oem,oracle,enterprise,manager),位置在,,开始,程序,oracleoracle,oraclehome90,enterprise,manager,console, ,,即可启动oracle的企业管理器,是一个图形界面环境, , , , 四、Sql*plus的常用命令, 3 1.连接命令 (1) conn[ect] 用法:conn 用户名/密码 @ 网络服务名[as sysdba/sysoper](角色登陆)当 用特权用户身份连接时,必须带上as sysdba 或是 as sysoper 例:conn scott/tiger; show user; 显示当前用户 2.断开连接命令 (2) disc[onnect] 说明:该命令用来断开与当前数据库的连接 (3)passw[ord] 说明:该命令用于修改用户名的密码。如果要想修改其他用户的密码,需要用sys/system登陆。 (4) show user 说明:显示当前用户名 (5) exit 说明:该命令会断开与数据库的连接,同时会退出sql*plus 3.文件操作命令 (1) start和@ 说明:运行sql脚本 案例:sql>@ d:\a.sql 或者 sql>start d:a.sql (2) edit 说明:该命令可以编辑指定的sql脚本。 案例:sql>edit d:\a.sql (3) spool 说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。 案例:sql>spool d:\b.sql 并输入 sql>spool off 4(交互式命令 (1), 说明:可以替代变量,而该变量在执行时,需要用户输入。如:sql>select * from emp where job=‘&job;’ 输入job是注意大小写 (2) edit 说明:该命令可以编辑指定的sql脚本 案例: sql>edit d:\a.sql 5.显示和设置环境变量 概述:可以用来控制输出的各种格式,set show 如果希望永久的保存相关的设置,可以去修改 glogin.sql脚本 (1)linesize 说明:设置显示行的宽度,默认是80个字符 sql>show linesize sql>set linesize 90 (2)pagesize 说明:设置每页显示的行数目,默认是14,用法和linesize一样,至于其他环境参数的使用也是大同小异 sql>set pagesize 8 实际得到的不是14/8=2页 而是:14/(8-3)=5页 五Oracle用户的管理 4 1.创建用户 概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。 create user 用户名 identified by 密码; 2.给用户修改密码 概述:如果给自己修改密码可以直接使用 sql>password 用户名 如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限 sql>alter user 用户名 identified by 新密码 3.删除用户 概述:一般以dba的身份去删除某个用户,如果用其他用户去删除用户则需要具有 drop user的权限。 比如 drop user 用户名【cascade】 注意:在删除用户时,如果要删除的用户已经创建了表,就需要在删除的时候带一个参数cascade 4.用户管理的综合案例 概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限(connect登陆,dba管理员,resource建表)使用命令grant,回收权限使用命令revoke. 为了给讲清楚用户管理,给大家举一个案例。 案例: 新建一个用户lady 并给该用户赋可登陆可创建表 Sql>create user lady identified by lady123(密码) 受登陆权限:,grant connect to lady 受可创建表:grant resource to lady 可以多个同时授权:grant connect,resource to lady; 注意授权用户级别应该为(dba以上sys/system) 还可以使用PL/SQL工具创建:文件->新建->用户 现在我要把scott用户里面的emp表的权限赋给lady用户但lady只能有对emp查询权限: grant select on emp to lady;(授权用户级别应该:授权本身,或者sys/system) lady 查询emp的方式:select * from scott.emp; 案例:同上我想把update的权限也赋给leng , grant update on emp to leng; 2)我想把emp所有的(增,删,改,查/insert,delete,update,select这四个一起可以用all代替) 操作权限赋给leng grant all on emp to leng;(此时登陆用户为scott) 案例2:这时我想把权限收回来怎么办呢, 这时用关键字revoke(撤回), revoke select on emp from lady; 收回lady的查权限 案例: 5 现在scott希望吧查询emp表权限通过lady用户继续给别的用户, Scott > grant select on emp to lady with grant option; Leng > grant select on scott.emp to 新建用户 案例: scott想把emp表的权限从leng用户赋权给新用户yoyo; Scott> grant select on emp to leng with grant option; Leng> grant select on scott.emp to yoyo; Yoyo> select * from scott.emp; 如果是对象权限,就加入with grant option 例:grant select on emp to xiaoming with grant option 如果是系统管理权限,system 给xiaoming权限时: 例:grant connect to xiaoming with admin option 如果scott把xiaoming 对emp表的查询权限回收,那么xiaohong会怎么样 Scott->xiaoming->xiaohong ,结果就是xiaoming,xiaohong,都不能查询emp表

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值