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;
  /