暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 具有PL/SQL异常处理的Unicode错误字符串

ASKTOM 2020-10-09
604

问题描述

嗨,

我想介绍以用户的本地语言从我的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例程中没有固有的错误可以阻止这种情况。例如:

UTF8_ERROR

但这只是因为

a) 在启动SQL Plus之前,我在此ms-dos命令中运行了 “chcp 65001”
b) 我将文件保存为UTF8并运行该文件 (简单地剪切/粘贴不起作用,因为默认情况下它不是我的机器上的UTF编码)

底线-您必须在这里找到很多活动部件

-数据库必须支持它 (我的数据库正在运行默认的UTF8字符集)
-客户端NLS设置必须正确
-客户端操作系统设置必须对齐

我猜这是你需要改变的代码页
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论