oracle中的null 字段,Oracle下的NULL字段
由于业务需求,应用需要批量更新表上一个字段的值,以下是脚本:
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字段相关推荐
- oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?
oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...
- oracle中的guid,在Oracle中使用Guid
在Oracle中使用Guid 在Oracle中使用Guid 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g ...
- oracle排序非英文最后,Oracle中中文、数字,英文混杂形式的字段进行排序的方法...
http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...
- oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法
http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...
- Oracle中scott数据库,浅析Oracle中sys、system和Scott用户下的数据库连接问题
system默认:manager sys默认:change_on_install 使用sql Plus登录数据库时,system使用密码manager可直接登录. 由于为自己的密码时更改过的,所以我的 ...
- oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍
oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...
- 在oracle中创建一个序列,Oracle(创建序列)
概念: 所谓序列,在oracle中就是一个对象,这个对象用来提供一个有序的数据列,这个有序的数据列的值都不重复. 1.序列可以自动生成唯一值 2.是一个可以被共享的对象 3.典型的用来生成主键值的一个 ...
- oracle中pga指什么,oracle中pga内存分配原则
pga_aggregate_target 通常缩写为P_A_T,该参数同时限制全局pga分配和私有工作区内存分配 在oracle9i以及10gr1中,单个sql操作内存使用存在如下限制: 对于串行操作 ...
- oracle中minus什么意思,Oracle Minus关键字
Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...
- oracle中timestamp怎么用,Oracle Timestamp类型
在本教程中将学习Oracle TIMESTAMP数据类型以及如何在Oracle数据库中有效处理TIMESTAMP数据. Oracle TIMESTAMP数据类型简介 TIMESTAMP数据类型用于存储 ...
最新文章
- Facebook再曝数据丑闻删除应用数据仍会被泄漏
- python以及MATLAB终止循环的快捷键
- POPUP_TO_DECIDE_WITH_MESSAGE
- 【Tools】gcc4.4升级到gcc4.8
- 3分钟,看回归分析模型怎么做
- c#中Show和Showdialog的区别分析
- halcon使用点拟合圆形时候,点集顺序紊乱,不影响圆形拟合效果
- 如何让 Timer 在特定时间点触发?
- 计算机网络 --- 网络层IP地址
- 转换汇编到shellcode的过程
- 关于python中 __init__.py
- nc(NetCat)命令
- 基于matlab的2ASK调制解调仿真
- 轻松两步实现了接口限流
- aircrack-ng/airdrop-ng
- vscode远程连接提示过程试图写入的管道不存在
- 2020第十一届蓝桥杯C/C++国赛B组
- 今天过了淘宝商城的考试,嘿做点好事,公布些答案
- 逻辑回归 — Sigmoid函数 —预测是否出现过交通事故
- 【进制转换】如何使用C++将一个十进制数转为16进制?
热门文章
- 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
- Linux / TCPIP / 判断 client 已经关闭的方法
- TCP/IP / IP 头
- oracle数据泵还原命令,Oracle Linux环境中使用数据泵的形式还原Oracle数据库
- 无csrf防护的html页面,Springs CSRF保护仅* HTML登录页面
- 求职中最吃香的编程语言:JavaScript、Java 和 Python
- Kubernetes入门——Kubernetes应用部署
- bs模型Nd怎么用计算机算,BS模式的下试卷自动生成系统的设计与实现
- java之spring mvc之文件上传
- 搭建Docker环境---私有仓库registry搭建