Building OLAP Cubes Using OWB "Paris"

Mark Rittman, April 2005

Oracle Warehouse Builder 10gR2 "Paris", the forthcoming release of Oracle's ETL tool, comes with a host of new features to support the building and maintenance of relational and multdimensional cubes and dimensions. Yesterday, I looked at the process of designing an OLAP dimension using OWB "Paris", and today I'll continue the theme with a look at how a cube is built.

When you license and install the OLAP Option for Oracle Database 10g, you can then go on to create OLAP structures within your database for use with tools such as OracleBI Discoverer for OLAP. A Key part of the OLAP Option is a feature referred to as the Logical Dimensional Model, which in simple terms is a feature that lets you create logical definitions of OLAP cubes, measures, dimensions, attributes and hierarchies to reflect the way that users picture business problems in their mind.

Diagram of the logical multidimensional model.

To take an example, a sales manager would be responsible for maximizing sales (sales being a "measure"), and there could be several factors that contribute to his eventual sales figures, including the type of customers he sells to, the retail outlets he sells through, the mix of products that are available for sale, the types of customers who purchase from him, and so on. In OLAP terms these factors are referred to as "dimensions" and the OLAP Option lets you set up a dimensional model like this in the database.

The way Oracle have implemented OLAP within Oracle 9i and 10g is that this logical dimensional model can then map to data either stored in normal relational tables - each dimension and set of measures then mapping to a set of relational tables - or it can map to specialized multidimensional datatypes held in what's referred to as "analytic workspaces". Depending on the nature of your data you can choose either to store your data relationally (known as relational OLAP, or "ROLAP") or multi-dimensionally (multidimensional OLAP, or "MOLAP"), with relational OLAP being better suited to large data volumes, real-time analysis or where you need to keep multiple versions of your data, and multidimensional OLAP being preferred when response time is at a premium or you have to do some pretty high-end calculations or forecasts.

Earlier versions of Warehouse Builder have supported DBAs and developers in building both relational and multidimensional cubes, but suffered from restrictions in the underlying platform which meant that the process was a bit long-winded and usually involved using tools in addition to Warehouse Builder. To take for example the current release in production, Oracle Warehouse Builder 10.1, if you want to create a relational OLAP cube you first define it in Warehouse Builder, but then switch over to Enterprise Manager to create an additional set of OLAP metadata required for Discoverer for OLAP and BI Beans. If you want to create a multi-dimensional OLAP cube, you first have to create the relational OLAP version, then use an OWB Bridge to export it to an analytic workspace. In most cases, you then had to start up Analytic Workspace Manager and fine-tune the results. To be fair, these restrictions were more down to the platform than OWB, but it meant in practice that most people didn't using OWB when working with the OLAP Option.

If you've managed to keep up with developments on the Oracle Database 10g platform since it was launched back in 2004, you'll probably be aware that there have been some fairly significant developments with the OLAP Option. The most important one is the release with the 10.1.0.3 patchset of the AWXML Java API, which allows the creation and maintenance of multi-dimensional analytic workspace objects using XML templates, and replaces the DBMS_AWM PL/SQL package that came along with the 9.2 release of Analytic Workspace Manager. The key benefit of AWXML, apart from the fact that it allows you to define AW objects using XML files rather than PL/SQL and OLAP DML, is that it does not force you to create a relational OLAP representation of your cube beforehand, and keep this relational cube in place for the life of the multi-dimensional cube, which means that tools like OWB "Paris" that use AWXML are able to give you a completely free hand when choosing the way in which to store your OLAP data.

Channel, Customer, Month and Product dimensions within OWB "Paris"What this all translates into with the "Paris" release of OWB is that you should be able to use the tool to create a logical dimensional model (just like with earlier versions) but then it's down to you whether you store your data as a ROLAP cube or a MOLAP analytic workspace. Moreover, as OWB is designed to work against the latest release of Oracle 10g (currently 10.1.0.4, probably a later version at release) it's aware of all the new 10g OLAP features such as compression and partitioning and exposes all these features in the tool, and it should natively create all the tricky OLAP metadata for your ROLAP cubes that currently has to be done using Enterprise Manager. With these new features in mind, I set out to create an OLAP cube using OWB "Paris".

If you read yesterday's article on creating a dimension using OWB "Paris", you'll have seen me create the Customer dimension that comes as part of the AWM10g Global Sample Schema you can download from OTN. I created relational and multidimensional versions and took a look at the code that OWB generated. Before I start on the cube then, I first of all created all the other dimensions, which for the Global schema were Products, Channel and Time. All of these dimensions had a single hierarchy, and the time dimension was created using the Time Dimension Wizard (hence the little "clock" logo on the dimension). Before going any further I verified the dimensions using OWB and all checked out OK.

The next step to create the cube was to right-click on the "cubes" node and name the dimension, in my case "Units". The first version I created was the relational OLAP version, and like the Dimension Wizard used yesterday, the next question asked is whether I want to create the cube relationally or multidimensionally. Either choice you make, you can change this later on using the Data Object Editor, but in my case I created the relational version first. The next step after this is to select the dimensions that will be part of the cube.

