oracle - 如何在 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 十进制和十六进制值,但不知道如何将它们添加到上面的字符串而不是占位符中。
任何帮助,将不胜感激。
解决方案
您可以使用该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()
值。
推荐阅读
- java - 如何在 persistence.xml 文件中设置动态值
- amazon-web-services - 当 Chrome 选项卡未打开时,AWS Cloud9 实例的性能大幅下降
- java - 子 maven 项目找不到 maven-compiler-plugin
- web - 如何使用 WebXR 在我的房间中放置一些对象?
- arrays - 如何在 c 编程语言中动态分配 3d 矩阵?
- excel - 隐藏具有条件 VBA 的列
- php - 调用未定义的函数 getNameEC()
- c++ - 使用 CMake 链接 fortran 和 c++ - 跳过不兼容的...错误
- django - 在 django 中更改 FILE_UPLOAD_MAX_MEMORY_SIZE 的正确方法是什么?
- sql - 如何从 dd/mm/yy hh:mm:ss ms 获取月份和年份?