vsize 函数不能与 PL/SQL 中的修剪函数一起使用

Posted

技术标签:

【中文标题】vsize 函数不能与 PL/SQL 中的修剪函数一起使用【英文标题】:vsize function not working with trim function in PL/SQL 【发布时间】:2014-03-06 22:45:41 【问题描述】:

当我在 SQL plus 命令行中单独运行命令和在过程中使用它时,谁能帮助我理解为什么我的 PL/SQL 查询中的 VSIZE 函数的结果会有所不同?我了解 VSIZE 在表达式的内部表示中显示字节数。我浏览了许多示例,在下面的示例中,我相当确定当我将它作为程序的一部分运行时,我得到的答案应该低于我得到的答案(大约 12 个)?如果两者都使用了修剪功能,为什么两种情况下的答案都不相同?我需要返回输入中的字节数(这是一个全名),因此我在调用 VSIZE 之前删除了尾随空格。在以下两个查询之间观察到输出的差异:

SELECT VSIZE( trim('   Noreen     ')) from dual;

还有……

CREATE OR REPLACE PROCEDURE HelloFullName (fullname IN NVARCHAR2)
IS
fullname_mod NVARCHAR2(50);
BEGIN
SELECT (INITCAP(TRIM(fullname)) into fullname_mod from dual;
DBMS_OUTPUT.PUT_LINE('Initial-capitalized version of name: ' || fullname_mod);
SELECT VSIZE( (trim(fullname) INTO fullname_mod from dual;
DBMS_OUTPUT.PUT_LINE('Number of bytes in name: ' || fullname_mod);
END HelloFullName;
/

BEGIN
HelloFullName('     Noreen     ');
END;
/

我还是 PL/SQL 的新手,如果有任何见解,我将不胜感激...干杯

【问题讨论】:

【参考方案1】:

您在过程中将VSIZE() 应用于NVARCHAR2.. 类型的变量,而您直接在命令提示符中应用于字符串。

VSIZE(NVARCHAR2) 返回两倍的字符串长度。在这种情况下,它为您测试的单词返回2*6 = 12(2[bytes] 是每个字符的大小)。当您直接执行VSIZE() 时,它会给出6。(每个字符仅占用1 个字节)

来自docs。

NVARCHAR2(size)

具有最大长度大小字符的可变长度 Unicode 字符串。

字节数最多可达到, 1) AL16UTF16 编码的 2 倍大小和 2) UTF8 编码的 3 倍大小。

最大大小由国家字符集定义决定,上限为4000字节。您必须为 NVARCHAR2 指定 size

【讨论】:

以上是关于vsize 函数不能与 PL/SQL 中的修剪函数一起使用的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL学习笔记_03_存储函数与存储过程

PL/SQL自定义函数

动态修剪列值

oracle中vsize和length

PL/Sql 函数

ORACLE PL/SQL 中的表值函数