A "cube" in terms of the OLAP Option is the container for measures, and each of these measures has the same dimensionality (i.e. is dimensioned by the same dimensions). When you implement your cube relationally, the cube translates into a single relational table, often referred to as a "fact" table, with columns for each measure and one column for each dimension, to hold the dimension primary key for that fact-dimension combination. When you implement your cube multidimensionally, each measure translates into a "variable", each of which will be dimensioned by your chosen dimensions. In my case, I've chosen all four dimensions that I've created and therefore each of my measures will have these four dimensions.

The next step is to define the measures that go into my cube. In my case I define two measures, "costs" and "units" that will be directly populated by data from my source tables, and another measure, "average price per sale" that I will populate later on using a mapping transformation.

Once I've defined my measures, the wizard confirms my choices and then creates the entries in the design repository.

As with dimensions, you can then go on and edit them in more detail using the Data Object Editor. Before that though, I right-clicked on the cube and selected "Configure" from the context menu.

This is new for this version of OWB and instead of listing out the indexes, partitions and so on for the underlying fact table, it instead lists out the measures in the cube, the dimensions and any measure aggregations (presumably all part of the OLAP Catalog metadata) , and there's a new feature called "Error Tables" that I presume collects data that can't be loaded into the cube. This last bit looks particularly interesting and I'll look at it in more detail at a later date.

Bringing up the data object editor, the layout is similar to the one for my Customer dimension yesterday but with a set of tabs appropriate for a cube.

Again, new with "Paris" is a much improved summary management feature. If you're an OWB 10.1 or earlier user you'll be aware that the support for materialized views is a bit basic. With existing OWB versions you can define a materialized view, but you have to specify the columns manually and then type in the relevant SQL, and there's no support at all for the type of materialized view (created using the DBMS_ODM package) that are required by the OLAP API. "Paris" significantly improves on this and makes summary management much easier.

The first thing that you'll notice when editing your ROLAP cube is that there is now a Summary Strategy tab for the cube, and on this tab you can select the dimension levels that you wish to pre-compute aggregates for. If you choose to pre-compute summaries, "Paris" will generate the relevant DBMS_ODM calls to create the following materialized views:

Each grouping set generated by the CREATE MATERIALIZED VIEW statement identifies a unique combination of levels. With grouping sets, you can summarize your data symmetrically, for example sales at the month level across all levels of geography, or you can summarize it asymmetrically, for example sales at the month level for cities and at the quarter level for states. What this means in reality is that you can create a single materialized view for your fact table that can contain every aggregation point for your cube.

Unfortunately, on the beta version the aggregation feature isn't complete yet :-) so I switched this off for this particular cube. Going back to the main Design Center, I then generated the code to create the ROLAP cube.

/**********************************************************************
-- Product : Oracle Warehouse Builder
-- Generator Version : 10.0.1.1.32
-- Created Date : Thu Apr 14 07:43:11 BST 2005
-- Modified Date : Thu Apr 14 07:43:11 BST 2005
-- Created By : owb_paris
-- Modified By : owb_paris
-- Generated Object Type : TABLE
-- Generated Object Name : UNITS
-- Comments :
-- © 2003 Oracle Corporation. All Rights Reserved.
**********************************************************************/

WHENEVER SQLERROR EXIT FAILURE;

CREATE TABLE "UNITS"
(
"AVG_VAL_OF_SALE" NUMBER,
"UNITS" NUMBER,
"SALES" NUMBER,
"MONTH" NUMBER,
"CHANNEL" NUMBER,
"PRODUCT" NUMBER,
"CUSTOMER" NUMBER)

;

ALTER TABLE "UNITS" ADD
CONSTRAINT "UNITS_CHANNEL" FOREIGN KEY (
"CHANNEL")
REFERENCES "CHANNEL_1"("DIMENSION_KEY");

ALTER TABLE "UNITS" ADD
CONSTRAINT "UNITS_MONTH" FOREIGN KEY (
"MONTH")
REFERENCES "MONTH"("MONTH_DIMENSION_KEY");

ALTER TABLE "UNITS" ADD
CONSTRAINT "UNITS_PRODUCT" FOREIGN KEY (
"PRODUCT")
REFERENCES "PRODUCT_1"("DIMENSION_KEY");

ALTER TABLE "UNITS" ADD
CONSTRAINT "UNITS_CUSTOMER" FOREIGN KEY (
"CUSTOMER")
REFERENCES "CUSTOMER_4"("DIMENSION_KEY");


/**********************************************************************
-- Product : Oracle Warehouse Builder
-- Generator Version : 10.0.1.1.32
-- Created Date : Thu Apr 14 07:42:04 BST 2005
-- Modified Date : Thu Apr 14 07:42:04 BST 2005
-- Created By : owb_paris
-- Modified By : owb_paris
-- Generated Object Type : OLAP CUBE
-- Generated Object Name : UNITS
-- Comments :
-- © 2003 Oracle Corporation. All Rights Reserved.
**********************************************************************/


