oracle - 给出不同 ASCII 输出的 Oracle 程序
问题描述
此过程打印ASCII
字符串中每个字符的代码。
如果在 TOAD 中执行,它会打印这些 ASCII 代码:55 48 48 32 32 32 32 32 32 32 49
哪些是正确的。
如果通过SQLPLUS
在UNIX
服务器上执行并将输出假脱机DBMS_OUTPUT.PUT_LINE (v_String);
到文本文件,复制该输出并将其分配给 v_String 并在 TOAD 中执行该过程,我得到以下ASCII
代码55 48 48 9 32 32 49
。
为什么要用 9 替换 32 32 32 32 32。本质上是一个标签。
CREATE OR REPLACE PROCEDURE My_Test
AS
v_String VARCHAR2 (25);
BEGIN
v_String := RPAD ('700', 10) || '1';
-- v_String:='700 1';
DBMS_OUTPUT.PUT_LINE (v_String);
DBMS_OUTPUT.PUT_LINE ('');
FOR i IN 1 .. LENGTH (v_String)
LOOP
DBMS_OUTPUT.PUT_LINE (ASCII (SUBSTR (v_String, i, 1)));
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
解决方案
这是 Unix 上 SQL*Plus 的默认行为,由其tab
设置控制:
设置标签 {打开 | 离开}
确定 SQL*Plus 如何格式化终端输出中的空白。
OFF
使用空格来格式化输出中的空白。ON
使用TAB
字符。TAB
设置是每八个字符。的默认值TAB
取决于系统。
SQL*Plus 在输出到终端时“有用地”替换制表符。这与 PL/SQL 无关,或者dbms_output
- 你会看到同样的事情:
select '700 1' from dual;`
您会看到前三个字符,然后是一个制表符而不是五个空格,最多可容纳 8 个字符,然后是最后两个空格和最后一个字符。
在您的 SQL*Plus 会话中,set tab off
在开始之前设置 do。
您可能希望在脚本或登录文件中设置它,以便始终应用它。
(请注意,这仅适用于终端输出,不适用于假脱机文件;您的问题是指假脱机,但我认为您实际上必须以其他方式重定向或捕获输出。)
推荐阅读
- spring-boot - 如何在 Azure DevOps 中配置 Spring Boot 应用程序环境变量值
- javascript - D3.js:实时旭日形分区数据:重新创建层次结构?
- python - 我如何使用正则表达式从 cloudwatchloginsights 查询的输出中过滤?
- forms - Shopify Liquid 联系表发送到多个电子邮件
- excel - 如何在 excel VBA 中使用旧的对象库版本?
- javascript - javascript中“super”关键字的复杂性
- oracle - PLSQL: CLOB 数据返回 ORA:06502
- java - 你能帮忙解决这个问题吗,为什么它不在运行线程中求和?
- ios - 使嵌入 Storyboard ViewController 的 SwiftUI 视图使用全屏宽度
- java - 有没有办法在java中检查优先级队列中的优先级?