Oracle 数据库 查询 sessions_per_user 大于 40 的所有数据库配置文件

Oracle Database Query all database profiles with sessions_per_user greater than 40

我想查询 sessions_per_user > 40 的所有数据库配置文件。 我使用的测试数据如下:

   select PROFILE, LIMIT from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER;
   Profile LIMIT
   DEFAULT  UNLIMITED
   ORA_STIG_PROFILE DEFAULT
   APP_USER 40
   TEST2    2
   TEST3    3
   TEST4    11
   TEST5    27
   TEST6    33
   TEST7    244
   TEST8    45
   TEST9    50
   TEST10   111
   TEST11   93
   TEST12   39
   TEST13   41

我从这个查询开始

     select profile, limit from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER' AND LIMIT >= 40;

这会导致 ORA-01722:数字无效,因为您无法对字符串执行数学运算。

所以我尝试了这个:

     select profile, LIMIT from (select PROFILE, LIMIT from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER' AND LIMIT != 'UNLIMITED' AND PROFILE != 'DEFAULT' AND LIMIT != 'DEFAULT') WHERE LIMIT = 40;

即使第二个查询过滤了默认和无限制的号码,我仍然得到无效号码。

在大多数情况下,这个问题不会存在,因为该列将仅限于数字或字符串,但使用此数据库设置,我显然无法更改其中的任何内容,并且在生产系统上,默认值和实际使用unlimited.

正如您所注意到的,问题是该列包含数字和字符串。

所以,只要你能让它忽略字符串的 non-numbers,你就可以解决问题。如您所见,where 可能无法解决问题。所以,使用 case:

select profile, limit
from DBA_PROFILES
where resource_name = 'SESSIONS_PER_USER' AND
      (case when not regexp_like(limit, '[^0-9]') then cast(LIMIT as number)
       end) >= 40;

case 保证其子句的执行顺序,因此 cast() 仅出现在 真正的 整数上。