升级Oracle 19c后如何排查非19c客户端连接?SQL报错求助
解决Oracle 19c数据库中识别非19c客户端连接的问题
原SQL报错原因
你的SQL触发ORA-00933错误,核心问题是Oracle不支持链式比较语法:
to_number(decode(substr(a.client_version,1,2),'Un',0,substr(a.client_version,1,2))) < to_number(substr(c.version,1,2)) < 12
Oracle无法解析A < B < C这种连续比较写法,必须拆分为两个独立条件用AND连接;同时这段逻辑本身存在冗余——数据库是19c,substr(c.version,1,2)结果为19,19 <12永远为假,完全可以去掉。
优化后的查询语句
下面是修正语法、简化逻辑后的SQL,精准筛选使用非19c客户端的应用用户,同时优先返回你需要的用户名和客户端名称:
SELECT DISTINCT b.username, a.client_driver AS client_name, a.client_version, b.machine, a.osuser, a.inst_id, a.sid, a.serial#, c.version AS database_version FROM gv$session_connect_info a JOIN gv$session b ON a.inst_id = b.inst_id AND a.sid = b.sid AND a.serial# = b.serial# CROSS JOIN (SELECT DISTINCT version FROM gv$instance) c WHERE b.type != 'BACKGROUND' AND a.osuser != 'oracle' -- 过滤非19c客户端:处理"Unknown"版本,只保留版本前缀小于19的连接 AND TO_NUMBER(DECODE(SUBSTR(a.client_version, 1, 2), 'Un', 0, SUBSTR(a.client_version, 1, 2))) < 19 ORDER BY a.inst_id, a.sid, a.serial#;
关键优化点
- 用显式JOIN替代原隐式连接,逻辑更清晰,避免关联错误
- 直接针对19c数据库场景,判断客户端版本前缀小于19,去掉冗余的数据库版本比较
- 优先展示你需要的
username和client_driver(客户端名称),其他字段作为辅助排查信息 - 保留
DISTINCT避免重复的连接记录
内容的提问来源于stack exchange,提问作者Learning_something_new
相关产品推荐
相关产品推荐

