目录
- 1.sql提供以下两种查询方式
- 2.如果报错
- 2.1作为SYSDBA角色登录
- 2.2 给普通用户授权
- 2.3 创建type并创建函数【wm_concat】
- 2.4 最后一步,创建同义词及授权
- 验证
- 总结
1.sql提供以下两种查询方式
来拼接同一个字段多个记录结果
1.replace+wm_concat 2.listagg within group
两种方式可实现一样的效果。
快速脚本:替换 表名 与 字段名 执行即可验证。
select ( -- 1.replace+wm_concat select replace(wm_concat(a.name),',','|') from teacher_leader a ) res1, -- 2.listagg within group ( select listagg(a.name,'|') within group (order by a.name) from teacher_leader a ) http://www.devze.comres2 from dual;
实测:
2.如果报错
ORA-00904: “WM_CONCAT”: 标识符无效
可进行如下处理解决,定义type部分参考博客 https://blog.csdn.net/huryer/article/details/109838948
注意: 如果你没有system用户,可能是一个用户拥有多个角色,那么上面的参考博客对你不适用。
可用下面的方案:
2.1作为SYSDBA角色登录
2.2 给普通用户授权
www.devze.comGRANT create type to shop; GRANT create procedure to shop;
登录shop(以普通用户normal的身份登录)
2.3 创建type并创建函数【wm_concat编程客栈】
--在shop用户作为normal角色会话下创建可用的wm_concat函数,直接执行以下语句 --定义类型 CREATE OR REPLACE TYPE WM_CONCAT_编程客栈IMPL AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, P1 IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER ); / --定义类型body: CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL IS STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER IS BEGIN SCTX := WM_CONCAT_IMPL(NULL) ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, P1 IN VARCHAR2) RETURN NUMBER IS BEGIN IF(CURR_STR IS NOT NULL) THEN CURR_STR := CURR_STR || ',' || P1; ELSE CURR_STR := P1; END IF; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS BEGIN RETURNVALUE := CURR_STR ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER IS BEGIN IF(SCTX2.CURR_STR IS NOT NULL) THEN SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ; END IF; RETURN ODCICONST.SUCCESS; END; END; / --自定义行变列函数: CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; /
2.4 最后一步,创建同义词及授权
--创建完成,给其创建同义词及授权,以供其他用户能正常使用。 create public synonym WM_CONCAT_IMPL for shop.WM_CONCAT_IMPL / create public synonym wm_concat for shop.wm_concat / grant execute on WM_CONCAT_IMPL to public / grant execute on wm_concat to public /
验证
总结
以上为个人经验,编程客栈希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论