Oracle函数SYS_CONNECT_BY_PATH在Jasper Studio可用却在Jasper Server报错
解决Jasper Server 7.1.0拦截Oracle SYS_CONNECT_BY_PATH函数的问题
针对你遇到的Oracle 9i环境下用SYS_CONNECT_BY_PATH生成拼接列表,在本地工具正常但发布到Jasper Server 7.1.0触发6632错误的问题,这里有几个无需关闭安全机制的解决方案:
1. 封装自定义数据库函数绕过拦截
Jasper Server的安全验证器大概率是把SYS_CONNECT_BY_PATH标记为了风险函数,我们可以在Oracle数据库里把这个逻辑封装成自定义函数,安全规则一般不会拦截自定义函数。
比如创建适配你场景的函数(示例逻辑可根据实际查询调整):
CREATE OR REPLACE FUNCTION GET_CONCAT_LIST(p_target_col IN VARCHAR2, p_separator IN VARCHAR2) RETURN VARCHAR2 IS v_result VARCHAR2(4000); BEGIN -- 结合你的层次查询逻辑,这里以去除开头分隔符的拼接为例 SELECT LTRIM(SYS_CONNECT_BY_PATH(p_target_col, p_separator), p_separator) INTO v_result FROM dual; RETURN v_result; END; /
之后在报表查询里,用GET_CONCAT_LIST(emp_name, ', ')代替直接调用SYS_CONNECT_BY_PATH即可。
2. 将SYS_CONNECT_BY_PATH添加到Jasper Server安全白名单
如果你有权限修改Jasper Server配置,可以直接把这个函数加入允许的函数列表,无需关闭整体安全机制:
- 找到Jasper Server安装目录下的
WEB-INF/applicationContext-security.xml文件 - 定位到
validatorbean配置段,找到allowedFunctions属性的函数列表 - 在列表中新增
SYS_CONNECT_BY_PATH,示例如下:<property name="allowedFunctions"> <list> <value>SYSDATE</value> <value>TO_DATE</value> <value>SYS_CONNECT_BY_PATH</value> <!-- 保留原有已允许的函数 --> </list> </property> - 保存配置后重启Jasper Server,查询即可正常运行。
3. 用子查询/CTE包装查询逻辑
作为临时workaround,你可以把包含SYS_CONNECT_BY_PATH的逻辑放到子查询或CTE中,部分情况下Jasper Server的安全验证器不会深入解析子查询内部的函数调用:
原查询示例:
SELECT dept_id, SYS_CONNECT_BY_PATH(emp_name, ', ') AS emp_list FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR emp_id = manager_id GROUP BY dept_id
修改为子查询形式:
SELECT dept_id, emp_list FROM ( SELECT dept_id, SYS_CONNECT_BY_PATH(emp_name, ', ') AS emp_list FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR emp_id = manager_id ) sub_query GROUP BY dept_id, emp_list
这几个方案里,优先推荐自定义函数或修改白名单,子查询方案更适合临时测试使用。
内容的提问来源于stack exchange,提问作者KeineMaster
相关产品推荐
相关产品推荐

