Oracle數據庫中獲取數據的存儲過程示例
>>從一個表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;
/
