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

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

需求场景:
现有如下表格

7786310-5dd8cc20e0a96126.png
申请表

其中的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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值