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