由于业务需求,应用需要批量更新表上一个字段的值,以下是脚本:

SET FEEDBACK ON

SET PAGESIZE 49999

SET SERVEROUTPUT ON SIZE 1000000

DECLARE

v_card_no prepaid_card.card_no%type;

i integer;

cursor card_cur isselect card_no from prepaid_card;

BEGIN

open card_cur;

i := 0;

LOOP

FETCH card_cur INTO v_card_no;

EXIT when card_cur%notfound;

i := i +1;

update prepaid_card set param = '1000000000' where card_no = v_card_no;

IF mod(i, 10000) = 0 THEN

commit;

END IF;

END LOOP;

commit;

dbms_output.put_line('处理总行数'||i);

close card_cur;

exception

when no_data_found then

dbms_output.put_line('无数据');

when others then

dbms_output.put_line('错误代码:'||sqlcode||'.'||'错误描述:'||sqlerrm||'.');

END;

/

exit;

原来的想法是打开游标开始查询,之后根据fetch得到的记录进行更新,把所有记录的param字段都设置为1000000000。

由于查询打开游标时间过长,更新数据时出现ORA-1555错,快照过旧。

在第二次批量更新字段值时,考虑到该批量操作耗时较长,所以将脚本改成如下内容,期望可以避免重复更新:

SET FEEDBACK ON

SET PAGESIZE 49999

SET SERVEROUTPUT ON SIZE 1000000

DECLARE

v_card_no prepaid_card.card_no%type;

i integer;

cursor card_cur isselect card_no from prepaid_cardwhere param <> '1000000000';

BEGIN

open card_cur;

i := 0;

LOOP

FETCH card_cur INTO v_card_no;

EXIT when card_cur%notfound;

i := i +1;

update prepaid_card set param = '1000000000' where card_no = v_card_no;

IF mod(i, 10000) = 0 THEN

commit;

END IF;

END LOOP;

commit;

dbms_output.put_line('处理总行数'||i);

close card_cur;

exception

when no_data_found then

dbms_output.put_line('无数据');

when others then

dbms_output.put_line('错误代码:'||sqlcode||'.'||'错误描述:'||sqlerrm||'.');

END;

/

exit;

这里问题出现了。param <> '1000000000'其实不是param = '1000000000'的补集,这里遗漏了一种可能:NULL(空值)。NULL是不参与字段比较的,将sql语句改写后将会忽略param字段为NULL类型的记录,这么做导致了应用逻辑处理出现问题,最终进行了紧急修复。

做个简单实验证明一下:

SQL> create table test (num number,name varchar2(10));

Table created.

SQL> insert into test values(1,'0');

1 row created.

SQL> insert into test values(2,'1');

1 row created.

SQL> insert into test values(3,' ');

1 row created.

SQL>insert into test values(4,null);

1 row created.

SQL>commit;

Commit complete.

SQL> select * from test where name <>'0';

NUM NAME

---------- ----------

2 1

3

SQL>select * from test where name is not null;

NUM NAME

---------- ----------

1 0

2 1

3

SQL> select * from test where name is null;

NUM NAME

---------- ----------

4

SQL> select * from test where name='0';

NUM NAME

---------- ----------

1 0

Conditions Containing Nulls

Condition

Value of A

Evaluation

a IS NULL

10

FALSE

a IS NOT NULL

10

TRUE

a IS NULL

NULL

TRUE

a IS NOT NULL

NULL

FALSE

a = NULL

10

UNKNOWN

a != NULL

10

UNKNOWN

a = NULL

NULL

UNKNOWN

a != NULL

NULL

UNKNOWN

a = 10

NULL

UNKNOWN

a != 10

NULL

UNKNOWN

oracle中的null 字段,Oracle下的NULL字段相关推荐

  1. oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?

    oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...

  2. oracle中的guid,在Oracle中使用Guid

    在Oracle中使用Guid 在Oracle中使用Guid 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g ...

  3. oracle排序非英文最后,Oracle中中文、数字,英文混杂形式的字段进行排序的方法...

    http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...

  4. oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法

    http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...

  5. Oracle中scott数据库,浅析Oracle中sys、system和Scott用户下的数据库连接问题

    system默认:manager sys默认:change_on_install 使用sql Plus登录数据库时,system使用密码manager可直接登录. 由于为自己的密码时更改过的,所以我的 ...

  6. oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍

    oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...

  7. 在oracle中创建一个序列,Oracle(创建序列)

    概念: 所谓序列,在oracle中就是一个对象,这个对象用来提供一个有序的数据列,这个有序的数据列的值都不重复. 1.序列可以自动生成唯一值 2.是一个可以被共享的对象 3.典型的用来生成主键值的一个 ...

  8. oracle中pga指什么,oracle中pga内存分配原则

    pga_aggregate_target 通常缩写为P_A_T,该参数同时限制全局pga分配和私有工作区内存分配 在oracle9i以及10gr1中,单个sql操作内存使用存在如下限制: 对于串行操作 ...

  9. oracle中minus什么意思,Oracle Minus关键字

    Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...

  10. oracle中timestamp怎么用,Oracle Timestamp类型

    在本教程中将学习Oracle TIMESTAMP数据类型以及如何在Oracle数据库中有效处理TIMESTAMP数据. Oracle TIMESTAMP数据类型简介 TIMESTAMP数据类型用于存储 ...

最新文章

  1. Facebook再曝数据丑闻删除应用数据仍会被泄漏
  2. python以及MATLAB终止循环的快捷键
  3. POPUP_TO_DECIDE_WITH_MESSAGE
  4. 【Tools】gcc4.4升级到gcc4.8
  5. 3分钟,看回归分析模型怎么做
  6. c#中Show和Showdialog的区别分析
  7. halcon使用点拟合圆形时候,点集顺序紊乱,不影响圆形拟合效果
  8. 如何让 Timer 在特定时间点触发?
  9. 计算机网络 --- 网络层IP地址
  10. 转换汇编到shellcode的过程
  11. 关于python中 __init__.py
  12. nc(NetCat)命令
  13. 基于matlab的2ASK调制解调仿真
  14. 轻松两步实现了接口限流
  15. aircrack-ng/airdrop-ng
  16. vscode远程连接提示过程试图写入的管道不存在
  17. 2020第十一届蓝桥杯C/C++国赛B组
  18. 今天过了淘宝商城的考试,嘿做点好事,公布些答案
  19. 逻辑回归 — Sigmoid函数 —预测是否出现过交通事故
  20. 【进制转换】如何使用C++将一个十进制数转为16进制?

热门文章

  1. 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
  2. Linux / TCPIP / 判断 client 已经关闭的方法
  3. TCP/IP / IP 头
  4. oracle数据泵还原命令,Oracle Linux环境中使用数据泵的形式还原Oracle数据库
  5. 无csrf防护的html页面,Springs CSRF保护仅* HTML登录页面
  6. 求职中最吃香的编程语言:JavaScript、Java 和 Python
  7. Kubernetes入门——Kubernetes应用部署
  8. bs模型Nd怎么用计算机算,BS模式的下试卷自动生成系统的设计与实现
  9. java之spring mvc之文件上传
  10. 搭建Docker环境---私有仓库registry搭建