WHENEVER SQLERROR EXIT FAILURE;

BEGIN
CWM2_OLAP_CUBE.CREATE_CUBE('null', 'UNITS', 'UNITS', 'UNITS', 'null');
CWM2_OLAP_MEASURE.CREATE_MEASURE('null', 'UNITS', 'AVG_VAL_OF_SALE', 'AVG_VAL_OF_SALE', 'AVG_VAL_OF_SALE', 'AVG_VAL_OF_SALE');
CWM2_OLAP_MEASURE.CREATE_MEASURE('null', 'UNITS', 'UNITS', 'UNITS', 'UNITS', 'UNITS');
CWM2_OLAP_MEASURE.CREATE_MEASURE('null', 'UNITS', 'SALES', 'SALES', 'SALES', 'SALES');
CWM2_OLAP_CUBE.ADD_DIMENSION_TO_CUBE('null', 'UNITS', 'null', 'CHANNEL');
CWM2_OLAP_CUBE.ADD_DIMENSION_TO_CUBE('null', 'UNITS', 'null', 'CUSTOMER');
CWM2_OLAP_CUBE.ADD_DIMENSION_TO_CUBE('null', 'UNITS', 'null', 'MONTH');
CWM2_OLAP_CUBE.ADD_DIMENSION_TO_CUBE('null', 'UNITS', 'null', 'PRODUCT');
CWM2_OLAP_TABLE_MAP.MAP_FACTTBL_LEVELKEY ('null','UNITS','null','UNITS','LOWESTLEVEL','DIM:null.MONTH/HIER:CALENDAR_STANDARD/LVL:CALENDAR_MONTH/COL:MONTH;DIM:null.CHANNEL/HIER:STANDARD/LVL:CHANNEL/COL:CHANNEL;DIM:null.PRODUCT/HIER:STANDARD/LVL:ITEM/COL:PRODUCT;DIM:null.CUSTOMER/HIER:STANDARD/LVL:SHIP_TO/COL:CUSTOMER;');
CWM2_OLAP_TABLE_MAP.MAP_FACTTBL_MEASURE ('null','UNITS','AVG_VAL_OF_SALE','null','UNITS','AVG_VAL_OF_SALE','DIM:null.MONTH/HIER:CALENDAR_STANDARD/LVL:CALENDAR_MONTH/COL:MONTH;DIM:null.CHANNEL/HIER:STANDARD/LVL:CHANNEL/COL:CHANNEL;DIM:null.PRODUCT/HIER:STANDARD/LVL:ITEM/COL:PRODUCT;DIM:null.CUSTOMER/HIER:STANDARD/LVL:SHIP_TO/COL:CUSTOMER;');
CWM2_OLAP_TABLE_MAP.MAP_FACTTBL_MEASURE ('null','UNITS','UNITS','null','UNITS','UNITS','DIM:null.MONTH/HIER:CALENDAR_STANDARD/LVL:CALENDAR_MONTH/COL:MONTH;DIM:null.CHANNEL/HIER:STANDARD/LVL:CHANNEL/COL:CHANNEL;DIM:null.PRODUCT/HIER:STANDARD/LVL:ITEM/COL:PRODUCT;DIM:null.CUSTOMER/HIER:STANDARD/LVL:SHIP_TO/COL:CUSTOMER;');
CWM2_OLAP_TABLE_MAP.MAP_FACTTBL_MEASURE ('null','UNITS','SALES','null','UNITS','SALES','DIM:null.MONTH/HIER:CALENDAR_STANDARD/LVL:CALENDAR_MONTH/COL:MONTH;DIM:null.CHANNEL/HIER:STANDARD/LVL:CHANNEL/COL:CHANNEL;DIM:null.PRODUCT/HIER:STANDARD/LVL:ITEM/COL:PRODUCT;DIM:null.CUSTOMER/HIER:STANDARD/LVL:SHIP_TO/COL:CUSTOMER;');
CWM2_OLAP_VALIDATE.VALIDATE_CUBE('null','UNITS');
CWM2_OLAP_METADATA_REFRESH.MR_REFRESH;
END;

Note the calls at the end to the CWM2_OLAP package to create the OLAP Catalog metadata - "Paris" is the first tool to support the CWM2 package (as opposed to the CWM1 package supported by Enterprise Manager) and it's these calls that make your cube available in Discoverer for OLAP and BI Beans.

Now that I'd created the relational version of the cube, I created another project module, recreated the dimensions multidimensionally, then went on to create the cube multdimensionally. The Cube Creation Wizard is exactly the same for both relational and multidimensional storage, but when you come to open up the Data Object Editor, you get different options to reflect the different way that sparsity and aggregation are handled in an analytic workspace.

The first difference is in the Dimensions tab. When you have a MOLAP cube, you are presented with a button marked "Advanced..." that lets you define whether a dimension is sparse or dense, whether you want to use compressed composites, and whether you want to use cube partitioning.

