1. 程式人生 > >Oracle儲存過程例項入門分享講解

Oracle儲存過程例項入門分享講解

上一篇我們已經介紹瞭如何通過ODBC匯入表資料ODBC匯入資料,本文則通過匯入的這張表分享一下儲存過程入門

儲存過程和函式的區別就是,函式只能即用即配,適合簡短配置的,但不適合批量操作和後臺寫入等,這是我對儲存過程的簡單理解,我認為Oracle儲存過程和函式就類似於java,python等面嚮物件語言的類和函式

我們要處理一批表資料,把excel裡的資料根據表名寫成一個個的sql指令碼,實現這個過程其實很簡單,用shell,java的io,oracle的函式等等都可以,但本文用一個更能體現逼格的方法:儲存過程來寫,拿一張表來舉例

這是表的資料,懶得截圖了,用的上一個部落格的圖,但資料還是這個資料


我們要讀取這個表TB2實現成這樣的指令碼

INSERT OVERWRITE TABLE OWNER1.TABLE1 PARTITION ( rfq='#RQ')SELECT  COL1,COL2,...,GETDATE() COLN

  FROM OWNER2.TABLE1 where rfq='#RQ';

現在開始寫儲存過程

首先第一步是宣告變數

DECLARE                --宣告變數的關鍵字
  colname VARCHAR2(500);        --變數以及資料型別
  bzbm    VARCHAR2(300);
  m       number;
  m2      number;
  ybm    VARCHAR2(300);
  fhandle utl_file.file_type;       --fhandle是檔案自定義名,utl_file.file_type是oracleutl_file包檔案的屬性,是關鍵字
  CURSOR C_SAL IS

    SELECT DISTINCT YBM   FROM tb2;    --CURSOR XXX IS  SELECT * FROM TABLE_NAME;   把選擇出來的值賦予XXX

BEGIN                         

...

END    --BEGIN和END是指令碼過程,流程關鍵字必備

第二步:開始寫入指令碼正文

BEGIN
      fhandle := utl_file.fopen('EXP_DIR', 'XXX.sql', 'w',32767);   --:=是賦值,fopen可理解為java的io
  FOR V_SAL IN C_SAL LOOP               --每個語言都有的for迴圈:FOR xxx in yyy LOOP
   SELECT distinct bzbm  INTO bzbm FROM tb2 WHERE YBM = V_SAL.YBM;  --SELECT XXX INTO Y FROM  賦值Y
    utl_file.PUT(fhandle, 'INSERT OVERWRITE TABLE OWNER1.'); --目標主題名,PUT是在這個檔案按順序寫入東西                                                                        
    utl_file.PUT(fhandle, bzbm);
    utl_file.PUT(fhandle, ' PARTITION ( rfq=''20170000'')SELECT  ');


    SELECT max(yxh) into m from tb2 WHERE YBM = V_SAL.YBM;   
    FOR i IN 1 .. m LOOP
     SELECT yzdm       into colname       from tb2       WHERE YBM = V_SAL.YBM         and yxh = i;    
      if i = 1 then
        utl_file.PUT(fhandle, colname);
      else
        utl_file.PUT(fhandle, ',' || colname);
      end if;
    end loop;                        --在儲存過程中每個if判斷和每個loop迴圈都要end,類似於VB語言
    utl_file.new_line( fhandle );      --new_line 增加行終止符,也就是換行的意思
    utl_file.PUT(fhandle, '  FROM OWNER2.');                       ---源主題名  
       SELECT distinct jcztbm  INTO ybm FROM tb2 WHERE YBM = V_SAL.YBM;   
    utl_file.PUT(fhandle, YBM);                                  ---源表名
    utl_file.PUT_LINE(fhandle, ' where rfq=''20170000'';'); --初始化分割槽

  END LOOP;
      utl_file.fclose(fhandle);    --記得fclose檔案
END;

至此一個利用utl_file包寫的儲存過程就搞定了,

fhandle := utl_file.fopen('EXP_DIR', 'XXX.sql', 'w',32767);

這個是把檔案輸出到EXP_DIR資料夾裡,所以在執行該儲存過程之前記得先建立該資料夾,並且賦予許可權,命令如下

create directory exp_dir as 'home/oracle/directory'; --oracle安裝windows環境下可以用d:/directory
grant create any directory to public;