前几天我询问如何根据内置的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
我敢打赌这是一个菜鸟问题,但到目前为止,我的所有尝试都失败了。
答案 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
...