当我使用sqlplus或任何其他工具编译时,如何在包中保留特殊字符?
NLS_CHARACTERSET:WE8MSWIN1252
客户角色的集合:未知
问题是:数据呈现
操作系统和数据库:UNIX \ Oracle Database 12c企业版12.1.0.2.0版 - 64位生产Oracle Database 12c企业版12.1.0.2.0版 - 64位生产
PL / SQL版本12.1.0.2.0 - 生产
核心12.1.0.2.0生产
适用于Linux的TNS:版本12.1.0.2.0 - 生产
NLSRTL版本12.1.0.2.0 - 生产
示例:
CREATE OR REPLACE PACKAGE BODY pkg1
AS
procedure sp
IS
v_var VARCHAR2(100);
BEGIN
v_var := '**último**';
END;
END;
当我描述包时看起来像这样:
CREATE OR REPLACE PACKAGE BODY HR.pkg1
AS
procedure sp
IS
v_var VARCHAR2(100);
BEGIN
v_var := '**£ltimo**';
END;
END;
答案 0 :(得分:0)
有通用的方法将任意unicode数据输入oracle数据库,将自己限制为ascii charset:
将目标文本的utf-8表示确定为十六进制的字节序列。
使用utf8-savvy编辑器并输入要传输到db的文本。许多编辑器都带有十六进制模式,允许您检查utf8表示并将其写在其他地方。或者使用专用的十六进制编辑器或使用像od
(linux)这样的cli工具来生成文件内容,作为以十六进制表示的八位字节的列表序列:
od --output-duplicates --format x1 --width=16 demo.txt
输出需要一些后处理来消除行号和空白,但是,这应该是直截了当的。对于批量数据,请使用sed
或类似工具。
将十六进制字符串转换为oracle' s raw
数据类型。
在PlSql中调用HEXTORAW(x)
可以解决问题。
将raw
数据转换为varchar2
,即。数据库字符集。
使用plsql包过程utl_i18n.raw_to_char
。它的第二个参数指定源编码。
总之,该方法归结为类似的查询(测试字符串是小写字母a
到f
,后跟德语变音符号):
select utl_i18n.raw_to_char ( hextoraw ( '616263646566c3a4c3b6c3bcc384c396c39cc39f' ), 'AL32UTF8' ) from dual;
在你的包中你会写:
v_var := '**' || utl_i18n.raw_to_char ( hextoraw ( 'c3ba' ), 'AL32UTF8' )
|| 'ltimo**';
-- c3ba being the utf8 encoding of unicode codepoint U+00fa,
-- 'LATIN SMALL LETTER U WITH ACUTE'
显然,只有数据库字符集能够首先表示字符时,该技术才有效。
<强>快捷方式强>
只要db知道该编码,您就可以使用任何其他编码所需特殊字符的源代码。即,可以使用用于拉丁字母的iso 8859-x系列编码。对于ú
和iso8859-1:
v_var := utl_i18n.raw_to_char ( hextoraw ( 'fa' ), 'WE8ISO8859P1' ) from dual;
在数据库中使用国家字符集,您可以在文字字符串中按代码点输入unicode字符。只需使用UNISTR
函数包装文字字符串:
v_var := TO_CHAR(UNISTR('**\00faltimo**')) from dual;