如何从Oracle查询结果中移除集合类型名称HR.TYPE_4?
问题原因
你查询结果中出现的HR.TYPE_4是Oracle对自定义类型实例的默认输出标识,不属于查询错误:
- 你通过
CAST(COLLECT(first_name) AS type_4)返回的是你自建的集合类型type_4的实例对象,不是普通的字符串/数值类型 - Oracle打印输出自定义对象时,默认会先显示对象所属的schema + 类型全称,你当前操作的schema为HR,因此会带上
HR.TYPE_4前缀
移除前缀的解决方案
方案1:使用LISTAGG直接拼接字符串(Oracle 11gR2及以上版本推荐)
不需要自定义集合类型,直接返回拼接好的字符串,不会出现类型前缀:
SELECT department_id, LISTAGG(first_name, ',') WITHIN GROUP (ORDER BY first_name) names FROM employees GROUP BY department_id;
方案2:解嵌自定义集合后拼接输出
如果你必须保留COLLECT和自定义类型type_4的逻辑,可以嵌套一层查询解析集合内容:
SELECT e.department_id, (SELECT LISTAGG(column_value, ',') WITHIN GROUP (ORDER BY column_value) FROM TABLE(e.names)) names FROM ( SELECT department_id, CAST(COLLECT(first_name) AS type_4) names FROM employees GROUP BY department_id ) e;
注:如果是SQL*Plus等命令行客户端场景,也可以通过修改会话级显示参数隐藏类型前缀,但该配置仅对当前会话生效,更换执行环境后仍然会显示前缀,不推荐使用。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

