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是指令碼過程,流程關鍵字必備
第二步:開始寫入指令碼正文
BEGINfhandle := 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;