存储过程数据集
在 SQL 数据集中用 {call ...} 调用存储过程,输出参数、游标、可选输出参数的写法与限制。
概述
存储过程不是独立的数据集类型,而是 SQL 数据集的一种写法:SQL 文本(去掉首尾空白并转为小写后)以 call (含空格)或 {call 开头,系统就按存储过程执行。在「编辑数据集」中新建「SQL数据集」,把 SQL 写成 {call 过程名(参数...)} 即可。
功能入口
「新建SQL数据集」>「SQL数据集」,在 SQL 编辑区输入 {call ...}。其余选项(数据连接、查询超时等)与 SQL 数据集 相同。
操作步骤
- 新建 SQL 数据集,选择数据连接。
- 输入
{call 过程名(入参, ..., 输出参数声明)},入参使用$参数名引用报表参数。 - 点击「从SQL提取参数到报表参数」,设置入参类型。
- 点击「数据预览」,检查输出字段。
属性说明
输出参数声明
在参数列表中用 名称:类型 声明输出参数:
| 写法 | 说明 |
|---|---|
名称:类型编号 |
类型编号取 java.sql.Types 的数值,例如 4 为 INTEGER,2 为 NUMERIC,12 为 VARCHAR |
名称:cursor |
游标输出。Oracle 使用类型 -10,其他数据库使用 120 |
[名称:类型编号] |
方括号表示可选输出参数;只写半个方括号会报错 |
字符串里的冒号不会被当作输出参数,例如 'HH24:00'。
示例
假设已有存储过程。无输出参数:
{call sp_sync_visit_data($startDate, $endDate)}
带数值输出参数(totalCount 为 INTEGER):
{call sp_get_visit_summary($year, $month, totalCount:4)}
多个输出参数:
{call sp_calc_statistics($startDate, $endDate, totalCount:4, totalAmount:2, avgAmount:2)}
Oracle 或 PostgreSQL 返回游标,result 即游标输出参数:
{call sp_get_dept_visits($deptCode, result:cursor)}
注意:出参声明外加方括号(如
[result:cursor])表示「可选出参」,但方括号不会从最终 SQL 中去掉,交给 JDBC 驱动的调用串会变成[?],多数驱动不接受这种写法。手写调用时不要给出参加方括号,直接写名字:类型码或名字:cursor;方括号写法只出现在系统按存储过程元数据自动生成的调用模板里,以界面生成的内容为准。
注意事项
注意:存储过程不支持集合参数展开,一个参数最多 1 个元素,多个时报「存储过程参数暂不支持多值集合」。
注意:存储过程数据集不支持分页偏移(「存储过程暂不支持分页偏移查询」),也不能用于「数据浏览报表」(「数据浏览报表模式暂不支持存储过程数据集」)。
注意:调用存储过程仍受注入校验约束,
sp_开头的自建过程允许,sp_executesql、sp_cmdshell等系统过程被拒绝。
提示:过程运行时间较长时,为数据集设置更大的「查询超时(秒)」,最大 3600。