程序在調用Oracle的Package中時Fnd_Request.SUBMIT_REQUEST執行結果始終為零。 Package部分代碼如下。
declare x_request_id
NUMBER;
begin
fnd_global.apps_initialize( 11, 11, 11);
select Fnd_Global. user_id into x_request_id from dual;
dbms_output.put_line(x_request_id);
x_request_id : =
Fnd_Request.SUBMIT_REQUEST(
' xx ', -- 1
' xx ', -- 2
'', -- 3
'', -- 4
FALSE, -- 5
' xx ', -- 6
' xxx ', -- 7
'', -- 8
'', -- 9
' xxxx ', -- 10
' xxx ', -- 11
chr( 0), '', '', '', -- 15
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 35
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 55
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 75
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 95
'', '', '', '', '', '', '', '', '', ''); -- 105
dbms_output.put_line(x_request_id);
end;
begin
fnd_global.apps_initialize( 11, 11, 11);
select Fnd_Global. user_id into x_request_id from dual;
dbms_output.put_line(x_request_id);
x_request_id : =
Fnd_Request.SUBMIT_REQUEST(
' xx ', -- 1
' xx ', -- 2
'', -- 3
'', -- 4
FALSE, -- 5
' xx ', -- 6
' xxx ', -- 7
'', -- 8
'', -- 9
' xxxx ', -- 10
' xxx ', -- 11
chr( 0), '', '', '', -- 15
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 35
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 55
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 75
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -- 95
'', '', '', '', '', '', '', '', '', ''); -- 105
dbms_output.put_line(x_request_id);
end;
經了解應該是NLS_LANG問題。網上找到的在程序設置方法均不行。
//
方法1:不行
// using System.Runtime.InteropServices;
// [DllImport("msvcrt.dll")]
// private static extern int _putenv(string str);
// _putenv("AMERICAN_AMRICA.UTF8");
// 方法2,不行
Environment.SetEnvironmentVariable( " NLS_LANG ", " AMERICAN_AMERICA.UTF8 ");
using (OracleConnection conn = new OracleConnection(connString))
{
conn.Open();
using (OracleTransaction trans = conn.BeginTransaction())
{
……
}
}
// using System.Runtime.InteropServices;
// [DllImport("msvcrt.dll")]
// private static extern int _putenv(string str);
// _putenv("AMERICAN_AMRICA.UTF8");
// 方法2,不行
Environment.SetEnvironmentVariable( " NLS_LANG ", " AMERICAN_AMERICA.UTF8 ");
using (OracleConnection conn = new OracleConnection(connString))
{
conn.Open();
using (OracleTransaction trans = conn.BeginTransaction())
{
……
}
}
最終查詢注冊表中的NLS_LANG鍵,將其修改為:AMERICAN_AMERICA.UTF8解決。
參考文章1:C#寫入Oracle 中文亂碼的解決辦法(http://blog.csdn.net/magina3/article/details/6975312)
主要問題是: oracle客戶端軟件的字符編碼與服務器端的字符編碼不一致造成的。
oracle服務端字符編碼為: ZHS16GBK
oracle客戶端字符編碼為: WE8ISO8859P1
解決辦法有三種:
(1)修改客戶端注冊表: 找到Oracle安裝注冊項下的NLS_LANG,將其值改為"SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(2)通過調用_putenv函數,在程序中用代碼設置:
using System.Runtime.InteropServices;
...
[DllImport( " msvcrt.dll ")]
private static extern int _putenv( string str);
...
_putenv( " NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK ");
...
[DllImport( " msvcrt.dll ")]
private static extern int _putenv( string str);
...
_putenv( " NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK ");
//
數據庫操作
_putenv( " NLS_LANG = AMERICAN_AMRICA.WE8ISO8859P1 ");
_putenv( " NLS_LANG = AMERICAN_AMRICA.WE8ISO8859P1 ");
(3)通過C#自帶的函數設置環境變量
System.Environment.SetEnvironmentVarible(
"
NLS_LANG
",
"
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
");
//
數據庫操作
System.Environment.SetEnvironmentVarible( " NLS_LANG ", " AMERICAN_AMRICA.WE8ISO8859P1 ");
System.Environment.SetEnvironmentVarible( " NLS_LANG ", " AMERICAN_AMRICA.WE8ISO8859P1 ");
需要注意的是: 第二、三種利用函數進行設置環境變量的操作必須在數據庫操作的外邊才能生效。
參考文章2:修改客戶端字符集NLS_LANG(http://www.cnblogs.com/hondahsu/archive/2012/03/20/2407911.html)
在訪問Oracle的客戶端安裝Oracle Client過程中並沒有選項選擇Oracle Client的字符集,安裝完畢后在注冊表HKLOCAL_MACHINE\SOFTWARE\ORACLE\KEY_ORACLECLENT_HOME1\可以找到NLS_LANG鍵,值為當前OS的字符集。如簡體系統為:ZHS16GBK,繁體系統為:MSWIN950。可見,Oracle Client(以下簡稱NLS_LANG)在安裝過程中選擇了OS的字符集作為默認的NLS_LANG字符集。
設定NLS_LANG有三種方法:
a) 修改注冊表:將HKLOCAL_MACHINE\SOFTWARE\ORACLE\KEY_ORACLECLENT_HOME1\下NLS_LANG鍵值改為你要設定的字符集,如將SIMPLIFIED CHINESE_CHINA.ZHS16GBK改為:SIMPLIFIED CHINESE_CHINA.AL32UTF8。這種做法如果無效,即使重新啟動機器后,也沒有生效,NLS_LANG仍使用當初安裝時的OS字符集,就試用第個方法。
b) 設定環境變量:在My Computer->Properties->Advanced->Environment Variables->System Variables 新增環境變量設置,如:Variable name=NLS_LANG,Variable Value= SIMPLIFIED CHINESE_CHINA.AL32UTF8。這樣NLS_LANG字符集為UTF8,這個NLS_LANG優先序高於注冊表中的NLS。注意:環境變量設在系統變量中(System Vairables),而不是用戶變量(User Vairables)。
c) 在應用程序運行的Process Session中設定:在程序運行之前,先通過set NLS_LANG=進程Session的字符集。例如:
Echo %nls_lang%,在這個session中,已經設定NLS_LANG字符集為ZHS16GBK。同樣,你也可以新開一個CMD窗口,設定另一種NLS_LANG字符集。這種在session中設定NLS_LANG的優先序高於系統環境變量NLS_LANG。注冊表NLS_LANG、系統環境變量NLS_LANG、Session NLS_LANG的優先序是:Session NLS_LANG > 系統環境變量NLS_LANG > 注冊表NLS_LANG。