存储过程数据集

在使用JDBC创建数集时,我们除了可以用普通的select查询类型的SQL创建数据集外,还可以在直接调用当前数据源中已定义的存储过程,以获取具体存储过程中返回的数据集合。如下图所示:

1663554253690

上面数据集的SQL区域中,我们输入的是一段以call开头的调用名为SP_PROC_EMPLOYEES存储过程,这个存储过程需要一个入参,我们这里使用的是名为deptId的报表参数。

举例

打开mysql中的baskreport-sample数据库,在该库中通过下面的SQL创建一个名为SP_PROC_EMPLOYEES的存储过程:

CREATE PROCEDURE `SP_PROC_EMPLOYEES`(in deptId varchar(60))
begin
select * from employee where dept_id = deptId;
end;

上面的SQL中,创建了一个名为SP_PROC_EMPLOYEES的存储过程,它有一个名为deptId的入参,该入参的类型为varchar(60),在这个存储过程中,我们通过select * from employee where dept_id = deptId返回employee表中所有dept_id字段与当前入参deptId匹配的记录。

执行完成上面的SQL后,就创建好了一个名为SP_PROC_EMPLOYEES的存储过程,再次打开报表中JDBC数据集创建窗口,就可以看到该数据库下刚创建的存储过程,如下图:

1663553331429

我们可以双击这个存储过程名称,这样就会在右边SQL编辑器中自动添加一条以call开头的调用该存储过程的语句,配置好当前存储过程需要的参数,就可以实现目标存储过程的调用。

存储过程调用的动态化

在编写以select开头的动态SQL一样,存储过程的调用同样支持脚本的方式动态生成,如下面的代码:

${
    if($p1=="A"){
        return "call pro_select1('D12')";
    }else{
        return "call pro_select2(${$p1})";
    }
}

上面的SQL中,我们将脚本放置在${}块中,通过参数p1的值决定是调用pro_select1这个存储过程还是调用pro_select2这个存储,同时在调用它们的时候还添加了静态参数和动态参数。

参数类型

我们知道,存储过程参数有IN,OUT和INOUT三种类型,在BaskReport中通过数据集调用存储过程时,能支持没有参数的或者是IN,OUT的存储过程,如果某个存储过程存在INOUT类型的参数,那么这种存储过程在BaskReport中无法正常调用。

简单类型数据返回

对于OUT类型的参数我们分为两种,一种是常规数据类型的输出参数,另一种是游标类型的输出参数。

如下对于这种类型的out参数:

CREATE PROCEDURE SP_PROC_SAMPLE(IN DEPTID varchar(20), OUT BRANCH_ID varchar(20), OUT SALARY float, OUT BIRTHDAY datetime)
begin
    set BRANCH_ID = CONCAT(DEPTID,'-SH001');
    set SALARY = 200;
    set BIRTHDAY = CURRENT_TIMESTAMP;
end;

创建存储过程数据集的时候:

1663554942214

其中的SQL代码为:

call SP_PROC_SAMPLE(${$deptId},BRANCH_ID:12,SALARY:7,BIRTHDAY:93)

其中第一个是输入参数deptId, 后面几个是输出参数,冒号后面是数据类型,系统自动生成。

对于这种存储过程实际上返回的只有一条记录,BaskReport会将输出数据取出放置在数据集中。

CURSOR返回

对于一些数据库(例如Oracle)如果我们希望返回一个集合对象,需要定一个一个cursor类型的out参数,对于这种返回参数,我们可以参考如下的SQL:

call SP_PROC_CURSOR(${$DEPT_ID},[P_CUR:cursor])

其中DEPT_ID表示这是一个报表参数,P_CUR表示这是一个cursor的参数。

对于存储过程存在多个cursor类型的输出,目前BaskReport只能将其中的一个cursor的数据作为报表源数据。具体是哪个cursor作为数据源,可以通过中括号指定,例如:

call SP_PROC_CURSORS(${$DEPT_ID},p_cur1:curso,[p_cur2:cursor],p_cur3:cursor)

如上的代码p_cur2被指定为报表数据源

对于一些数据库本身不是通过cursor形式返回数据,而是可以直接通过Statement的getResultSet获得返回结果的,例如上面范例中的mysql,就是利用getResultSet获取返回结果的。sql代码为:

call SP_PROC_EMPLOYEES(${deptId}})

results matching ""

    No results matching ""