[SQL] Oracle查無資料 (因 SESSION, NLS, AMERICA...因素)
如題,近期公司導入 Oracle,導致程式碼需要調整,卻遇到當前環境查無資料! 但窗口卻說權限有開了,所以紀錄下解決問題的方式。
● 情境:
1. 窗口提供同義詞(Synonyms)
2. 因公司別不同,窗口也提供一個方法切換公司別,假設為 SET_COMPANYID_CONTEXT
● 解決思路:
1. 先詢問窗口他們使用了哪些NLS_PARAMETERS,通常會變的是 NLS_LANGUAGE,因為中文版更新頻率低,所以常使用美國版。
2. 再來就是更新當前環境的NLS_PARAMETERS,確認看看有無資料。
3. 最後就是在程式中提前設定好NLS_PARAMETERS。
Step1: 查看當前環境的 NLS_PARAMETERS
-- 查詢出當前環境的 NLS_PARAMETERS
SELECT * FROM V$NLS_PARAMETERS;
-- 查詢出可使用的 VLS VALUE
SELECT * FROM V$NLS_VALID_VALUES
Step2: 當前環境執行語法,確認是否有資料
ALTER SESSION SET NLS_LANGUAGE='AMERICAN'
Step3: 程式提前設定 NLS_PARAMETERS
重點是要在每個 connection 連接後,提前設定即可。
//...
using (var sessionCommand = connection.CreateCommand())
{
// 修改 NLS_LANGUAGE
sessionCommand.CommandText = "ALTER SESSION SET NLS_LANGUAGE='AMERICAN'";
sessionCommand.ExecuteNonQuery();
// 修改 NLS_DATE_LANGUAGE (假設比對結果有差異就要加上)
sessionCommand.CommandText = "ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'";
sessionCommand.ExecuteNonQuery();
// 修改 COMPANYID 為 代號2
sessionCommand.CommandText = "SELECT {當前使用的DB}.SET_COMPANYID_CONTEXT(2) FROM dual";
sessionCommand.ExecuteNonQuery();
}
//...
留言
張貼留言