| 導購 | 订阅 | 在线投稿
分享
 
 
 

Oracle數據庫中獲取數據的存儲過程示例

2008-08-06 07:16:30  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

>>從一個表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;

/

>>從一個表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; /
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有