Oracle 没有查询数据,但是视图中有

程序在调用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;
复制代码

 经了解应该是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())
                {
                     ……
                }
             }
复制代码

 

最终查询注册表中的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 ");
 

 

// 数据库操作
_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 ");

 

需要注意的是: 第二、三种利用函数进行设置环境变量的操作必须在数据库操作的外边才能生效。

 

 

参考文章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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值