1. 程式人生 > 資料庫 >以 csv 檔案形式輸出 ORACLE 資料庫 sql 查詢結果

以 csv 檔案形式輸出 ORACLE 資料庫 sql 查詢結果

下面是工作中的一個例項。任務需求是查詢幾個相關資料表,然後把結果輸出為csv檔案。

1.先寫一個sql檔案,如果是在windows環境下執行要用ansi內碼存檔。檔案框架如下:
SET feedback off  
SET pagesize 50000  
SET linesize 20000  
SET verify off  
SET pagesize 0  
SET term off  
SET trims ON  
SET heading off  
SET trimspool ON  
SET trimout ON  
SET timing off  
SET verify off  
SET colsep  

spool C:\Users\Administrator\Desktop\result.csv


--需要執行的sql語句寫在這裡。

spool off

quit

2.形成表頭的sql語句
csv檔案欄位之間用逗號分隔,所以下面這句用來形成表頭:
select '品名,規格,單位,有效期,數量,整件數量,零頭數量' from dual;

3.查詢結果欄位之間用  ||','|| 這個形式分隔:
SELECT a.TRADE_NAME ||','|| a.SPECS ||','|| a.PACK_UNIT ||','|| b.VALID_DATE ||','|| b.STORE_SUM / b.pack_qty ||','||
CASE WHEN (select pkg_num from drug_packages where drug_name=a.TRADE_NAME) is null THEN 0 ELSE floor((b.STORE_SUM / b.pack_qty) / (select pkg_num from drug_packages where drug_name=b.TRADE_NAME)) END ||','||
CASE WHEN (select pkg_num from drug_packages where drug_name=a.TRADE_NAME) is null THEN (b.STORE_SUM / b.pack_qty) ELSE mod((b.STORE_SUM / b.pack_qty) ,(select pkg_num from drug_packages
where drug_name=a.TRADE_NAME)) END AS qty
FROM PHA_COM_BASEINFO a , PHA_COM_STOCKINFO b WHERE a.DRUG_CODE = b.DRUG_CODE  
and b.DRUG_DEPT_CODE = '0039'
and b.drug_code in (select DISTINCT DRUG_CODE from PHA_COM_APPLYOUT WHERE trunc(apply_date) = trunc(sysdate) AND DRUG_DEPT_CODE = '0039')
AND (b.DRUG_QUALITY = 'ALL' OR 'ALL' = 'ALL')
ORDER BY a.drug_type, a.CUSTOM_CODE ;

4.case when end 結構的使用
這個查詢有兩個欄位是計算出來的。為便於清點,需要根據庫存數量計算出庫存一共有多少整件,多數零頭。
計算欄位先要查詢些該品種是否在整件包裝規格的表內,如果在,取出數值進行計算然後顯示,不在則直接顯示。計算零頭數語句如下:
CASE
  WHEN (select pkg_num from drug_packages where drug_name=a.TRADE_NAME) is null
  THEN (b.STORE_SUM / b.pack_qty)
  ELSE mod((b.STORE_SUM / b.pack_qty) ,(select pkg_num from drug_packages where drug_name=a.TRADE_NAME))
END

5.其它需要注意的地方
spool後面似乎只能用絕對路徑。相對路徑不好使。
寫好sql之後可以再寫一個bat檔案讓這些東西在系統環境下直接呼叫。
這裡寫了一個 calc.bat ,內容如下:
sqlplus user/password@orcl @dev_tools\count.sql
直接執行這個批處理檔案,結果就spool指定的位置生成好了。

6.總結
起初這個任務想用python或者C++來寫,但後來發現oracle自己就提供了很多方便工具。本著越簡單越好的原則就上面的方法解決了問題。在工作中充分發掘基礎工具的功能來完成任務可以減少很多麻煩。