包规范中的NVARCHAR2常量

arm*_*ock 5 oracle plsql

我尝试使用nvarchar2数据类型在包规范中添加一个常量,但在编译之后它会在数据库中存储类似的东西???.例如,我尝试为亚美尼亚语单词添加常量???

x constant nvarchar2(3) default '???';
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议解决这个问题或者不可能这样做吗?

Mik*_*ine 0

我已经在具有不同配置的两个不同数据库上测试了您的示例NLS_CHARACTERSET

\n\n

配置(通过查询接收 -

\n\n
select * \n from v$nls_parameters \n where parameter in ('NLS_NCHAR_CHARACTERSET','NLS_CHARACTERSET','NLS_LANGUAGE')\n
Run Code Online (Sandbox Code Playgroud)\n\n

):

\n\n

第一的:

\n\n
+----+------------------------+----------+\n| id |        PARAMETER       |  VALUE   |\n+----+------------------------+----------+\n| 1  | NLS_LANGUAGE           | AMERICAN | \n| 2  | NLS_CHARACTERSET       | AL32UTF8 | \n| 3  | NLS_NCHAR_CHARACTERSET | AL16UTF16| \n+----+------------------------+----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二:

\n\n
+----+------------------------+-------------+\n| id |        PARAMETER       |    VALUE    |\n+----+------------------------+-------------+\n| 1  | NLS_LANGUAGE           | RUSSIAN     | \n| 2  | NLS_CHARACTERSET       | CL8MSWIN1251| \n| 3  | NLS_NCHAR_CHARACTERSET | AL16UTF16   | \n+----+------------------------+-------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果如下,在带有字符集AL32UTF8变量的数据库上正确显示,在CL8MSWIN1251带有问题“???”的字符集上。

\n\n

我没有更改数据库的字符来验证我的建议。所以我建议你改NLS_CHARACTERSET 一下AL32UTF8它应该会有帮助。

\n\n

我的测试包:

\n\n
create or replace package question27577711 is\n  x constant nvarchar2(3) default '\xd5\xb4\xd5\xa5\xd5\xaf';\n  function get_constant_x return nvarchar2;\nend question27577711;\n\ncreate or replace package body question27577711 is\n  function get_constant_x\n  return nvarchar2\n  is\n  begin\n   return x;\n  end get_constant_x;\nend question27577711;\n\nselect question27577711.get_constant_x from dual\n
Run Code Online (Sandbox Code Playgroud)\n