度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1443|回复: 3
打印 上一主题 下一主题

[分享] Oracle中的事务和内置函数

[复制链接]

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
跳转到指定楼层
楼主
发表于 2020-6-25 21:25:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
什么是事务?

事务用于保证数据的一致性,它有一组相关的DML语句组成,该组的语句要么全部成功,要么全部失败。

如,网上转账就是典型的事务处理,用以保证数据的一致性。

事务和锁:

当执行事务操作时(DML语句),Oracle会在被作用的表上加锁,防止其他用户修改表的表结构,这点对用户来讲是非常重要的。

事务的几个重要操作:

设置保存点
savepoint a1;

取消部分事务,回滚操作
rollback to a1;

取消全部事务
rollback

只读事务

只读事务是指只允许执行查询语句(select)的操作,而不允许其他任何DML语句操作的事务。使用只读事务可以确保用户只能取到某时间点的数据。

例如:机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务,在设置了只读事务后,尽管其他会话可能会提交新的事务,但是只读事务将不会取得最新事务的变化,从而可以保证取得特定时间点的数据信息。



sql函数使用

字符函数

介绍:字符函数是Oracle中最常用的函数

lower(char):将字符串转换为小写格式;

upper(char):将字符串转换为大写格式;

length(char):返回字符串的长度;

substr(char,startIndex,contentLength):截取字符串的字串;

如:显示首字母大写、其余字母小写的员工姓名;

select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) from emp;

注:oracle中用||连接2个字符串

如:以首字母小写的格式显示所有员工姓名;

select lower(ename)||upper(ename,2,length(ename)-1) from emp;

replace(char,search_string,replace_string):字符串替换;

instr(char1,char2,[,n[,m]]):取字串在字符串中的位置;



数学函数

数学函数的输入参数和返回值的数据类型都是数字型的。数学函数包括cos,cosh,sin,sinh,exp,ln,sqrt,tan,tanh,acos,asin,atan,round。

常用的有:

round(n,[m]):执行四舍五入,如果省略掉m则四舍五入到整数;如果m是正数,则四舍五入到小数点的后m位;如果m是负数,则四舍五入到小数点的m为前;

trunc(n,[m]):该函数用于截取数字。如果省掉m,就截去小数部分;如果m是正数就截取到小数点后m位;如果m是负数就截取到小数点前m位。

mod(m,n):取模

floor(n):返回小于或是等于n的最大整数,向下取整;

ceil(n):返回大于或是等于n的最小整数,想上取整;

对数字的处理,在财务系统或者银行系统里使用的最多,不同的处理方法,对财务报表有不同的影响。

如:显示在一个月为30天的情况下所有员工的日新金,忽略余数;

select trunc(sal/30),ename form emp;

select floor(sal/30),ename from emp;



其他数学函数:

abs(n):返回数字n的绝对值

acos(n):返回数字的反余弦值

asin(n):返回数字的反正弦值

atan(n):返回数字的反正切值

cos(n):返回数字的余弦值

exp(n):返回e的n次方幂

log(m,n):返回对数值

power(m,n):返回m的n次方幂



日期函数

日期函数用于处理date类型的数据。

默认情况下,Oracle日期格式是dd-mon-yy即12-8月-98

sysdate:该函数返回系统时间

add_months(d,n):指定日期增加n个月份

last_day(d):返回指定日期所在月份的最后一天

例如:查找入职8个月多的员工

select * from emp where add_months(hiredate,8)<sysdate;

例如:显示满10年服务年限的员工姓名与受雇日期

select ename,hiredate from emp where sysdate>=add_months(hiredate,10*12);

例如:对于每个员工,显示其加入公司的天数

select ename,floor(sysdate-hiredate) "入职天数" from emp;

select ename,trunc(sysdate-hiredate) "入职天数" from emp;

例如:找出各个月倒数第三天受雇的所有员工

select ename from emp where hiredate=last_day(hiredate)-2;



转换函数

转换函数用于将数据类型从一种转为另一种。在某些情况下,Oracle Server允许值的数据类型和实际类型不一样,这时Oracle Server会隐含的转化数据类型。

比如:

create table t1(id, int);

insert into t1 values('10');这时Oracle会自动将'10'转换为10。

create table t2(id,varchar2(10));

insert into t2 values(10); 这时Oracle会自动将10转换为'10'.

注意:尽管Oracle可以进行隐含的数据类型转换,但是并不适应于所有情况,为了提高程序的可靠性,应该使用转换函数进行转换。



to_char()

我们可以使用select ename,hiredate,sal from emp where deptno=10;显示信息,但是在某些情况下并不能满足所有需求;

例如:如何显示日期的格式为 时/分/秒



例如:如何显示薪水为指定的货币

select ename, to_char(sal,'L99999.99') from emp;

返回的是:RMB800.00




如:显示每个员工的入职日期,精确到时分秒

select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;



例子:显示1980年入职的所有员工

select ename form emp where to_char(hiredate,'yyyy')=1980;

例子:显示所有12月份入职的员工

select ename from emp where to_char(hiredate,'mm')=12;



to_date

函数to_date()将字符串转换为日期类型。

例子:按照中国人的习惯年-月-日添加日期

insrt into emp(hiredate) values(to_date('1990-12-09','yyyy-mm-dd')) where deptno=8888;



系统函数:sys_context

terminal:当期会话客户所对应的终端表示符
language:语言
db_name:当前数据库名称
nls_date_format:当期会话客户所对应的日期格式
session_user:当期会话客户所对应的 数据库用户名
current_schema:当期会话客户所对应的 默认方案
host:数据库所对应的主机名称
通过该函数,可以查看一些重要的系统信息,如查询正在使用的数据库:、

select sys_context('userenv','db_name') from dual;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

348

主题

3572

帖子

9327

积分

论坛元老

Rank: 8Rank: 8

积分
9327
沙发
发表于 2020-6-28 12:02:36 | 只看该作者
呀呀呀呀呀呀呀牛牛
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9327

积分

论坛元老

Rank: 8Rank: 8

积分
9327
板凳
发表于 2020-6-28 12:18:13 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
地板
 楼主| 发表于 2020-6-29 20:24:29 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 11:11 , Processed in 0.126275 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表