如何使用基于util_i18n的语言代码列表在Oracle 11g中创建表?

时间:2014-04-04 14:44:22

标签: sql oracle oracle11g internationalization

前几天我询问如何根据内置的oracle表格生成货币列表:Does oracle provide a built-in currency table for me to use as constraints?

现在我需要一个语言代码列表,所以我去阅读util_i18n的文档,然后找到了一个名为GET_LOCAL_LANGUAGES的函数。我尝试将上一个答案中的脚本调整为这个新问题,但失败了。这主要是因为我的oracle / sql knowlegde很糟糕:

我正试图改编的原文:

select utl_i18n.GET_DEFAULT_ISO_CURRENCY(value) iso_cur
from v$nls_valid_values
where parameter = 'TERRITORY'

我尝试将其用于语言:

select utl_i18n.GET_LOCAL_LANGUAGES(value) lang_cur
from v$nls_valid_values
where parameter = 'TERRITORY'

我检查了文档,TERRITORY也是参数名称,那部分不是猜测。使用此查询,我收到错误:invalid data type

我敢打赌这是一个菜鸟问题,但到目前为止,我的所有尝试都失败了。

1 个答案:

答案 0 :(得分:2)

例如,您可以使用流水线包装器(原始函数返回包定义的集合类型):

SQL> create type t_lang_tab is table of varchar2(4000)
  2  /

SQL> create or replace function get_language(
  2   p_value in varchar2
  3  ) return t_lang_tab
  4  pipelined
  5  is
  6    res utl_i18n.string_array;
  7  begin
  8    res := utl_i18n.GET_LOCAL_LANGUAGES(p_value);
  9    if res is not null then
 10      for i in 1..res.count loop
 11        pipe row (substr(res(i),1,4000));
 12      end loop;
 13    end if;
 14    return;
 15  end;
 16  /

SQL> col column_value format a25
SQL> col value format a25
SQL> select t.column_value, p.value
  2  from v$nls_valid_values p,
  3  table(get_language(p.value)) t
  4  where parameter = 'TERRITORY'
  5  /

COLUMN_VALUE              VALUE                                                 
------------------------- -------------------------                             
ENGLISH                   AMERICA                                               
GERMAN DIN                GERMANY                                               
CANADIAN FRENCH           CANADA                                                
FRENCH                    CANADA                                                
CATALAN                   SPAIN                                                 
SWEDISH                   FINLAND                                               
PORTUGUESE                BRAZIL                                                
LATIN AMERICAN SPANISH    MEXICO                                                
SPANISH                   MEXICO                                                
SPANISH                   CATALONIA                                             
ARABIC                    EGYPT   
....

如果要创建语言表,可以执行以下操作:

SQL> CREATE TABLE languages (
  2    country VARCHAR2(30) NOT NULL,
  3    language VARCHAR2(30) NOT NULL,
  4    CONSTRAINT languages_pk PRIMARY KEY (country, language)
  5  )
  6  /

主键应该是复合的,因为有像加拿大这样的多语言国家。 现在您可以使用上面的函数来填充表格:

SQL> INSERT INTO languages
  2  select p.value, t.column_value
  3  from v$nls_valid_values p,
  4  table(get_language(p.value)) t
  5  where parameter = 'TERRITORY'
  6  order by 1
  7  /

SQL> commit;

SQL> select * from languages;

COUNTRY                        LANGUAGE                                         
------------------------------ ------------------------------                   
AMERICA                        ENGLISH                                          
ARGENTINA                      SPANISH                                          
BELARUS                        RUSSIAN                                          
BELGIUM                        FRENCH                                           
BRAZIL                         PORTUGUESE                                       
CANADA                         FRENCH                                           
CANADA                         CANADIAN FRENCH                                  
CATALONIA                      SPANISH                                          
CHILE                          SPANISH                                          
COLOMBIA                       SPANISH    
...