CREATE OR REPLACE FUNCTION GET_AV_QUERY(
p_av_name VARCHAR2,
p_depth INT)
return varchar2
AS
--
v_sql VARCHAR2(20000);
v_select_list VARCHAR2(2000);
v_meas_list VARCHAR2(2000);
v_hier_list VARCHAR2(2000);
v_where_list VARCHAR2(2000);
v_order_by VARCHAR2(2000);
v_hier_count INT;
v_base_count INT;
v_calc_count INT;
v_i INT;
--
CURSOR c1
IS
SELECT a.analytic_view_name,
a.dimension_alias,
a.dimension_type,
b.hier_alias,
c.level_name,
c.order_num
FROM user_analytic_view_dimensions a,
user_analytic_view_hiers b,
user_analytic_view_levels c
WHERE a.dimension_alias = b.dimension_alias
AND b.hier_alias = c.hier_alias
AND b.is_default ='Y'
AND a.analytic_view_name = upper(p_av_name)
AND b.analytic_view_name = upper(p_av_name)
AND c.analytic_view_name = upper(p_av_name);
--
CURSOR c2
IS
SELECT measure_name
FROM user_analytic_view_base_meas
WHERE analytic_view_name = upper(p_av_name);
--
CURSOR c3
IS
SELECT measure_name
FROM user_analytic_view_calc_meas
WHERE analytic_view_name = upper(p_av_name);
--
BEGIN
--
v_select_list := '';
v_hier_list := '';
--
-- Get a count of the number of hierachies to be included in the query.
--
v_hier_count := 0;
FOR v_c1 IN c1
LOOP
IF v_c1.order_num = p_depth THEN
v_hier_count := v_hier_count + 1;
END IF;
END LOOP;
--
-- Loop over hierarchies and build the select list, hierarchy list, where
-- clause and order by.
--
v_i := 1;
--
FOR v_c1 IN c1
LOOP
IF v_c1.order_num = p_depth THEN
--
IF v_i < v_hier_count THEN
-- Not the last hierarchy, so add a comma.
v_select_list := v_select_list || chr(10) || ' ' || lower(v_c1.hier_alias) || '.member_name AS ' || v_c1.hier_alias || ',';
v_hier_list := v_hier_list || chr(10) || ' ' || lower(v_c1.hier_alias) || ',';
v_order_by := v_order_by || chr(10) || ' ' || lower(v_c1.hier_alias) || '.hier_order,';
ELSE
-- The last hierarchy, so no comma for the hier list and order by.
v_select_list := v_select_list || chr(10) || ' ' || lower(v_c1.hier_alias) || '.member_name AS ' || v_c1.hier_alias || ',';
v_hier_list := v_hier_list || chr(10) || ' ' || lower(v_c1.hier_alias);
v_order_by := v_order_by || chr(10) || ' ' || lower(v_c1.hier_alias) || '.hier_order';
END IF;
--
--
IF v_i = 1 THEN
-- First hierarchy does not include AND.
v_where_list := ' ' || lower(v_c1.hier_alias) || '.level_name = ' || '''' || v_c1.level_name || '''';
ELSE
-- Alll but first hierachy includes AND
v_where_list := v_where_list || chr(10) ||' AND ' || lower(v_c1.hier_alias) || '.level_name = ' || '''' || v_c1.level_name || '''';
END IF;
--
v_i := v_i + 1;
--
END IF;
END LOOP;
--
-- Get a count of base measures.
--
v_base_count := 0;
FOR v_c2 IN c2
LOOP
v_base_count := v_base_count + 1;
END LOOP;
--
-- Get a count of calc measures.
--
v_calc_count := 0;
FOR v_c3 IN c3
LOOP
v_calc_count := v_calc_count + 1;
END LOOP;
--
-- Build the list of base measures.
--
v_i := 1;
FOR v_c2 IN c2
LOOP
IF v_i < v_base_count OR v_calc_count >= 1 THEN
-- Add comma at the end.
v_meas_list := v_meas_list || chr(10) || ' ' || lower(v_c2.measure_name) || ',';
ELSE
-- Do not add comma at the end.
v_meas_list := v_meas_list || chr(10) || ' ' || lower(v_c2.measure_name);
END IF;
v_i := v_i + 1;
END LOOP;
--
-- Add calc measures to the measure list
--
v_i := 1;
FOR v_c3 IN c3
LOOP
IF v_i < v_calc_count THEN
-- Add comma at the end.
v_meas_list := v_meas_list || chr(10) || ' ' || lower(v_c3.measure_name) || ',';
ELSE
-- Do not add comma at the end.
v_meas_list := v_meas_list || chr(10) || ' ' || lower(v_c3.measure_name);
END IF;
v_i := v_i + 1;
END LOOP;
--
-- Assemble the SELECT statement.
--
v_sql := 'SELECT' || v_select_list || v_meas_list || chr(10) || 'FROM' || chr(10) || ' ' || lower(p_av_name) || ' HIERARCHIES (' || v_hier_list || ')' || chr(10) || 'WHERE' || chr(10) || v_where_list || chr(10) || 'ORDER BY' || v_order_by;
--
-- dbms_output.put_line(v_sql || ';
--');
return v_sql;
--
END GET_AV_QUERY;
Function created.
SELECT get_av_query('SH_SALES_HISTORY_AV',0) FROM dual
GET_AV_QUERY('SH_SALES_HISTORY_AV',0) |
---|
SELECT sh_times_calendar_hier.member_name AS SH_TIMES_CALENDAR_HIER, sh_products_hier.member_name AS SH_PRODUCTS_HIER, sh_customers_hier.member_name AS SH_CUSTOMERS_HIER, sh_channels_hier.member_name AS SH_CHANNELS_HIER, sh_promotions_hier.member_name AS SH_PROMOTIONS_HIER, amount_sold, quantity_sold, amt_sold_shr_parent_prod, sales_shr_parent_cust, sales_cal_ytd, sales_cal_year_ago, sales_chg_cal_year_ago, sales_pctchg_cal_year_ago, sales_fis_ytd, sales_fis_year_ago, sales_chg_fis_year_ago, sales_pctchg_fis_year_ago FROM sh_sales_history_av HIERARCHIES ( sh_times_calendar_hier, sh_products_hier, sh_customers_hier, sh_channels_hier, sh_promotions_hier) WHERE sh_times_calendar_hier.level_name = 'CALENDAR_YEAR' AND sh_products_hier.level_name = 'CATEGORY' AND sh_customers_hier.level_name = 'REGION' AND sh_channels_hier.level_name = 'CHANNEL_CLASS' AND sh_promotions_hier.level_name = 'CATEGORY' ORDER BY sh_times_calendar_hier.hier_order, sh_products_hier.hier_order, sh_customers_hier.hier_order, sh_channels_hier.hier_order, sh_promotions_hier.hier_order |
SELECT
sh_times_calendar_hier.member_name AS SH_TIMES_CALENDAR_HIER,
sh_products_hier.member_name AS SH_PRODUCTS_HIER,
sh_customers_hier.member_name AS SH_CUSTOMERS_HIER,
sh_channels_hier.member_name AS SH_CHANNELS_HIER,
sh_promotions_hier.member_name AS SH_PROMOTIONS_HIER,
amount_sold,
quantity_sold
FROM
sh_sales_history_av HIERARCHIES (
sh_times_calendar_hier,
sh_products_hier,
sh_customers_hier,
sh_channels_hier,
sh_promotions_hier)
WHERE
sh_times_calendar_hier.level_name = 'CALENDAR_YEAR'
AND sh_products_hier.level_name = 'CATEGORY'
AND sh_customers_hier.level_name = 'REGION'
AND sh_channels_hier.level_name = 'CHANNEL_CLASS'
AND sh_promotions_hier.level_name = 'CATEGORY'
ORDER BY
sh_times_calendar_hier.hier_order,
sh_products_hier.hier_order,
sh_customers_hier.hier_order,
sh_channels_hier.hier_order,
sh_promotions_hier.hier_order
SH_TIMES_CALENDAR_HIER | SH_PRODUCTS_HIER | SH_CUSTOMERS_HIER | SH_CHANNELS_HIER | SH_PROMOTIONS_HIER | AMOUNT_SOLD | QUANTITY_SOLD |
---|---|---|---|---|---|---|
1998 | Electronics | Americas | Direct | NO PROMOTION | 643798.68 | 4018 |
1998 | Electronics | Americas | Direct | internet | 44684.05 | 339 |
1998 | Electronics | Americas | Direct | post | 1617.98 | 202 |
1998 | Electronics | Americas | Indirect | NO PROMOTION | 88891.6 | 160 |
1998 | Electronics | Americas | Indirect | internet | 5498.24 | 10 |
1998 | Electronics | Americas | Others | NO PROMOTION | 166915.85 | 844 |
1998 | Electronics | Americas | Others | internet | 23318.72 | 139 |
1998 | Electronics | Asia | Direct | NO PROMOTION | 98384.36 | 519 |
1998 | Electronics | Asia | Direct | internet | 7420.76 | 44 |
1998 | Electronics | Asia | Indirect | NO PROMOTION | 15538 | 28 |
1998 | Electronics | Asia | Indirect | internet | 1090.61 | 2 |
1998 | Electronics | Asia | Others | NO PROMOTION | 38183.94 | 179 |
1998 | Electronics | Asia | Others | internet | 6065.65 | 36 |
1998 | Electronics | Europe | Direct | NO PROMOTION | 419368.12 | 2326 |
1998 | Electronics | Europe | Direct | internet | 31327.49 | 203 |
1998 | Electronics | Europe | Direct | post | 71.91 | 9 |
1998 | Electronics | Europe | Indirect | NO PROMOTION | 34785.67 | 63 |
1998 | Electronics | Europe | Indirect | internet | 2724.63 | 5 |
1998 | Electronics | Europe | Others | NO PROMOTION | 60981.12 | 313 |
1998 | Electronics | Europe | Others | internet | 5067.67 | 40 |
1998 | Electronics | Oceania | Direct | NO PROMOTION | 54357.38 | 283 |
1998 | Electronics | Oceania | Direct | internet | 5158.6 | 26 |
1998 | Electronics | Oceania | Direct | post | 7.99 | 1 |
1998 | Electronics | Oceania | Indirect | NO PROMOTION | 6054.63 | 11 |
1998 | Electronics | Oceania | Indirect | internet | 1633.47 | 3 |
1998 | Electronics | Oceania | Others | NO PROMOTION | 12073.99 | 46 |
1998 | Electronics | Oceania | Others | internet | 667.76 | 4 |
1998 | Hardware | Americas | Direct | NO PROMOTION | 1853529.36 | 1264 |
1998 | Hardware | Americas | Direct | internet | 119797.78 | 75 |
1998 | Hardware | Americas | Indirect | NO PROMOTION | 547492.79 | 414 |
1998 | Hardware | Americas | Indirect | internet | 30681 | 22 |
1998 | Hardware | Americas | Others | NO PROMOTION | 979055.34 | 673 |
1998 | Hardware | Americas | Others | internet | 62226.9 | 39 |
1998 | Hardware | Asia | Direct | NO PROMOTION | 388775.99 | 260 |
1998 | Hardware | Asia | Direct | internet | 30883.44 | 19 |
1998 | Hardware | Asia | Indirect | NO PROMOTION | 122427.76 | 91 |
1998 | Hardware | Asia | Indirect | internet | 7004.81 | 5 |
1998 | Hardware | Asia | Others | NO PROMOTION | 266459.95 | 183 |
1998 | Hardware | Asia | Others | internet | 17074.32 | 11 |
1998 | Hardware | Europe | Direct | NO PROMOTION | 1260257.57 | 854 |
1998 | Hardware | Europe | Direct | internet | 80109.52 | 49 |
1998 | Hardware | Europe | Indirect | NO PROMOTION | 238728.03 | 179 |
1998 | Hardware | Europe | Indirect | internet | 6526.75 | 5 |
1998 | Hardware | Europe | Others | NO PROMOTION | 478954.42 | 325 |
1998 | Hardware | Europe | Others | internet | 21454.09 | 14 |
1998 | Hardware | Oceania | Direct | NO PROMOTION | 188287.87 | 133 |
1998 | Hardware | Oceania | Direct | internet | 17594.51 | 11 |
1998 | Hardware | Oceania | Indirect | NO PROMOTION | 53968.27 | 40 |
1998 | Hardware | Oceania | Others | NO PROMOTION | 68254.03 | 44 |
1998 | Hardware | Oceania | Others | internet | 5991.42 | 4 |