在oracle 12c中输出变量并选择用户名

时间:2017-12-29 17:01:44

标签: oracle

select user from dual应返回什么类型的变量?

如果不是varchar,我该如何投放到varchar(30)varchar2(30)

是否存在一个比它更好地返回当前用户名的方法?

1 个答案:

答案 0 :(得分:2)

根据:

select dump(user) from dual;

是类型1,which is varchar2。 (或nvarchar2,仅基于该数字。)长度 - 字节数 - 当然,因为它是 var char而变化。

文档for the user function也说:

  

此函数返回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     '

...有或没有明确的演员。