Oracle存储过程中的Unicode

时间:2011-07-05 05:52:39

标签: stored-procedures unicode oracle10g

create or replace PROCEDURE SP_GETINCOMEENTRY
( idec IN NUMBER := 1
, p_IncomeID     tbl_income.incomeid%type      := 1
, P_Data     Out Sys_Refcursor
, P_Fromdate     tbl_acc_income.Dateeng%Type   := null
, P_ToDate       tbl_acc_income.Entrydate%type := null
)  
is
begin    
  if idec=1
  then
    open p_DATA 
    for 
    SELECT INCOMEID as ID
    ,      INCOMENAME as Name 
    FROM   TBL_INCOME 
    order 
    by     p_IncomeID
    ;
  else 
    if Idec=2
    then
      OPEN P_DATA 
      FOR 
      Select Incomeid As id
      ,      Billno As "¿¿¿ ¿¿"
      ,      Relatedperson As "AccountHolder"
      ,      Incomesourid As "IncomeID"
      ,      Dateeng As"EnglishDate"
      ,      Remarks As "Remarks"
      ,      Amount As "Amount"
      ,      Username As "UserName"
      ,      Entrydate As "EntryDate" 
      from   Tbl_Acc_Income 
      where  Tbl_Acc_Income.dateeng between P_Fromdate and P_Todate 
      order 
      by     INCOMEID
      ;
    end if;
  end if;
end;

BillNo As "¿¿¿ ¿¿",是NEPALI中的unicode,但oracle在尝试显示在DataGrid C#中的标题时未返回“¿¿¿¿¿

所以请帮助。

1 个答案:

答案 0 :(得分:0)

Oracle支持在列名中使用Unicode。并且列出的构造已知可行。但是,有几个地方出了问题。在荷兰生活并在Oracle中使用许多外语,由于使用了Unicode,因此在应用程序或Oracle内核中遇到另一个错误总是很高兴。在Oracle 11.2中,大多数Unicode问题终于得到了解决。

请检查以下可能原因:

数据库UNICODE?

您的数据库是AL32UTF吗?使用select value from v$nls_parameters where name='NLS_CHARACTERSET'

客户端和服务器之间不需要的转换

这是你可能的原因。

您的客户端是否已正确配置并使用所需的设置?

由于C#支持与Oracle几乎相同的Unicode,因此请始终使用类似“DUTCH_THE NETHERLANDS.AL32UTF8”的内容作为客户端的字符集,例如使用NLS_LANG。可以在manual of one of our software packages中找到更多说明。

否则,Oracle会将值范围内的字符转换为“?”之类的字符。请注意,只有当双方的角色不同时才会进行角色转换。如果它们都不正确但相同,Oracle将不会注意到并且只转换所有字符二进制而不进行转换。

请更新您的问题以反映返回的内容,而不是倒置的问号。

此转换适用于所有数据,列名称或列内容。

您是否可以更新您的问题是否显示US7ASCII范围之外的列内容也不正确?

客户端代码

大部分客户端软件尚未使用UNICODE字符进行测试。使SQL应用程序崩溃的最简单方法通常是引入混合大小写列名称或UNICODE列名称。由于您的客户端代码是C#,并且您可能正在使用ODP.NET进行连接,因此在您的情况下这应该不是问题。

目前,请检查您是否正在运行ODP.NET。

分布式数据库

除了客户端/服务器字符集转换之外,Oracle分布式数据库还会引入额外的问题。有一些错误涉及。如果您使用分布式数据库,请更新问题。