oracle存储过程特点,Oracle数据库中获取数据的存储过程有何特点?

本文介绍了如何在数据库中进行数据迁移,包括当表结构完全相同和不同时的插入方法。提供了两种实现方式:一是使用带参数的游标进行数据插入,二是通过动态SQL语句拼接实现。这两种方法都在循环中处理数据,并在达到一定数量时提交事务,以确保数据的一致性。
摘要由CSDN通过智能技术生成

从一个表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;

/。

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值