|
Oracle BI Publisher Tip
Dynamic Queries using Data Templates
|
|
This article describes how you can get a dynamic query to your database using Data Templates and a Database Package. The language SQL offers much functionality for queries, but with growing dynamic even the complexity growths. The following describes a simple example from which it's easy to transfer for more complex requirements.
Goal is a Master-Detail-Report (departments with employees) with some multi-selection parameters:
<dataTemplate name="DynamicQuery" description="Test" defaultPackage="BIP_DynamicQuery">
<parameters>
<parameter name="p_deptno" datatype="char"/>
<parameter name="p_year" datatype="char"/>
<parameter name="p_job" datatype="char"/>
</parameters>
<dataQuery>
<sqlStatement name="QueryDept">
SELECT DEPTNO AS MASTERDEPTNO,DNAME,LOC
FROM DEPT
&deptwhereclause
ORDER BY DNAME
</sqlStatement>
<sqlStatement name="QueryEmp">
SELECT EMPNO,ENAME,JOB,HIREDATE
FROM EMP
WHERE DEPTNO = :MASTERDEPTNO &empwhereclause
ORDER BY ENAME
</sqlStatement>
</dataQuery>
<dataTrigger name="beforeReport" source="BIP_DynamicQuery.BeforeReport"/>
<dataStructure>
<group name="G_DEPT" source="QueryDept">
<element name="DEPTNO" value="MASTERDEPTNO"/>
<element name="DNAME" value="DNAME"/>
<element name="LOC" value="LOC"/>
<group name="G_EMP" source="QueryEmp">
<element name="EMPNO" value="EMPNO"/>
<element name="ENAME" value="ENAME"/>
<element name="JOB" value="JOB"/>
<element name="HIREDATE" value="HIREDATE"/>
</group>
</group>
</dataStructure>
</dataTemplate>
//-- Package Spezification
//-- lexical Parameter
//-- Report Parameter
create or replace package BIP_DynamicQuery as
deptwhereclause varchar2(1000) := ' ';
empwhereclause varchar2(1000) := ' ';
p_deptno varchar2(400);
p_year varchar2(400);
p_job varchar2(400);
function BeforeReport return boolean;
end BIP_DynamicQuery;
//-- Package Body
create or replace package body BIP_DynamicQuery as
function BeforeReport return boolean is
begin
if p_deptno is not null then
deptwhereclause := 'WHERE DEPTNO IN ('||p_deptno||')';
end if;
if p_year is not null then
empwhereclause := 'AND TO_CHAR(HIREDATE,''YY'') in ('||p_year||')';
end if;
if p_job is not null then
if instr(p_job,',')>0 then
empwhereclause := empwhereclause || ' AND JOB in ('||p_job||')';
else
empwhereclause := empwhereclause || ' AND JOB = '''||p_job||'''';
end if;
end if;
return true;
end;
end BIP_DynamicQuery;
