vsize函数不适用于PL / SQL中的trim函数

时间:2014-03-06 22:45:42

标签: sql oracle plsql trim procedure

当我在SQL plus命令行中单独运行命令并且在程序中使用它时,有人可以帮助我理解为什么我的PL / SQL查询中VSIZE函数的结果会有所不同吗?我知道VSIZE显示表达式内部表示中的字节数。我已经看了很多例子,在下面的例子中,我很确定我应该得到的答案低于我得到的答案(大约12)当我作为程序的一部分运行它时?如果在两种情况下使用trim功能,为什么两种情况下的答案都不相同?我需要返回输入中的字节数(这是一个全名),所以我在调用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 个答案:

答案 0 :(得分:3)

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

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

来自docs

NVARCHAR2(size)

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

字节数可以达到,
1)AL16UTF16编码的两次大小,以及UTF8编码的三次大小。

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