If you mark dimensions as sparse, "Paris" will create a composite, an object that contains valid dimension-value combinations together with an index that links the composite to the variable, and by using a composite to replace several sparse dimensions you can significantly reduce the amount of storage required for a variable. Composites help you to avoid database explosion and have recently been improved again with the introduction of the "compressed composites" feature, that takes particularly sparse dimensions and shrinks the size down again by removing redundant data.

As well as the sparsity handling features, aggregation is handled slightly differently, with options to aggregate on load (i.e. precompute aggregates) or on demand (i.e. on the fly).

Once the MOLAP cube has been defined, "Paris" can then generate the code to create the cube. Like the MOLAP dimension I created yesterday, the code that is generated is a series of calls to DBMS_LOB to create an XML definition of the cube, followed by calls to the AWXML API to create the neccessary objects in the analytic workspace.

/**********************************************************************
-- Product : Oracle Warehouse Builder
-- Generator Version : 10.0.1.1.32
-- Created Date : Thu Apr 14 08:19:10 BST 2005
-- Modified Date : Thu Apr 14 08:19:10 BST 2005
-- Created By : owb_paris
-- Modified By : owb_paris
-- Generated Object Type : CUBE
-- Generated Object Name : UNITS
-- Comments :
-- © 2003 Oracle Corporation. All Rights Reserved.
**********************************************************************/

WHENEVER SQLERROR EXIT FAILURE;

