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 中的修剪函数一起使用的主要内容,如果未能解决你的问题,请参考以下文章