zoukankan      html  css  js  c++  java
  • Oracle异常[ORA22908:NULL表值的参考]问题的解析及解决方法

    场景如下:

    --创建类型(type)
    create or replace type list_obj is table of number;
    --创建表结构
    create table test(
      name varchar2(30) primary key check(regexp_like(name,'^([a-z]|[0-9]|_)+$')),
      id number not null,
      version_list list_obj
    ) nested table version_list store as version_list;

    场景说明:类型 list_obj 相当一个元素为数字的列表。表 test 有三个字段,字段 name 为主键限制只能使用小写字母、数字、下划线组成的字符串;字段 id 是数字,限制为非空;字段 version_list 是类型为 list_obj 的嵌套表。

    操作1:

    --插入一条记录
    insert into test(name, id) values('mophee', 1);

    查询结果如下:

    目前 version_list 为空(注意,是 null),现在我们需要开始维护该字段:往 name='mophee' 的记录插入一个版本号20130403112459。语句如下:

    --插入一个版本号
    insert into table(select version_list from test where name='mophee') values(20130403112459);

    执行以上 insert 语句就报错了!

    原因是什么?version_list 字段目前是 NULL,以上insert语句试图做这个动作:table(NULL),也就是要将NULL对象化成一个表。这事有违常理,ORACLE干不了!

    那么怎么解决呢?version_list 字段之所以为NULL,是因为我们根本没对它进行初始化。那么,在insert之前先对其初始化不久能解决问题了吗?

    方法一:在往 test 表 insert 的时候使用如下语句

    --插入一条记录
    insert into test(name, id, version_list) values('mophee', 1, list_obj());

    方法二:在往 version_list 插入版本号之前先对其进行初始化

    --将 version_list 字段初始化为 list_obj 对象
    update test set version_list=list_obj() where name='mophee';

    看下图:

    这是在 pl/sql developer下的查询输出,注意 version_list 列数据单元格的背景色(与上方图片对比一下)已经不是淡黄色(此时字段值为null)!虽然查看 version_list 字段的内部内容依旧是没有一条记录,但是意义上是不一样的——初始化之前是 null,初始化之后才是 list_obj 对象。

    完毕!

  • 相关阅读:
    loj2042 「CQOI2016」不同的最小割
    loj2035 「SDOI2016」征途
    luogu2120 [ZJOI2007]仓库建设
    luogu3195 [HNOI2008]玩具装箱TOY
    51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
    HDU 5723 Abandoned country(最小生成树+边两边点数)
    BZOJ 1497: [NOI2006]最大获利(最大权闭合图)
    51nod 1615 跳跃的杰克
    SPOJ 839 Optimal Marks(最小割的应用)
    UVa 11107 生命的形式(不小于k个字符串中的最长子串)
  • 原文地址:https://www.cnblogs.com/mophee/p/2997580.html
Copyright © 2011-2022 走看看