当我在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的新手,非常感谢任何见解......干杯
答案 0 :(得分:3)
您正在将VSIZE()
应用于过程中类型为NVARCHAR2
..的变量,而您在命令提示符中直接应用于字符串。
VSIZE(NVARCHAR2)
返回字符串长度的两倍。在这种情况下,它会为您测试的单词返回2*6 = 12
(每个字符大小为2 [字节])。当你直接VSIZE()
时,它会给6
。(每个字符只占1个字节)
来自docs。
NVARCHAR2(size)
具有最大长度大小字符的可变长度Unicode字符串。
字节数可以达到,
1)AL16UTF16
编码的两次大小,以及UTF8
编码的三次大小。
最大大小由国家字符集定义决定,上限为4000字节。您必须为size
指定NVARCHAR2
。