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

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

需求场景:
现有如下表格

ORACLE 修改表中一列值名称及类型+date类型数据转为number_第1张图片
申请表

其中的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_applications  rename column registerdate to registdate;--改名称

alter table dus_applications  modify(registdate number);--改类型

commit;

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;

你可能感兴趣的:(ORACLE 修改表中一列值名称及类型+date类型数据转为number)