oracle把一列更新为空,ORA-01439:要更改数据类型,则要修改的列必须为空

在Oracle修改user表字段name类型时遇到报错:“ORA-01439:要更改数据类型,则要修改的列必须为空”,是因为要修改字段的新类型和原来的类型不兼容。

如果要修改的字段数据为空时,则不会报这种类型的错误,可以进行字段类型的修改。

alter table user modify (name varchar2(20));

要修改字段的新类型和原来的类型不兼容时,可以通过如下方式解决该问题:

1、修改原字段名name为临时字段name_new;

alter table user rename column name to name_new ;

2、添加一个新字段名称和原来字段名相同,name,类型为要修改的新类型;

alter table user add(name varcher2(50));

3、把临时字段name_new的数据更新到新添加的字段name中;

update user set name = trim(name_new);

4、删除临时字段name_new;

alter table user drop column name_new ;

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

此方法有3处update操作,建议根据实际情况的数据量测试评估效率后选用。

思路:定义要更新数据类型的列为[col_old],数据类型为[datatype_old],临时列为[col_temp],数据类型也为[datatype_old]。

根据[col_old],给表添加[col_temp],将[col_old]的数据赋值给[col_temp],再将[col_old]的数据清空,修改[col_old]的数据类型为[datatype_new],然后再将[col_temp]的数据赋值给[col_old],最后删除[col_temp]。

下面以将一张表某列的数据类型由 varchar2(64) 修改为 number为例,给出通用参考脚本。

1.定义变量并赋值

define table_name = 表名

define col_temp = 列名_temp

define col_old = 列名

define datatype_old = varchar2(64)

define datatype_new = number

2.执行脚本

prompt 1.alter table &table_name add &col_temp &datatype_old;

alter table &table_name add &col_temp &datatype_old;

prompt 2.update &table_name set &col_temp = &col_old;

update &table_name set &col_temp = &col_old;

commit;

prompt 3.update &table_name set &col_old = null;

update &table_name set &col_old = null;

commit;

prompt 4.alter table &table_name modify &col_old &datatype_new;

alter table &table_name modify &col_old &datatype_new;

prompt 5.update &table_name set &col_old = &col_temp;

update &table_name set &col_old = &col_temp;

commit;

prompt 6.alter table &table_name drop column &col_temp;

alter table &table_name drop column &col_temp;

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "lrd.h" static LRD_INIT_INFO InitInfo={LRD_INIT_INFO_EYECAT}; static LRD_DEFAULT_DB_VERSION DBTypeVersion[]={{LRD_DBTYPE_NONE,LRD_DBVERSION_NONE}}; //这里的LRD_VAR_DESC数据结构声明是很重要的,他是用来存储sql结果数据集的结构体,第一个参数头文件中就是这么写的,第二个参数是最大行数,第三个参数是每一行的最大长度,如果获得的查询结果比定义的长,运行时就会报错,提示被截断,最后一个参数是查询结果的类型,可以再帮助中的索引输入data types, database,出的表格中是各种变量类型的名称 static LRD_VAR_DESC NUM ={LRD_VAR_DESC_EYECAT, 10, 32, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_LONG_VARCHAR}; //下面这些句柄等变量的申请都可以照着帮助中的例子写 /***************** 这里省略了,具体见附件 */ Action() { lrd_ora8_stmt(OraStm1,"select service_num from auto_zb_provision where rownum<2",1,0,0); //执行定义的sql,并且将结果行数返回到rownum中 lrd_ora8_exec(OraSvc1,OraStm1,0,0,&rownum;,0,0,0,0,1); //绑定该 lrd_ora8_bind_col(OraStm1,&OraDef1;,1,&NUM;,0,0); //设定保存中的某个数据到row中,第二个参数为第几,第三个参数为第几行(只能保存一个值),最后一个参数就是你想要保存到的parameter名称 lrd_ora8_save_col(OraStm1, 1, 1, 0, "result"); //这个遍历刚才查询的结果,第二个参数0表示就1行,负号表示遍历所有结果,绝对值表示实际有多少行,第三个参数表示一次遍历最大进行多少行(不能大于LRD_VAR_DESC中定义的第二个参数,即最大行数)
Oracle SQL Hand-Oracle工具,是专为Oracle数据库开发人员及操作人员精心打造的一款Oracle开发工具(客户端工具)。 Oracle SQL Hand-Oracle工具特点如下: (1) 跨平台,能运行于平台 Windows(WIN7,XP...)、Linux 、Mac OS; (2) 不需要安装Oracle客户端,解压即用,通过提供的JDBC直接连接服务器; (3) 超智能的SQL编辑器,具有代码跟踪提示功能,弹出提示窗口出关键字、关键字组合、函数名、名、对象名、对象类型等,极大地提高SQL编辑效率; (4) 超方便实用的工作表用来显示和操作SELECT语句的查询结果,象操作Excel表格一样方便地选择行//单元格数据,可以将工作表的数据修改写入数据库表。另外,工作表还有单条记录操作、多功能拷贝、数值统计、查找替换等实用功能; (5) 能方便导出 XLS、CSV、INSERT Statement、HTML、XML等多种格式数据; (6) 方便操作常用数据字典如表、视图、索引、过程、函数、触发器等(能显示和编辑编译PL/SQL代码); (7) 中英文双语界面并能随时切换,个性化界面设置,界面简洁清爽; (8) 运行语句“DESC tableName”清晰地显示表的所有逻辑结构信息,包括信息、所有约束、索引、子表及触发器等; (9) 运行语句“SCHEMA objectName”显示表或视图的DDL源码; (10) 以缩进的阶梯格式清晰地显示SQL的解释计划; (11) 能运行和调试PL/SQL语句,能精确定位到错误所在的行位置; (12) SQL格式美化,将杂乱的语句美化成缩进的美观格式; (13) 多线程多连接,会话在运行中可以中断,或编辑,或创建新会话; (14) 监控批量SQL语句的运行,在运行中可暂停、更正等; (15) 连接配置简单,自动重新连接; (16) 占用系统资源极少,启动快,连接快,运行快; (17) 高效的语句块操作,高亮显示配对括号; (18) 功能实用,操作简便; 鼠标双击批处理文件 start.bat 即可启动运行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值