09更新数据、事务处理、数据伪列等

备份数据表:CREATE myemp AS SELECT * FROM emp;

数据增加语法:

INSERT INTO 表名称 (字段名称,字段名称,字段名称,。。。) VALLUES(数据,数据,数据,。。。),数据要与字段对应;

最好使用单行增加;

日期格式可用TO_DATE(’1988-08-08‘,’yyyy-mm-dd'),字符串用单引号,数值不需要单引号;

 

更新数据

UDATE 表名称 SET 字段=内容,字段=内容。。。【WHERE 更新条件】、

例:UDATE myemp SET sal=900,comm=1000 WHERE empno=7396;

加上子查询:将最低工资的雇员工资改为公司的平均工资

UDATE myemp SET sal=(SELECT AVG(sal) FROM myemp) WHERE sal=(SELECT MIN(sal) FROM myemp);

例:将所有雇佣日期在81年的都更改为今天并将工资增加20%;

UDATE myemp SET hiredate=SYSDATE,sal=sal*1.2

WHERE hiredate BETWWEN '01-1月-1981‘ AND ’31-12月-1981‘;

 

注:如果不加更新条件,则系统默认将所有行都更新,不建议做这个。

 

数据删除

DELETE FROM 表名称 WHERE 删除条件(只删除一行)

删除若干个数据:用IN

DELETE FROM myemp WHERE empno IN(7566,7788,7369);

 

 事务处理:

当sqlplus客户端使用DELETE FROM 表名称这个命令做整个表格数据删除时,实际上并没有删除掉ORACLE SEVER里面的数据;因为使用sqlplus客户端删除数据时与ORACLE服务端之间是有一个缓冲区的;缓冲区的数据是可以做回滚操作退回到最初的状态的;如果需要从缓冲区做删除必须提交更新;

在事务处理中提供两个核心的命令:

1.提交事物:commit;

2.回滚事物:rollback;

例:删除myemp表数据

DELETE FROM myemp WHERE empno=7369;

commit;

所有的更新操作都是被事务所保护的。事务的好处在一组更新操作完成之后再进行提交处理,这样才能保证数据的完整性;

 

对于数据表的操作,很明显查询要比更新操作更加的安全,因为更新操作有可能会出现错误,以导致没有按照既定的要求正确的完成更新操作。
但是在很多时候更新有可能会有多条指令共同完成,例如:以银行转帐的方式为例:
判断A的账户上是否有5000W;
判断B账户是否存在并且状态是否正常;
从A的账户上移走5000W;
向B的账户之中增加5000W;
向银行支付手续费用5000;
以上的五个操作是一个整体,可以理解为一个完整的业务,如果这之中第三点出错了,那么其他的操作呢?所有的操作都应该不再执行,并且回归到最原始的状态,而这个操作流程就是事务的操作。
所有的事务处理操作都是针对于每一个session进行的,在Oracle数据库之中,把每一个连接到数据库上的用户都称为一个session,每一个session之间彼此独立,不会有任何的通讯,而每一个session独享自己的事务控制,而事务控制之中主要使用两个命令:
事务的回滚:ROLLBACK,更新操作回到原点;
事务的提交:COMMIT,真正的发出更新的操作,一旦提交之后无法回滚;
但是这样一来也会出现一些问题,例如:某一个session在更新数据表的时候还没有提交事务,其他session是无法更新的,必须等待之前的session提交后才可以;
这种问题从大的方面讲可以称为死锁,但是在Oracle之中死锁有很多的种类,这些与开发者没有太大的关系,是由DBA负责的。
所有的数据更新一定都会受到事务的控制。

 

数据伪列

当前所在页(currentPage)
每页显示的记录长度(lineSize)

语法格式(重点):

SELECT * FROM(
SELECT ROWNUM rn,列名,... FROM 表名称
WHERE ROWNUM<=currentPage*lineSize) temp
WHERE temp.rn>(currentPage-1)*lineSize;

数据伪列指的是用户不需要处理的列,而是由Oracle自行维护的数据列,在Oracle之中有两个数据伪列:ROWNUM、ROWID;
1、 行号ROWNUM (核心)
ROWNUM从单词含义上讲应该表示的是行号,实际上ROWNUM为每一个显示的记录都会自动的随着查询生成行号,

例如,下面通过两个代码观察:
SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp;
此时的ROWNUM行号并不是永久固定的; 是每次动态的重新生成的;
SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp WHERE deptno=30;

那么既然有了ROWNUM之后,下面就可以实现数据的部分显示; 查第一行或查前N行数据。

范例:查询前5条记录
SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=5;


范例:查询6-10条记录
按照正常的思维肯定是直接进行BETWEEN…AND的判断;
SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM BETWEEN 6 AND 10;
这个时候并没有返回任何的数据,因为ROWNUM不是真实列,而要想真正的实现这种查询,思路是:先查询前10条记录,之后再显示后5条记录,要依靠子查询完成。
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=10) temp
WHERE temp.m>5;


如果现在按照这个思路,下面就可以给出日后程序中所需要分页的功能实现。
当前所在页(currentPage)
每页显示的记录长度(lineSize)

语法格式(重点):

SELECT * FROM(
SELECT ROWNUM rn,列名,... FROM 表名称
WHERE ROWNUM<=currentPage*lineSize) temp
WHERE temp.rn>(currentPage-1)*lineSize;

范例:显示前5条记录

当前所在页(currentPage)为1;
每页显示的记录长度(lineSize)为5;
第一页:
SELECT * FROM(
SELECT ROWNUM rn,empno FROM emp
WHERE ROWNUM<=5) temp
WHERE temp.rn>0;


范例:显示中间的5条记录
当前所在页(currentPage)为2;
每页显示的记录长度(lineSize)为5;
第二页:
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=10) temp
WHERE temp.m>5;


范例:显示第三页的内容,currentPage=3,lineSize=10;
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=15) temp
WHERE temp.m>10;
以上的程序就是分页显示操作的核心代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值