select user from dual
应返回什么类型的变量?
如果不是varchar
,我该如何投放到varchar(30)
或varchar2(30)
?
是否存在一个比它更好地返回当前用户名的方法?
答案 0 :(得分:2)
根据:
select dump(user) from dual;
是类型1,which is varchar2
。 (或nvarchar2
,仅基于该数字。)长度 - 字节数 - 当然,因为它是 var char而变化。
此函数返回VARCHAR2值。
您可以将用户转为varchar2(30)
:
select cast(user as varchar2(30)) from dual;
但根据转储它后来完全一样。如果用户名长度超过30个字符,您只能看到差异;然后它会被截断。但是,文档也说:
Oracle数据库将此函数的值与空白填充的比较语义进行比较。
这意味着如果我的用户名是STACKOVERFLOW
,那么这两个用户都会返回数据:
select * from dual where user = 'STACKOVERFLOW';
select * from dual where user = 'STACKOVERFLOW ';
空白填充比较意味着它将user
的结果填充到与其进行比较的文字的长度。
一旦你将结果转换为不归属,因为它恢复为非填充比较:
select * from dual where cast(user as varchar2(30)) = 'STACKOVERFLOW';
返回一行,但这不是:
select * from dual where cast(user as varchar2(30)) = 'STACKOVERFLOW ';
另一种方法是使用sys_context()
:
select sys_context('USERENV', 'SESSION_USER') from dual;
也会返回varchar2
,并且再次投射效果不大;这使用非填充比较,所以再次
select * from dual where sys_context('USERENV', 'SESSION_USER') = 'STACKOVERFLOW'
查找数据,但不会:
select * from dual where sys_context('USERENV', 'SESSION_USER') = 'STACKOVERFLOW '
...有或没有明确的演员。