原创:转载请注明原地址。不足之处,欢迎各路大神批评指正,若有更好方法,欢迎提出来一起讨论,鞠躬。
需求场景:
现有如下表格
申请表
其中的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;