服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

oracle数据库中获取数据的存储过程示例

【赛迪网-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;

扫描关注微信公众号