Create or replace view STG_TBLUNITS as select * from dual;
declare
xml_clob clob;
xml_st varchar2(4000);
xml_awcreate_clob clob;
xml_awcreate_st varchar2(4000);
isAW number;
begin
select count(*) into isAW from all_olap2_aws where aw = 'GLOBAL_MOLAP_MODULE';
if (isAW=0) then
DBMS_LOB.CREATETEMPORARY(xml_awcreate_clob,TRUE);
dbms_lob.open(xml_awcreate_clob, DBMS_LOB.LOB_READWRITE);
dbms_lob.writeappend(xml_awcreate_clob, 48, '<?xml version = ''1.0'' encoding = ''ISO-8859-1'' ?>');
dbms_lob.writeappend(xml_awcreate_clob, 43, '<!-- <!DOCTYPE XMI SYSTEM ''Model.dtd'' > -->');
dbms_lob.writeappend(xml_awcreate_clob, 63, '<AWXML version = ''1.0'' timestamp = ''Mon Feb 11 13:29:11 2002'' >');
dbms_lob.writeappend(xml_awcreate_clob, 15, '<AWXML.content>');
dbms_lob.writeappend(xml_awcreate_clob, 25, ' <Create Id="Action55">');
dbms_lob.writeappend(xml_awcreate_clob, 19, ' <ActiveObject >');
dbms_lob.writeappend(xml_awcreate_clob, 163, ' <AW Name="GLOBAL_MOLAP_MODULE" LongName="GLOBAL_MOLAP_MODULE" ShortName="GLOBAL_MOLAP_MODULE" PluralName="GLOBAL_MOLAP_MODULE" Id="GLOBAL_MOLAP_MODULE.AW"/>');
dbms_lob.writeappend(xml_awcreate_clob, 19, ' </ActiveObject>');
dbms_lob.writeappend(xml_awcreate_clob, 11, ' </Create>');
dbms_lob.writeappend(xml_awcreate_clob, 16, '</AWXML.content>');
dbms_lob.writeappend(xml_awcreate_clob, 8, '</AWXML>');
dbms_lob.close(xml_awcreate_clob);
xml_awcreate_st := sys.interactionExecute(xml_awcreate_clob);
end if;
begin
DBMS_AW.EXECUTE('AW DETACH GLOBAL_MOLAP_MODULE');
exception
when others
then
null;
end;
DBMS_AW.EXECUTE('AW ATTACH GLOBAL_MOLAP_MODULE RW');
DBMS_LOB.CREATETEMPORARY(xml_clob,TRUE);
dbms_lob.open(xml_clob, DBMS_LOB.LOB_READWRITE);
dbms_lob.writeappend(xml_clob, 48, '<?xml version = ''1.0'' encoding = ''ISO-8859-1'' ?>');
dbms_lob.writeappend(xml_clob, 43, '<!-- <!DOCTYPE XMI SYSTEM ''Model.dtd'' > -->');
dbms_lob.writeappend(xml_clob, 63, '<AWXML version = ''1.0'' timestamp = ''Mon Feb 11 13:29:11 2002'' >');
dbms_lob.writeappend(xml_clob, 15, '<AWXML.content>');
dbms_lob.writeappend(xml_clob, 55, ' <Attach Id="Action51" AWName="GLOBAL_MOLAP_MODULE"/>');
dbms_lob.writeappend(xml_clob, 25, ' <Create Id="Action52">');
dbms_lob.writeappend(xml_clob, 19, ' <ActiveObject >');
dbms_lob.writeappend(xml_clob, 157, ' <Cube Name="UNITS" LongName="UNITS" ShortName="UNITS" PluralName="UNITS" Id="UNITS.CUBE" UseGlobalIndex="false" SparseType="STANDARD" AutoSolve="YES">');
dbms_lob.writeappend(xml_clob, 29, ' <SourceMappingGroup >');
dbms_lob.writeappend(xml_clob, 142, ' <CubeMapGroup Name="MAPGROUP1" LongName="MAPGROUP1" ShortName="MAPGROUP1" PluralName="MAPGROUP1" Id="UNITS.MAPGROUP1.CUBEMAPGROUP">');
dbms_lob.writeappend(xml_clob, 178, ' <CubeDimensionSourceExpression Name="KeyMap1" LongName="KeyMap1" ShortName="KeyMap1" PluralName="KeyMap1" Id="UNITS.MAPGROUP1.KEYMAP1.CUBEDIMENSIONSOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 198, ' <SourceColumn Name="OBJ898527976" LongName="" ShortName="OBJ898527976" PluralName="OBJ898527976" Id="UNITS.MAPGROUP1.KEYMAP1.OBJ898527976.SOURCECOLUMN" Column="STG_TBLUNITS.CHANNEL"/>');
dbms_lob.writeappend(xml_clob, 59, ' <TargetObject XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 56, ' <Level XMLIDref="CHANNEL.CHANNEL.LEVEL" />');
dbms_lob.writeappend(xml_clob, 44, ' </CubeDimensionSourceExpression>');
dbms_lob.writeappend(xml_clob, 178, ' <CubeDimensionSourceExpression Name="KeyMap2" LongName="KeyMap2" ShortName="KeyMap2" PluralName="KeyMap2" Id="UNITS.MAPGROUP1.KEYMAP2.CUBEDIMENSIONSOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 199, ' <SourceColumn Name="OBJ898527982" LongName="" ShortName="OBJ898527982" PluralName="OBJ898527982" Id="UNITS.MAPGROUP1.KEYMAP2.OBJ898527982.SOURCECOLUMN" Column="STG_TBLUNITS.CUSTOMER"/>');
dbms_lob.writeappend(xml_clob, 60, ' <TargetObject XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 57, ' <Level XMLIDref="CUSTOMER.SHIP_TO.LEVEL" />');
dbms_lob.writeappend(xml_clob, 44, ' </CubeDimensionSourceExpression>');
dbms_lob.writeappend(xml_clob, 178, ' <CubeDimensionSourceExpression Name="KeyMap3" LongName="KeyMap3" ShortName="KeyMap3" PluralName="KeyMap3" Id="UNITS.MAPGROUP1.KEYMAP3.CUBEDIMENSIONSOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 197, ' <SourceColumn Name="OBJ898527988" LongName="" ShortName="OBJ898527988" PluralName="OBJ898527988" Id="UNITS.MAPGROUP1.KEYMAP3.OBJ898527988.SOURCECOLUMN" Column="STG_TBLUNITS.MONTHS"/>');
dbms_lob.writeappend(xml_clob, 58, ' <TargetObject XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 62, ' <Level XMLIDref="MONTHS.CALENDAR_MONTH.LEVEL" />');
dbms_lob.writeappend(xml_clob, 44, ' </CubeDimensionSourceExpression>');
dbms_lob.writeappend(xml_clob, 178, ' <CubeDimensionSourceExpression Name="KeyMap4" LongName="KeyMap4" ShortName="KeyMap4" PluralName="KeyMap4" Id="UNITS.MAPGROUP1.KEYMAP4.CUBEDIMENSIONSOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 198, ' <SourceColumn Name="OBJ898527994" LongName="" ShortName="OBJ898527994" PluralName="OBJ898527994" Id="UNITS.MAPGROUP1.KEYMAP4.OBJ898527994.SOURCECOLUMN" Column="STG_TBLUNITS.PRODUCT"/>');
dbms_lob.writeappend(xml_clob, 59, ' <TargetObject XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 53, ' <Level XMLIDref="PRODUCT.ITEM.LEVEL" />');
dbms_lob.writeappend(xml_clob, 44, ' </CubeDimensionSourceExpression>');
dbms_lob.writeappend(xml_clob, 171, ' <MeasureSourceExpression Name="AttrMap1" LongName="AttrMap1" ShortName="AttrMap1" PluralName="AttrMap1" Id="UNITS.MAPGROUP1.ATTRMAP1.MEASURESOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 197, ' <SourceColumn Name="OBJ898527964" LongName="" ShortName="OBJ898527964" PluralName="OBJ898527964" Id="UNITS.MAPGROUP1.ATTRMAP1.OBJ898527964.SOURCECOLUMN" Column="STG_TBLUNITS.UNITS"/>');
dbms_lob.writeappend(xml_clob, 61, ' <TargetObject XMLIDref="UNITS.UNITS.MEASURE" />');
dbms_lob.writeappend(xml_clob, 38, ' </MeasureSourceExpression>');
dbms_lob.writeappend(xml_clob, 171, ' <MeasureSourceExpression Name="AttrMap2" LongName="AttrMap2" ShortName="AttrMap2" PluralName="AttrMap2" Id="UNITS.MAPGROUP1.ATTRMAP2.MEASURESOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 200, ' <SourceColumn Name="OBJ898527967" LongName="" ShortName="OBJ898527967" PluralName="OBJ898527967" Id="UNITS.MAPGROUP1.ATTRMAP2.OBJ898527967.SOURCECOLUMN" Column="STG_TBLUNITS.AVG_VAL_OF_');
dbms_lob.writeappend(xml_clob, 7, 'SALE"/>');
dbms_lob.writeappend(xml_clob, 71, ' <TargetObject XMLIDref="UNITS.AVG_VAL_OF_SALE.MEASURE" />');
dbms_lob.writeappend(xml_clob, 38, ' </MeasureSourceExpression>');
dbms_lob.writeappend(xml_clob, 171, ' <MeasureSourceExpression Name="AttrMap3" LongName="AttrMap3" ShortName="AttrMap3" PluralName="AttrMap3" Id="UNITS.MAPGROUP1.ATTRMAP3.MEASURESOURCEEXPRESSION">');
dbms_lob.writeappend(xml_clob, 197, ' <SourceColumn Name="OBJ898527970" LongName="" ShortName="OBJ898527970" PluralName="OBJ898527970" Id="UNITS.MAPGROUP1.ATTRMAP3.OBJ898527970.SOURCECOLUMN" Column="STG_TBLUNITS.SALES"/>');
dbms_lob.writeappend(xml_clob, 61, ' <TargetObject XMLIDref="UNITS.SALES.MEASURE" />');
dbms_lob.writeappend(xml_clob, 38, ' </MeasureSourceExpression>');
dbms_lob.writeappend(xml_clob, 25, ' </CubeMapGroup>');
dbms_lob.writeappend(xml_clob, 29, ' </SourceMappingGroup>');
dbms_lob.writeappend(xml_clob, 26, ' <SolveDefinition >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationDefinition Name="OBJ898527973" LongName="" ShortName="OBJ898527973" PluralName="OBJ898527973" Id="UNITS.OBJ898527973.AGGREGATIONDEFINITION" Schema="AW$DEFAULT" AggIndex="NA" Cac');
dbms_lob.writeappend(xml_clob, 26, 'heStore="NA" CacheNa="NA">');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation1" LongName="Relation1" ShortName="Relation1" PluralName="Relation1" Id="UNITS.OBJ898527973.RELATION1.AGGREGATIONHIERARCHYSPECIFICATION"');
dbms_lob.writeappend(xml_clob, 22, ' CalculationOrder="1">');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation2" LongName="Relation2" ShortName="Relation2" PluralName="Relation2" Id="UNITS.OBJ898527973.RELATION2.AGGREGATIONHIERARCHYSPECIFICATION"');
dbms_lob.writeappend(xml_clob, 22, ' CalculationOrder="2">');
dbms_lob.writeappend(xml_clob, 59, ' <Dimension XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation3" LongName="Relation3" ShortName="Relation3" PluralName="Relation3" Id="UNITS.OBJ898527973.RELATION3.AGGREGATIONHIERARCHYSPECIFICATION"');
dbms_lob.writeappend(xml_clob, 22, ' CalculationOrder="3">');
dbms_lob.writeappend(xml_clob, 57, ' <Dimension XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation4" LongName="Relation4" ShortName="Relation4" PluralName="Relation4" Id="UNITS.OBJ898527973.RELATION4.AGGREGATIONHIERARCHYSPECIFICATION"');
dbms_lob.writeappend(xml_clob, 22, ' CalculationOrder="4">');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 34, ' </AggregationDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' </SolveDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' <SolveDefinition >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationDefinition Name="AGGDEF_UNITS_UNITS" LongName="AGGDEF_UNITS_UNITS" ShortName="AGGDEF_UNITS_UNITS" PluralName="AGGDEF_UNITS_UNITS" Id="UNITS.AGGDEF_UNITS_UNITS.AGGREGATIONDEFINIT');
dbms_lob.writeappend(xml_clob, 68, 'ION" Schema="AW$DEFAULT" AggIndex="NA" CacheStore="NA" CacheNa="NA">');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation1" LongName="Relation1" ShortName="Relation1" PluralName="Relation1" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION1.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="1">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION1.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation2" LongName="Relation2" ShortName="Relation2" PluralName="Relation2" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION2.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="2">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION2.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation3" LongName="Relation3" ShortName="Relation3" PluralName="Relation3" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION3.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="3">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION3.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 59, ' <Dimension XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation4" LongName="Relation4" ShortName="Relation4" PluralName="Relation4" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION4.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="4">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_UNITS.RELATION4.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 57, ' <Dimension XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 34, ' </AggregationDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' </SolveDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' <SolveDefinition >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationDefinition Name="AGGDEF_UNITS_AVG_VAL_OF_SALE" LongName="AGGDEF_UNITS_AVG_VAL_OF_SALE" ShortName="AGGDEF_UNITS_AVG_VAL_OF_SALE" PluralName="AGGDEF_UNITS_AVG_VAL_OF_SALE" Id="UNI');
dbms_lob.writeappend(xml_clob, 118, 'TS.AGGDEF_UNITS_AVG_VAL_OF_SALE.AGGREGATIONDEFINITION" Schema="AW$DEFAULT" AggIndex="NA" CacheStore="NA" CacheNa="NA">');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation1" LongName="Relation1" ShortName="Relation1" PluralName="Relation1" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION1.AGGREGATIONHIERARC');
dbms_lob.writeappend(xml_clob, 38, 'HYSPECIFICATION" CalculationOrder="1">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION1.BASE OPERATOR.BASEO');
dbms_lob.writeappend(xml_clob, 23, 'PERATOR" opcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation2" LongName="Relation2" ShortName="Relation2" PluralName="Relation2" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION2.AGGREGATIONHIERARC');
dbms_lob.writeappend(xml_clob, 38, 'HYSPECIFICATION" CalculationOrder="2">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION2.BASE OPERATOR.BASEO');
dbms_lob.writeappend(xml_clob, 23, 'PERATOR" opcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation3" LongName="Relation3" ShortName="Relation3" PluralName="Relation3" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION3.AGGREGATIONHIERARC');
dbms_lob.writeappend(xml_clob, 38, 'HYSPECIFICATION" CalculationOrder="3">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION3.BASE OPERATOR.BASEO');
dbms_lob.writeappend(xml_clob, 23, 'PERATOR" opcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 59, ' <Dimension XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation4" LongName="Relation4" ShortName="Relation4" PluralName="Relation4" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION4.AGGREGATIONHIERARC');
dbms_lob.writeappend(xml_clob, 38, 'HYSPECIFICATION" CalculationOrder="4">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.RELATION4.BASE OPERATOR.BASEO');
dbms_lob.writeappend(xml_clob, 23, 'PERATOR" opcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 57, ' <Dimension XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 34, ' </AggregationDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' </SolveDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' <SolveDefinition >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationDefinition Name="AGGDEF_UNITS_SALES" LongName="AGGDEF_UNITS_SALES" ShortName="AGGDEF_UNITS_SALES" PluralName="AGGDEF_UNITS_SALES" Id="UNITS.AGGDEF_UNITS_SALES.AGGREGATIONDEFINIT');
dbms_lob.writeappend(xml_clob, 68, 'ION" Schema="AW$DEFAULT" AggIndex="NA" CacheStore="NA" CacheNa="NA">');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation1" LongName="Relation1" ShortName="Relation1" PluralName="Relation1" Id="UNITS.AGGDEF_UNITS_SALES.RELATION1.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="1">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_SALES.RELATION1.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation2" LongName="Relation2" ShortName="Relation2" PluralName="Relation2" Id="UNITS.AGGDEF_UNITS_SALES.RELATION2.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="2">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_SALES.RELATION2.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 58, ' <Dimension XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation3" LongName="Relation3" ShortName="Relation3" PluralName="Relation3" Id="UNITS.AGGDEF_UNITS_SALES.RELATION3.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="3">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_SALES.RELATION3.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 59, ' <Dimension XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 39, ' <CalculationSpecification >');
dbms_lob.writeappend(xml_clob, 200, ' <AggregationHierarchySpecification Name="Relation4" LongName="Relation4" ShortName="Relation4" PluralName="Relation4" Id="UNITS.AGGDEF_UNITS_SALES.RELATION4.AGGREGATIONHIERARCHYSPECIFIC');
dbms_lob.writeappend(xml_clob, 28, 'ATION" CalculationOrder="4">');
dbms_lob.writeappend(xml_clob, 38, ' <AggregationOperator >');
dbms_lob.writeappend(xml_clob, 200, ' <BaseOperator Name="Base Operator" LongName="Base Operator" ShortName="Base Operator" PluralName="Base Operator" Id="UNITS.AGGDEF_UNITS_SALES.RELATION4.BASE OPERATOR.BASEOPERATOR" o');
dbms_lob.writeappend(xml_clob, 13, 'pcode="SUM"/>');
dbms_lob.writeappend(xml_clob, 38, ' </AggregationOperator>');
dbms_lob.writeappend(xml_clob, 57, ' <Dimension XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 50, ' </AggregationHierarchySpecification>');
dbms_lob.writeappend(xml_clob, 39, ' </CalculationSpecification>');
dbms_lob.writeappend(xml_clob, 34, ' </AggregationDefinition>');
dbms_lob.writeappend(xml_clob, 26, ' </SolveDefinition>');
dbms_lob.writeappend(xml_clob, 92, ' <DefaultAggregationDefinition XMLIDref="UNITS.OBJ898527973.AGGREGATIONDEFINITION" />');
dbms_lob.writeappend(xml_clob, 153, ' <CubeDimRef Name="OBJ898527972" LongName="" ShortName="OBJ898527972" PluralName="OBJ898527972" Id="UNITS.OBJ898527972.CUBEDIMREF" Sparse="true">');
dbms_lob.writeappend(xml_clob, 52, ' <Dimension XMLIDref="CHANNEL.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 21, ' </CubeDimRef>');
dbms_lob.writeappend(xml_clob, 153, ' <CubeDimRef Name="OBJ898527979" LongName="" ShortName="OBJ898527979" PluralName="OBJ898527979" Id="UNITS.OBJ898527979.CUBEDIMREF" Sparse="true">');
dbms_lob.writeappend(xml_clob, 53, ' <Dimension XMLIDref="CUSTOMER.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 21, ' </CubeDimRef>');
dbms_lob.writeappend(xml_clob, 154, ' <CubeDimRef Name="OBJ898527985" LongName="" ShortName="OBJ898527985" PluralName="OBJ898527985" Id="UNITS.OBJ898527985.CUBEDIMREF" Sparse="false">');
dbms_lob.writeappend(xml_clob, 51, ' <Dimension XMLIDref="MONTHS.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 21, ' </CubeDimRef>');
dbms_lob.writeappend(xml_clob, 153, ' <CubeDimRef Name="OBJ898527991" LongName="" ShortName="OBJ898527991" PluralName="OBJ898527991" Id="UNITS.OBJ898527991.CUBEDIMREF" Sparse="true">');
dbms_lob.writeappend(xml_clob, 52, ' <Dimension XMLIDref="PRODUCT.DIMENSION" />');
dbms_lob.writeappend(xml_clob, 21, ' </CubeDimRef>');
dbms_lob.writeappend(xml_clob, 200, ' <Measure Name="UNITS" LongName="UNITS" ShortName="UNITS" PluralName="UNITS" Id="UNITS.UNITS.MEASURE" DataType="Decimal" isInternal="false" UseGlobalIndex="false" ForceCalc="false" ForceOrder=');
dbms_lob.writeappend(xml_clob, 50, '"false" SparseType="STANDARD" AutoSolve="DEFAULT">');
dbms_lob.writeappend(xml_clob, 87, ' <solveDefinition XMLIDref="UNITS.AGGDEF_UNITS_UNITS.AGGREGATIONDEFINITION" />');
dbms_lob.writeappend(xml_clob, 18, ' </Measure>');
dbms_lob.writeappend(xml_clob, 200, ' <Measure Name="AVG_VAL_OF_SALE" LongName="AVG_VAL_OF_SALE" ShortName="AVG_VAL_OF_SALE" PluralName="AVG_VAL_OF_SALE" Id="UNITS.AVG_VAL_OF_SALE.MEASURE" DataType="Decimal" isInternal="false" Us');
dbms_lob.writeappend(xml_clob, 100, 'eGlobalIndex="false" ForceCalc="false" ForceOrder="false" SparseType="STANDARD" AutoSolve="DEFAULT">');
dbms_lob.writeappend(xml_clob, 97, ' <solveDefinition XMLIDref="UNITS.AGGDEF_UNITS_AVG_VAL_OF_SALE.AGGREGATIONDEFINITION" />');
dbms_lob.writeappend(xml_clob, 18, ' </Measure>');
dbms_lob.writeappend(xml_clob, 200, ' <Measure Name="SALES" LongName="SALES" ShortName="SALES" PluralName="SALES" Id="UNITS.SALES.MEASURE" DataType="Decimal" isInternal="false" UseGlobalIndex="false" ForceCalc="false" ForceOrder=');
dbms_lob.writeappend(xml_clob, 50, '"false" SparseType="STANDARD" AutoSolve="DEFAULT">');
dbms_lob.writeappend(xml_clob, 87, ' <solveDefinition XMLIDref="UNITS.AGGDEF_UNITS_SALES.AGGREGATIONDEFINITION" />');
dbms_lob.writeappend(xml_clob, 18, ' </Measure>');
dbms_lob.writeappend(xml_clob, 13, ' </Cube>');
dbms_lob.writeappend(xml_clob, 19, ' </ActiveObject>');
dbms_lob.writeappend(xml_clob, 11, ' </Create>');
dbms_lob.writeappend(xml_clob, 55, ' <Commit Id="Action53" AWName="GLOBAL_MOLAP_MODULE"/>');
dbms_lob.writeappend(xml_clob, 55, ' <Detach Id="Action54" AWName="GLOBAL_MOLAP_MODULE"/>');
dbms_lob.writeappend(xml_clob, 16, '</AWXML.content>');
dbms_lob.writeappend(xml_clob, 8, '</AWXML>');
dbms_lob.close(xml_clob);
xml_st := sys.interactionExecute(xml_clob);
end;

/

To recap then, what we've done here is create an OLAP cube, a container for our dimensions with references to a set of dimensions, and deployed it relationally and multidimensionally. What's new here with "Paris" is that, for relational cubes, it creates all the OLAP Catalog metadata and gives you the ability to point and click and create OLAP API materialized views; for multidimensional cubes, you don't have to go through the process of creating the cube relationally first (and keep that cube maintained), and it supports new features such as compression, partitioning and the new AWXML Java API.