以 csv 檔案形式輸出 ORACLE 資料庫 sql 查詢結果
阿新 • • 發佈:2020-11-06
下面是工作中的一個例項。任務需求是查詢幾個相關資料表,然後把結果輸出為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 ||','||
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_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自己就提供了很多方便工具。本著越簡單越好的原則就上面的方法解決了問題。在工作中充分發掘基礎工具的功能來完成任務可以減少很多麻煩。