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()
仅出现在 真正的 整数上。
我想查询 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()
仅出现在 真正的 整数上。