问题描述
嗨,
我想介绍以用户的本地语言从我的PL/SQL API异常向客户端发送用户友好的错误消息的功能。为此,我计划使用标准例程 “raise_application_error”。当我尝试这样做时,传递到 “raise_application_error” 调用中的Unicode消息并不总是在客户端中正确显示。我已经在Windows 10计算机上使用SQL * Plus和SQL Developer对此进行了测试,看来正在进行一些转换。
环境信息如下:
数据库字符集为AL32UTF8。
国家字符集为AL16UTF16。
Windows客户端的NLS_LANG环境变量为AL32UTF8。
在Linux x86-64上,数据库版本为19.6.0.0.0。
我用来测试的代码如下:
执行上述代码后,我观察到以下行为:
1) 来自 “raise_application_error” 的输出消息在SQL developer和SQL * Plus中被错误地转换。
2) 对 “dbms_output” 的调用确实在SQL developer中正确显示了Unicode字符串,但没有显示SQL * Plus。
3) 使用国家数据类型没有区别。
你能帮忙吗?
非常感谢,
马克。
我想介绍以用户的本地语言从我的PL/SQL API异常向客户端发送用户友好的错误消息的功能。为此,我计划使用标准例程 “raise_application_error”。当我尝试这样做时,传递到 “raise_application_error” 调用中的Unicode消息并不总是在客户端中正确显示。我已经在Windows 10计算机上使用SQL * Plus和SQL Developer对此进行了测试,看来正在进行一些转换。
环境信息如下:
数据库字符集为AL32UTF8。
国家字符集为AL16UTF16。
Windows客户端的NLS_LANG环境变量为AL32UTF8。
在Linux x86-64上,数据库版本为19.6.0.0.0。
我用来测试的代码如下:
DECLARE h varchar2(100 char) := 'Proszę mi pomóc rozwiązać ten problem Unicode'; BEGIN SYS.DBMS_OUTPUT.PUT_LINE(h); SYS.DBMS_STANDARD.RAISE_APPLICATION_ERROR(-20000, h); END; /
执行上述代码后,我观察到以下行为:
1) 来自 “raise_application_error” 的输出消息在SQL developer和SQL * Plus中被错误地转换。
2) 对 “dbms_output” 的调用确实在SQL developer中正确显示了Unicode字符串,但没有显示SQL * Plus。
3) 使用国家数据类型没有区别。
你能帮忙吗?
非常感谢,
马克。
专家解答
raise_application_error例程中没有固有的错误可以阻止这种情况。例如:

但这只是因为
a) 在启动SQL Plus之前,我在此ms-dos命令中运行了 “chcp 65001”
b) 我将文件保存为UTF8并运行该文件 (简单地剪切/粘贴不起作用,因为默认情况下它不是我的机器上的UTF编码)
底线-您必须在这里找到很多活动部件
-数据库必须支持它 (我的数据库正在运行默认的UTF8字符集)
-客户端NLS设置必须正确
-客户端操作系统设置必须对齐
我猜这是你需要改变的代码页
但这只是因为
a) 在启动SQL Plus之前,我在此ms-dos命令中运行了 “chcp 65001”
b) 我将文件保存为UTF8并运行该文件 (简单地剪切/粘贴不起作用,因为默认情况下它不是我的机器上的UTF编码)
底线-您必须在这里找到很多活动部件
-数据库必须支持它 (我的数据库正在运行默认的UTF8字符集)
-客户端NLS设置必须正确
-客户端操作系统设置必须对齐
我猜这是你需要改变的代码页
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




