oracle - 关于Oracle PL/SQL引用运算符: can the default behaviour be changed?中的换行符

标签 oracle plsql

今天我注意到引用运算符有一些有趣的事情。

这里,我通过 SQL*Plus 在 Windows 10 笔记本电脑上运行的 12.1 数据库上运行此代码。

newline_CRLF.sql

set serveroutput on
declare
  l_str1   varchar2(100 char);
  l_str2   varchar2(100 char);
begin
  l_str1 := q'{This is a
two lines string}';
  l_str2 := 'This is a'||chr(13)||chr(10)||'two lines string';
  dbms_output.put_line('STR1: length='||length(l_str1)||', lengthb='||lengthb(l_str1));
  dbms_output.put_line('STR1: length='||length(l_str2)||', lengthb='||lengthb(l_str2));
end;
/

此代码位于 Windows 中默认行终止符为 CRLF 的文件中。

SQL> @newline_CRLF
STR1: length=26, lengthb=26
STR1: length=27, lengthb=27

Procedura PL/SQL completata correttamente.

我在这里注意到,引号运算符 q'{}' 中的换行符被解析为 Unix 风格的换行符。

我使用 Notepad++ EOL 转换实用程序将脚本转换为使用 Unix 风格的换行符,并且在下次运行时我得到了相同的结果。

这绝对有意义,因为它保证任何代码库都以相同的方式处理,与 PL/SQL 语言 EOL 无关:如果不是这样,就可能会遇到错误。

这种行为非常适合类 Unix 系统,但在 Windows 上可能有点烦人,需要显式使用字符串连接。

这不是一个实际问题,只是出于我的好奇心想问:

“有人知道这是接受它的情况还是有可能设置一个参数来改变它的行为方式?”

考虑到我在 Windows 平台上获得了 LF,并且到目前为止我在 MOS 上没有发现任何内容,我几乎不认为这是可能的,但你永远不知道......

最佳答案

这是一种“拿走它”的情况。除非您正在处理特定的错误,否则您应该接受这些怪癖,而不是避免使用多行字符串。

在 SQL 和 PL/SQL 中,我确实从未见过由多行字符串换行符引起的问题。是的,有理论上的问题,但没有现实世界的问题。事实上,如果您尝试强制每个人都使用显式换行符,您更有可能遇到其他更奇怪的问题。

例如,我多次看到下面的错误。如果您不小心只使用 CHR(13),在 Windows DOS 提示符等环境中,会导致奇怪的行为。如果您考虑旧的打字机过去的工作方式,则此输出实际上是有意义的 - 您会将栏拉回 (13),然后移至新行 (10)。但是,如果您只拉动控制杆 (13),然后开始输入,您将覆盖之前的字符。

SQL> set serveroutput on;
SQL> begin
  2     dbms_output.put_line('Where did this first line go?'||chr(13)||'Nothing to see here.');
  3  end;
  4  /
Nothing to see here. line go?

PL/SQL procedure successfully completed.

SQL>

更重要的是,充满字符串连接的代码看起来很糟糕。人们讨厌动态 SQL 的很大一部分原因是它看起来很丑。但它看起来很丑,因为人们连接和转义字符串。通过多行字符串、替代引用机制(您已经在使用)和一些 REPLACE 函数,我们可以使代码动态且仍然可读。

与其他语言不同,动态代码在 PL/SQL 中是一件好事。如果我们无意识地避免动态 SQL,我们的程序将受到严重限制,因为我们的连接字符串看起来很难看。

关于oracle - 关于Oracle PL/SQL引用运算符: can the default behaviour be changed?中的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647681/

相关文章:

python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer

database - Oracle - 表名和列 - 我可以更改大小写吗?

database - 就数据共享而言,解耦数据库设计的最佳方法是什么?

oracle - INSERT ALL 带条件 PL/SQL

oracle - 禁用 Oracle 中所有作业的脚本(DBMS_JOB 包)?

java - 通过为单个线程分配唯一的 ID 来提高输出的清晰度

node.js - 错误: DPI-1047: Cannot locate a 64-bit Oracle Client library in NodeJS

Oracle 10g数据库日期转换为 'yyyy-iw'有问题吗?

database - 如何从 oracle 中的 Base64 字符串中删除 '\r\n'?

sql - 如果两列之间的日期相交,在 Oracle 上创建唯一索引的最有效方法