Oracle數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)的存儲(chǔ)過(guò)程示例
>>從一個(gè)表A的取得數(shù)據(jù)插入另一個(gè)表B中?
(1)對(duì)于表A和表B兩個(gè)表結(jié)構(gòu)完全相同的話(huà)〔字段個(gè)數(shù),相應(yīng)字段的類(lèi)型等等〕,可以使用
INSERT INTO B SELECT * FROM A;
INSERT INTO B(field1,field2,field3) select A.field1,A.field2,A.field3 from A;
(2) 對(duì)于兩個(gè)表如果字段數(shù)不一樣,但是有幾個(gè)字段的結(jié)構(gòu)一樣時(shí)〔類(lèi)似于父子關(guān)系〕,必須使用 INSERT INTO B(field1,field2) select A.field1,A.field2 from A;
1.用帶參數(shù)的游標(biāo)實(shí)現(xiàn)insert功能:
CREATE OR REPLACE PROCEDURE GET_DATA(
-- 參數(shù)列表:
n_task_id IN number, --任務(wù)編號(hào)
v_task_name IN varchar2, --任務(wù)名稱(chēng)
v_name IN varchar2 -- 名稱(chēng)
)
-----------------------------------------------
-- PROCEDURE名 :GET_DATA --
-- 処理內(nèi)容 :從數(shù)據(jù)源表取得符合條件的的數(shù)據(jù)插入到目標(biāo)數(shù)據(jù)表: --
-- 引數(shù) :n_tas_id 任務(wù)ID, --
-- v_task_namek 任務(wù)名稱(chēng), --
-- v_bdw_name 對(duì)數(shù)據(jù)源表限制條件:本地網(wǎng)名稱(chēng) --
-----------------------------------------------
IS
--插入行數(shù)控制
i_count number(5);
--取數(shù)據(jù)游標(biāo):DATA_CUR(IN_NAME)
--參數(shù):本地網(wǎng)名稱(chēng):IN_NAME
CURSOR DATA_CUR(IN_NAME VARCHAR2) IS /**注意:參數(shù)的定義中不帶精度**/
SELECT *
FROM GET_DATA_SRC A
WHERE A.NAME = IN_NAME;
BEGIN
--計(jì)數(shù)器,控制插入行數(shù)
i_count := 0;
--循環(huán)插入數(shù)據(jù)
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
);
--程序試用階段,以后會(huì)刪除satrt
i_count := i_count + 1;
IF i_count >100 THEN
COMMIT;
RETURN;
END IF;
--程序試用階段,以后會(huì)刪除end
END LOOP;
--數(shù)據(jù)commit,程序調(diào)試階段避免大量數(shù)據(jù),暫時(shí)關(guān)閉
--commit;
--------例外處理部分----------------------------
EXCEPTION
WHEN OTHERS THEN
rollback;
END SRBZ_GET_SRBZ_KD_SPEED;
/
2.使用語(yǔ)句拼接法實(shí)現(xiàn)insert功能:
注:2.1字符串常量的引號(hào) 2.2 變量的引號(hào)
CREATE OR REPLACE PROCEDURE ABC(
-- 參數(shù)列表:
task_id IN number, --任務(wù)編號(hào)
task_name IN varchar2, --任務(wù)名稱(chēng)
in_NAME IN varchar2 --名稱(chēng)
)
--------------------------- PROCEDURE名 :ABC
-- 処理內(nèi)容 :從數(shù)據(jù)源表取得符合條件的的數(shù)據(jù)插入到目標(biāo)數(shù)據(jù)表
-- 引數(shù) :table_src 數(shù)據(jù)源表
-- table_to 數(shù)據(jù)插入目標(biāo)表
-- in_bdw_name 對(duì)數(shù)據(jù)源表限制條件:本地網(wǎng)名稱(chēng)
---------------------------------------------
IS
--INSERT_STRING 動(dòng)態(tài)生成的insert語(yǔ)句存放處
INSERT_STRING VARCHAR2(1000);
--數(shù)據(jù)源表存放處
tableSrc varchar2(500);
--數(shù)據(jù)插入目標(biāo)表存放處
tableTarget varchar2(1000);
--數(shù)據(jù)目標(biāo)表需要插入值的字段存放處
StrFields varchar2(1000);
BEGIN
--數(shù)據(jù)源表為:AAA
tableTarget := ' BBB ';
--數(shù)據(jù)來(lái)源
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語(yǔ)句
INSERT_STRING := 'INSERT INTO ' || tableTarget || StrFields || tableSrc ;
--執(zhí)行insert語(yǔ)句
execute immediate INSERT_STRING;
--提交事務(wù)
commit;
--------例外處理部分-------------------------------------------------------
EXCEPTION
--異常的拋出
WHEN OTHERS THEN
--DBMS_OUTPUT.PUT_LINE('處理過(guò)程中出錯(cuò),程序退出,未執(zhí)行相關(guān)內(nèi)務(wù)');
rollback;
END SRBZ_GET_SRBZ_KD_GSVPDN_FREE;
/
