首页 > 解决方案 > 如何在 Oracle PL/SQL 中向 VARCHAR2 添加不可打印的 ascii 控制字符?

问题描述

我支持一个标签打印系统,该系统使用 PL/SQL 和 ORACLE 数据库来填写值,然后将这些值编码为各种条形码(除其他外)。对于我尝试创建的特定二维数据矩阵条形码,我需要包含一些不可打印的字符作为扫描条形码的系统的控制字符。

问题是我不知道如何编码这些字符。

例子:

v_string VARCHAR2(1000);
...
v_string := '[)><RS>06<GS>12SC<GS>16S2'||'<GS>V'||:(IN:-SPLR-)||'<GS>3S'||v_serial||'<GS>P'||:(IN:-CUSTITEM-)||'<GS>Q'||v_boxqty||'<GS>1T'||:(IN:-LOT-)||'<GS>15K123456789123'||:(IN:-PRODSEQ-)||'<RS><EOT>';

然后将 v_string 作为参数传递给实际填充打印标签上的条形码的函数。问题是字符串中的每个<GS>,<RS><EOT>都应该是控制字符。我有这些控制字符的 ascii 十进制和十六进制值,但不知道如何将它们添加到上面的字符串而不是占位符中。

任何帮助,将不胜感激。

标签: oracleplsqlascii

解决方案


您可以使用chr()函数来提供单个 ASCII 字符:

CHR返回具有与n等效的二进制的字符作为VARCHAR2数据库字符集中的值,或者,如果您指定USING NCHAR_CS,则返回国家字符集中的值。

(您也可以使用unistr()Unicode 字符,但在这种情况下似乎没有必要;但请注意chr()文档中的 ASCII/EBCDIC 消息...)

对于那些你可以使用的控制字符chr(4)chr(29)chr(30)

v_string := '[)>'||chr(30)||'06'||chr(29)||'12SC'||chr(29)||'16S2'||chr(29)||'V'||:(IN:-SPLR-)||chr(29)||'3S'||v_serial||chr(29)||'P'||:(IN:-CUSTITEM-)||chr(29)||'Q'||v_boxqty||chr(29)||'1T'||:(IN:-LOT-)||chr(29)||'15K123456789123'||:(IN:-PRODSEQ-)||chr(30)||chr(4);

db<>fiddle显示生成的字符串 - 无论如何 - 可打印部分 - 它是转储值,因此您可以看到 4/29/30 字符实际上存在。

您也可以按照自己的方式构建字符串,然后将其传递replace()以将<GS>等占位符替换为chr()值。


推荐阅读