【赛迪网-it技术报道】>>从一个表a的取得数据插入另一个表b中?
(1)对于表a和表b两个表结构完全相同的话〔字段个数,相应字段的类型等等〕,可以使用
insert into b select * from a;
insert into b(field1,field2,field3) select a.field1,a.field2,a.field3 from a;
(2) 对于两个表如果字段数不一样,但是有几个字段的结构一样时〔类似于父子关系〕,必须使用 insert into b(field1,field2) select a.field1,a.field2 from a;
1.用带参数的游标实现insert功能:
create or replace procedure get_data(
-- 参数列表:
n_task_id in number, --任务编号
v_task_name in varchar2, --任务名称
v_name in varchar2 -- 名称
)
-----------------------------------------------
-- procedure名 :get_data --
-- ?理内容 :从数据源表取得符合条件的的数据插入到目标数据表: --
-- 引数 :n_tas_id 任务id, --
-- v_task_namek 任务名称, --
-- v_bdw_name 对数据源表限制条件:本地网名称 --
-----------------------------------------------
is
--插入行数控制
i_count number(5);
--取数据游标:data_cur(in_name)
--参数:本地网名称:in_name
cursor data_cur(in_name varchar2) is /**注意:参数的定义中不带精度**/
select *
from get_data_src a
where a.name = in_name;
begin
--计数器,控制插入行数
i_count := 0;
--循环插入数据
for mycur in data_cur(v_name) loop
insert into abc(
row_id,
task_id,
task_name,
get_data_dt,
cust_id,
assign_flag,
deal_date
)values(
seq_kd.nextval,
n_task_id,
v_task_name,
sysdate,
mycur.cust_id,
'n',
null
);
--程序试用阶段,以后会删除satrt
i_count := i_count + 1;
if i_count >100 then
commit;
return;
end if;
--程序试用阶段,以后会删除end
end loop;
--数据commit,程序调试阶段避免大量数据,暂时关闭
--commit;
--------例外处理部分----------------------------
exception
when others then
rollback;
end srbz_get_srbz_kd_speed;
/
2.使用语句拼接法实现insert功能:
注:2.1字符串常量的引号 2.2 变量的引号
create or replace procedure abc(
-- 参数列表:
task_id in number, --任务编号
task_name in varchar2, --任务名称
in_name in varchar2 --名称
)
--------------------------- procedure名 :abc
-- ?理内容 :从数据源表取得符合条件的的数据插入到目标数据表
-- 引数 :table_src 数据源表
-- table_to 数据插入目标表
-- in_bdw_name 对数据源表限制条件:本地网名称
---------------------------------------------
is
--insert_string 动态生成的insert语句存放处
insert_string varchar2(1000);
--数据源表存放处
tablesrc varchar2(500);
--数据插入目标表存放处
tabletarget varchar2(1000);
--数据目标表需要插入值的字段存放处
strfields varchar2(1000);
begin
--数据源表为:aaa
tabletarget := ' bbb ';
--数据来源
tablesrc := ' select seq_kd.nextval,sysdate,'||task_id||','''||task_name||''', '
||'a.* from aaa a'
||' where a.value='||'''ip-vpdn'''
||'and a.remark is null';
--需要插入的字段
strfields := '(row_id,get_data_dt,task_id,task_name,cost_ctr,service_id,'
||'si_addr,si_server_id)';
--生成insert语句
insert_string := 'insert into ' || tabletarget || strfields || tablesrc ;
--执行insert语句
execute immediate insert_string;
--提交事务
commit;
--------例外处理部分-------------------------------------------------------
exception
--异常的抛出
when others then
--dbms_output.put_line('处理过程中出错,程序退出,未执行相关内务');
rollback;
end srbz_get_srbz_kd_gsvpdn_free;
闽公网安备 35060202000074号