ORACLE|ORACLE 修改表中一列值名称及类型+date类型数据转为number

原创:转载请注明原地址。不足之处,欢迎各路大神批评指正,若有更好方法,欢迎提出来一起讨论,鞠躬。

需求场景:
现有如下表格

ORACLE|ORACLE 修改表中一列值名称及类型+date类型数据转为number
文章图片
申请表
其中的registdate字段(类型为number)原始名称为registerdate,原始类型为date,形式为2017/10/26 15:14:53,经过下述pl/sql代码将其进行转换为如图示结果。
注意:在pl/sql代码块中执行dml语句需用动态sql,否则报ORA-06550错误
执行步骤 1、将原有表中registerdate字段和application_id存入一张新建的临时表temp_registerdate中
create table temp_registerdate as select application_id id,registerdate from dus_applications;
2、修改dus_applications中registerdate字段名及类型
update dus_applications t set t.registerdate = null; --将列中值改为空alter table dus_applicationsrename column registerdate to registdate; --改名称alter table dus_applicationsmodify(registdate number); --改类型commit;

【ORACLE|ORACLE 修改表中一列值名称及类型+date类型数据转为number】3、用转换为number的temp_regiserdate中的值替换修改后的dus_applications中对应列registdate中的值
declare cursor cur1 is select application_id from dus_applications; v_registerdate varchar(20); v_update varchar(500); v_drop varchar(200):='drop table temp_registerdate'; begin for row1 in cur1 loop select to_char(temp.registerdate,'yyyymmdd hh24:mi:ss') into v_registerdate from temp_registerdate temp where temp.id = row1.application_id; v_update:='update dus_applications t set t.registdate=(to_number(to_date('''||v_registerdate||''',''YYYY-MM-DD HH24:MI:SS'')-TO_DATE(''1970-01-01 8:0:0'', ''YYYY-MM-DD HH24:MI:SS''))* 24 * 60 * 60 * 1000)'; dbms_output.put_line(v_registerdate); dbms_output.put_line(v_update); execute immediate v_update; commit; end loop; execute immediate v_drop; commit; end;

    推荐阅读