-
tangmq 数据达人Lv4
发表于2019-12-10 16:30
声明:由于本人是数据库残障人士,所以写的例子相对简单,目的在于传达存储过程如何实现在BI的sql数据源中调用的过程;存储过程的高深问题暂且抱歉,请另行百度!
>>需求目标<<
BI报表数据源,为存储过程的结果集。存储结果集有两个输入参数,从BI计算参数传入;
即:BI选择计算参数,参数值传给存储过程,显示参数所选择的数据,表格设计如下图:
>>第一步:自定义游标类型<<
- CREATE OR REPLACE PACKAGE types
- AS
- TYPE ref_cursor IS REF CURSOR;
- END;
>>第二步:定义存储过程<<
- create or replace procedure tmq_testsql(p1 in varchar,p2 in varchar,P_Result OUT types.ref_cursor)
- as
- begin
- OPEN P_Result FOR
- select a.xzqh xzqh ,a.bbq_ bbq,sum(a.fy) je from fact_fy a where substr(a.xzqh,1,2)= p1 and a.bbq_=p2 group by a.xzqh,a.bbq_;
- end tmq_testsql ;
上文注解:
存储过程名:tmq_testsql
传入参数定义:p1 in varchar,p2 in varchar (原因,报表上有两个计算参数 @xzqh @bbq 需要传入存储过程)
定义输出游标名:P_Result OUT types.ref_cursor (此处ref_cursor,为上文自定义游标类型名);
P_Result是一个输出参数,返回一个结果集,下面的分析需要对这个返回的结果集进行展示;
定义游标结果集:OPEN P_Result FOR 后面跟sql语句,将sql查询的结果,赋予给输出游标P_Result ;
SQL主体:select 语句就不多做阐述,就是返回的结果集的查询语句,需要注意的是where条件后面,需要把输入参数 p1 和 p2,带入到过滤中;
>>第三步:BI添加sql数据源<<
如下图所示,添加一个sql数据源,定义:{call tmq_testsql('<#=left(@xzqh,2)#>','<#=@bbq#>',$cursor)}
p1:接收行政区划参数值<#=left(@xzqh,2)#>
p2:接收年月参数值<#=@bbq#>
(p1 p2 即时上文存储过程中所定义的输入参数)
>>第四步:BI报表取数和计算结果预览<<
报表设计步骤,与普通取数定义雷同,设计结果如下:
选择河北省2014年9月,就可以发现,调用存储过程的时候{call tmq_testsql('13','201409',$cursor)}传入了参数,并按照要求返回了结果,如下图
6个回答
本帖最后由 tangmq 于 2020-1-6 17:37 编辑
【BI47】如果是sql server 数据库,需要在数据库驱动包里面要加个class文件
调用语句:{call vip_sale2000('<#=@begindate#>','<#=@enddate#>')}
【BI46】的补丁,请前往7楼
【BI42】如果是该版本需要调用SqlServer数据库的存储过程,需要打两处补丁
如上图,zip补丁打入到war包中(打补丁方法,解压zip,将补丁文件替换到war包同路径下的同名文件)
class补丁,打到war包lib下的,esen_jdbc_1.2.3.jar 中的 \com\esen\jdbc\SqlExecuter.class
补丁附件:
本帖最后由 leiz 于 2020-1-6 17:30 编辑
【BI46】如果是sql server 数据库,需要在数据库驱动包里面要加个class文件
war包下,lib文件夹下,esen_jdbc_1.2.4.jar 中的 \com\esen\jdbc\SqlExecuter.class
tangmq 发表于 2019-12-25 11:06
【BI47】如果是sql server 数据库,需要在数据库驱动包里面要加个class文件
war包下,lib文件夹下,esen_jd ...
【BI46】如果是sql server 数据库,需要在数据库驱动包里面要加个class文件
替换war包下,lib文件夹下,esen_jdbc_1.2.4.jar 中的 \com\esen\jdbc\SqlExecuter.class