Oracle复制表和存储过程编写注意事项

  1. Oracle中复制表或者复制表结构

1. 复制表结构及其数据:

create table table_name_new as select * from table_name_old

2. 只复制表结构(后面加where条件)

create table table_name_new as select * from table_name_old where 1=0;

或者:

create table table_name_new like table_name_old

3. 只复制表数据:

如果两个表结构一样:

insert into table_name_new select * from table_name_old

如果两个表结构不一样:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

  1. 编写存储过程一些注意细节和技巧
  1. 给存储过程变量赋值
    1. 定义一个变量: v_temp_hour varchar2(20);
    2. 给变量赋值:

      方式一:v_temp_hour:='21';

      方式二:select to_char(sysdate,'hh24') into v_temp_hour from dual;

说明:方式一是直接给字符串变量赋值,方式二是通过查询sql给变量赋值

 

  1. 存储过程中执行存在变量的sql语句

注意:需要使用 execute immediate 执行sql

 

 

  1. 存储过程中变量拼接使用'||',判断两个字符串是否相等用'='
  2. 存储过程中sql 中单引号转义,再加一个单引号,如下

  3. 存储过程中使用逻辑判断

     

    注意:

    if 条件 then

         逻辑处理

    elsif 条件 then

    逻辑处理

    elsif 条件 then

    逻辑处理

    else

    逻辑处理

    end if;

     

    6、存储过程实例

CREATE OR REPLACE PROCEDURE from_celltemp_to_cell IS

v_temp_hour varchar2(20);

v_temp_week varchar2(20);

v_table_name_hour varchar2(50);

v_table_name_week varchar2(50);

v_cell_max_time varchar2(20);

v_sysdate_time varchar2(20);

v_sql varchar2(200);

v_insert_cell_sql varchar2(2000);

v_truncate_cell_sql varchar2(1000);

v_truncate_cell_temp_sql varchar2(2000);

BEGIN

-- 查询当前系统时间,获得小时

select to_char(sysdate,'hh24') into v_temp_hour from dual;

-- 根据小时判断迁移哪张分区表

if v_temp_hour='00' or v_temp_hour='01' or v_temp_hour='02' or v_temp_hour='03' then

v_table_name_hour := 'M_CELL_TEMP_part20_23';

elsif v_temp_hour='04' or v_temp_hour='05' or v_temp_hour='06' or v_temp_hour='07' then

v_table_name_hour := 'M_CELL_TEMP_part00_03';

elsif v_temp_hour='08' or v_temp_hour='09' or v_temp_hour='10' or v_temp_hour='11' then

v_table_name_hour := 'M_CELL_TEMP_part04_07';

elsif v_temp_hour='12' or v_temp_hour='13' or v_temp_hour='14' or v_temp_hour='15' then

v_table_name_hour := 'M_CELL_TEMP_part08_11';

elsif v_temp_hour='16' or v_temp_hour='17' or v_temp_hour='18' or v_temp_hour='19' then

v_table_name_hour := 'M_CELL_TEMP_part12_15';

elsif v_temp_hour='20' or v_temp_hour='21' or v_temp_hour='22' or v_temp_hour='23' then

v_table_name_hour := 'M_CELL_TEMP_part16_19';

else

dbms_output.put_line('error!');

end if;

 

-- 查询当前系统时间,获得星期几

select replace(to_char(sysdate,'day','nls_date_language=american'),' ','') into v_temp_week from dual;

-- 根据星期几判断删除哪张分区表

if v_temp_week='monday' then

v_table_name_week := 'M_CELL_total_mon';

elsif v_temp_week='tuesday' then

v_table_name_week := 'M_CELL_total_tue';

elsif v_temp_week='wednesday' then

v_table_name_week := 'M_CELL_total_wed';

elsif v_temp_week='thursday' then

v_table_name_week := 'M_CELL_total_thu';

elsif v_temp_week='friday' then

v_table_name_week := 'M_CELL_total_fri';

elsif v_temp_week='saturday' then

v_table_name_week := 'M_CELL_total_sat';

elsif v_temp_week='sunday' then

v_table_name_week := 'M_CELL_total_sun';

else

dbms_output.put_line('error!');

end if;

 

-- 查看cell表某个分区的日期是否是上周数据

--cell表最大时间

v_sql:='select to_char(max(createtime),''yyyy-mm-dd'') from m_cell partition('||v_table_name_week||')';

EXECUTE IMMEDIATE v_sql into v_cell_max_time ;

--系统时间

select to_char(sysdate,'yyyy-mm-dd') into v_sysdate_time from dual;

 

if v_cell_max_time is not null and v_cell_max_time!=v_sysdate_time then

-- 删除cell表中的某一个分区的数据

v_truncate_cell_sql:='ALTER TABLE m_cell TRUNCATE PARTITION '||v_table_name_week;

EXECUTE IMMEDIATE v_truncate_cell_sql;

end if;

-- cell表中迁移数据

v_insert_cell_sql:='insert into m_cell

(ttime, service_type, ne_name, lac, ci, noservicetime, old_value, current_value, nosignaltime, old_rejtimes, old_successtimes, old_successrate, rejtimes, successtimes, successrate, monitor_notes, param_extral, createtime, id, state_type, monitor_type, confirm_time, cancel_time, keyvalue)

select ttime, service_type, ne_name, lac, ci, noservicetime, old_value, current_value, nosignaltime, old_rejtimes, old_successtimes, old_successrate, rejtimes, successtimes, successrate, monitor_notes, param_extral, createtime, sys_guid(), state_type, monitor_type, confirm_time, cancel_time,

replace(to_char(createtime,''day'',''nls_date_language=american''),'' '','''')

from m_cell_temp partition('||v_table_name_hour||')';

EXECUTE IMMEDIATE v_insert_cell_sql;

-- 删除cell_temp表中的某一个分区的数据

v_truncate_cell_temp_sql:='ALTER TABLE m_cell_temp TRUNCATE PARTITION '||v_table_name_hour;

EXECUTE IMMEDIATE v_truncate_cell_temp_sql;

commit;

END from_celltemp_to_cell;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间辜负了谁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值