Oracle ORA-22908(NULL表值的参考)异常分析与解决方法_oracle

场景如下:

--创建类型(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 对象。

 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索oracle
, ORA-22908
NULL表值
ora 01400无法将null、oracle isnull函数、oracle isnull、oracle null、oracle null 变成0,以便于您获取更多的相关知识。

时间: 2024-10-26 16:46:22

Oracle ORA-22908(NULL表值的参考)异常分析与解决方法_oracle的相关文章

ORACLE EXP不能导出空表的原因分析及解决方法_oracle

一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_segment_creat

oracle修改SGA后无法启动问题分析及解决方法_oracle

1.若数据库机器上没有装Console或者没有使用Console配置网络服务名. 则可以通过命令sqlplus sys/sys as sysdba 登录到服务器空闲进程.看第四步. 2.如果配置了网络服务名,则 在路径D:\oracle\product\10.2.0\db_1\network\admin\listener.o ra下 找到listener.ora. 修改为: 复制代码 代码如下: # listener.ora Network Configuration File: D:\orac

11g Oracle导出表不导出数据默认为空表的解决方法_oracle

11g oracle导出表时会默认不导出数据为空 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_

使用geotools导入shp文件到Oracle数据库时表名带下划线问题的解决方法_oracle

问题: 最近在做利用geotools导入shp文件到Oracle表中,发现一个问题Oracle表名带下划线时导入失败,问题代码行: dsOracle.getFeatureWriterAppend(oracleTable, Transaction.AUTO_COMMIT); dsOracle为org.geotools.data.DataStore类型对象 解决方案: 网上查阅资料发现是Oracle11的java包ojdbc的版本问题,maven中搜索ojdbc发现最新版如下图 pom配置: <!-

Android Force Close 出现的异常原因分析及解决方法_Android

一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

plsql连接oracle数据库报ora 12154错误解决方法_oracle

plsql连接oracle数据库报ora 12154错误 今天遇到一个问题,使用sqlplus能够连接到远程的数据库,但是使用plsql却连接不上,报错"ORA-12154: TNS: 无法解析指定的连接标识符" 解决方法如下: 1.先检查服务器端的监听服务是否打开,如果没有打开请启动其监听 客户端:tnsping <tns_name> 服务器Linux下: #>lsnrctl status 查看监听状态 #>lsnrctl start 启动监听 2.通过Sql

Oracle监听器服务不能启动的解决方法_oracle

Oracle监听器服务不启动的时候可采取以下措施予以解决: 一.连接主机字符串,提示没有监听器 SVRMGR> connect internal/oracle@orcl: ORA-12541: TNS:no listener SVRMGR> 二.运行监听器,提示地址的协议专用组件指定不正确 在开始菜单运行中键入lsnrctl LSNRCTL for 32-bit Windows: Version 9.0.1.1.1 - Production on 08-6月 -2006 14:31:53 Co

Java ConcurrentModificationException异常原因和解决方法

在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不正之处请多多谅解,并欢迎批评指正 请尊重作者劳动成果,转载请标明原文链接: http://w

Oracle出现超出打开游标最大数的解决方法_oracle

本文实例讲述了Oracle出现超出打开游标最大数的解决方法.分享给大家供大家参考,具体如下: Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor.尤其是,假如你的createStatement和prepareStatement是在一个循环里面的话,就会非常轻易出现这个问题.因为游标一直在不停的打开,而且没有关闭. 一般来说,我们在写Java代码的时候,createStatement