使用触发器和视图来实现表格的多语言输出

ZDNet软件频道 时间:2003-06-10 作者:ZDNet China |  我要评论()
本文关键词:oracletips
没有有关的标准化过程,程序开发者们想要开发一个能在多种语言环境下使用的应用程序是非常地困难的。如果可能的话,这些翻译转换过程能在数据库中完成,那么就给开发者们带来了很多便利。
本文译自Builder.com,未经许可请勿转载 没有有关的标准化过程,程序开发者们想要开发一个能在多种语言环境下使用的应用程序是非常地困难的。如果可能的话,这些翻译转换过程能在数据库中完成,那么就给开发者们带来了很多便利,使他们能专注于开发本身的事情了。

例如,假设我们现在有一个国家的列表。其中国家名是依据最终用户的语言不同而不同。在当时没有翻译器的条件下,我们需要根据用户设置的语言来输出国家名,或是用默认的语言—英语来进行输出。

要达到这个目的,我们首先创建一个表格,用我们的基础语言来存储有关这些国家的信息,创建过程如下:

create table base_countries
(
    a2      char(2) not null,
    a3      char(3) not null,
    num     char(3) not null,
    name    varchar2(60) not null,
    constraint base_countries_pk primary key (a2)
);

现在,我们创建了一个转化表格。通常情况下,这个转化表格只需要三个元素,他们是:表的主码,语言代码,以及译文。如果有多列需要转化的话,我们还可以加一个标识符来记载当前列位置。这也需要我们进行对基础表的引用,可参照以下代码:

create table tran_countries
(
    a2      char(2) not null,
    lang    varchar2(2) not null,
    name    varchar2(60) not null,
    constraint tran_countries_pk primary key (a2,lang),
    constraint tran_countries_fk foreign key (a2) references base_countries (a2)
);

然后,我们可以用以下方法在基础表和转换表上用当前指定的语言代码来创建视图,其中的语言代码是在USERENV('LANG')中设置的,创建方法如下:

create or replace view nls_countries as
      select base_countries.a2,
           base_countries.a3,
           base_countries.num,
           nvl(tran_countries.name,base_countries.name) name
      from base_countries,tran_countries
     where base_countries.a2 = tran_countries.a2 (+)
       and userenv('LANG') = tran_countries.lang (+);

或者,我们还可以用Oracle9i的外连接及语法来创建视图,方法如下:

create or replace view nls_countries as
      select base_countries.a2,
           base_countries.a3,
           base_countries.num,
           nvl(tran_countries.name,base_countries.name) name
      from base_countries left outer join tran_countries
        on base_countries.a2 = tran_countries.a2
       and tran_countries.lang = userenv('LANG');


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134