关于 Oracle NULL栏位和PL./SQL执行实验

2015-02-13 23:47:01 · 作者: · 浏览: 57

1, PL/SQL 中可以执行插入''或者NULL 的操作, 前提是栏位允许为空.


2, 可以对NULL进行一系列数据库运算. 如:


? ? SELECT ROUND(TO_NUMBER(MAX(A.IN_STATION_TIME)-SYSDATE))*24 FROM SFISM4.R_WIP_TRACKING_T A WHERE


? ? ? A.IN_STATION_TIME IS NULL


总结: 相应TO_NUMBER(NULL)也是可行, MAX 也是可行得,没有问题.


3, 回归主题, SQL 原本的样子要做成这个样:


? INSERT INTO SFISM4.R_DT_PCB_OVERTIME_T F


? ? (F.SERIAL_NUMBER,


? ? F.MODEL_NAME,


? ? F.LINE_NAME,


? ? F.PRODUCTION_TIME,


? ? F.INTERCEPT_TIME,


? ? F.EXPRIATUION_HOUR,


? ? F.STATE_FLAG,


? ? F.SEND_USER)


? ? (SELECT 'COCO111111111',


? ? ? ? ? ? 'NIUBI1',


? ? ? ? ? ? '15555',


? ? ? ? ? ? NVL(NULL, MAX(A.IN_STATION_TIME)),


? ? ? ? ? ? SYSDATE,


? ? ? ? ? ? NVL(ROUND(TO_NUMBER(MAX(A.IN_STATION_TIME)-SYSDATE))*24, '0'),


? ? ? ? ? ? '1',


? ? ? ? ? ? '1'


? ? ? FROM SFISM4.R_WIP_LOG_T E


? ? ? WHERE E.SERIAL_NUMBER = 'COCO111111111') AND E.GROUP_NAME = 'SMTS')


结果, 部分执行后, 一条也不会插入. Insert 操作, 根据子查询, 如果子查询为空, 那么什么都不会插入.


4, 高潮来了-- 去掉子查询中的WHERE后, 即SELECT 条件都是肯定有值后, 居然将表E中全部记录插入. 啊, 幸亏是测试库, 数据量不大, 但是也执行了5s. 好吧, 异常. 全部删除!? 可见根据结果集Insert还是需要慎重啊, 否则将多少垃圾数据在实际中.


5, 回归本意.? 最终针对NULL值单独判定, 防止意外大量数据产生.


--------------------------------------分割线 --------------------------------------


--------------------------------------分割线 --------------------------------------