作業環境有個需求: 有一些PL/SQL DDL指令需先匯成sql檔,再透過程式呼叫SQLPlus.exe執行。

SQLPlus.exe可讀入SQL Script檔案直接執行,例如: sqlplus –s user/pwd @script.sql,而透過程式啟動外部EXE也不是問題,一切看似小菜一碟...

BUT! 人生最厲(ㄐㄧ)害(ㄨㄞ)的就是這個BUT!

問題出在SQLPlus在命令提示視窗(Command Prompt)執行,只支援ANSI編碼,而script.sql可能包含Unicode文字,故得用UTF-8編碼。沒想到這小小的編碼要求,最後得五關斬六將方能達成。

先來個簡單測試,用Notepad++新增chinese.sql,存成UTF-8編碼。將Command Prompt設成CodePage 65001,type chinese.sql可以看到"SELECT '中文測試' FROM DUAL;",驗證是UTF-8無誤。呼叫sqlplus執行,出現unknown command beginning錯誤,而SELECT指令前方有一個無法識別字元,推測是BOM作祟。

利用Notepad++將檔案轉存為"UTF-8 without BOM"。(此時下方的編碼顯示會由UTF-8變成"ANSI as UTF-8")

再執行一次,看來執行成功,sqlplus該呈現的中文全變成"?"是怎麼一回事? 在網路找到文章,提到設NLS_LANG及使用SPOOL將結果輸出到檔案的技巧,改寫成spool.sql,終於成功繞過sqplus受限ANSI編碼的限制,在result.txt取得正確執行結果:

如果.sql中包含Unicode難字,則要使用N'…'以及ORA_NCHAR_LITERAL_REPLACE環境變數,一樣能克敵致勝:

最後,除了靠SPOOL,SQLPlus真的沒法讀取UTF-8直接顯示中文嗎? 先前參考的文章提過一招密技,使用PowerShell ISE... 娘子啊,跟牛魔王出來看中文:

【參考資料】


Comments

# by joe

感謝分享, it works

Post a comment