DBINFO.MD_MESSAGE(Operation IN, metadata IN/OUT, response OUT)
所有参数都属于 CLOB 类型。 该存储过程有两个输入参数。第一参数是必需的,它指定调用程序希望执行什么操作。这些操作有:DESCRIBE
CREATE
ALTER
RENAME
DROP
IMPORT
VALIDATE
某些操作(象 CREATE 和 IMPORT)需要通过第二个参数将元数据传入这个存储过程。操作 DESCRIBE 通过第二个参数返回元数据。 输出参数 该存储过程的第三个参数是输出参数。对于对该存储过程的每个调用,都会通过第三个参数返回响应文档。然而,假如发生某些严重错误,则不会创建任何输出响应文档。 解析 XML 要使用 API,程序必须构造要传入该存储过程的 XML 文档。还需要解析该存储过程所返回的 XML。 DB2 Cube Views API 使用的 XML 的语法由随该产品一起提供的 XSD 模式文件(位于 sqllib/cfg 目录中)指定。您将使用的 XSD 模式文件如 表 1所示。 表 1. 与输入和输出参数相关联的 XSD 文件API 参数 | 模式文件 |
操作和响应 (第一个和第三个参数) | db2md_parameter.xsd |
元数据(第二个参数) | db2md_metadata.xsd 和 db2md_types.xsd |
/* Calls the DB2 stored procedure passing in the request string
* as the first parameter and the metadata string as the second
* parameter. If xmlRequestString contains a script or no output
* metadata is required the xmlMetadata parameter may be null.
* The outputMetadata boolean controls what is returned by the
* method. If it is true any output metadata is returned. If
* false the response output is returned. */
private String callDB2StoredProc(String xmlRequestString,
String xmlMetadataString,
boolean outputMetadata)
throws OCException,
OCApiException
{
/* Create an SQL command to call the Stored procedure in DB2
* to get the XML */
String sql = "CALL db2info.MD_MESSAGE (?, ?, ?)";
String response = null;
String xmlMetadataResponse = null;
CallableStatement callStmt = null;
try
{
callStmt = auroraCatalogConnection.prepareCall(sql);
/* Set input parameter to request and metadata strings. */
callStmt.setString (1, xmlRequestString);
callStmt.setString (2, xmlMetadataString);
/* Register the output parameters. */
callStmt.registerOutParameter (2, Types.VARCHAR);
callStmt.registerOutParameter (3, Types.VARCHAR);
/* Call the stored procedure */
callStmt.execute();
/* Retrieve output parameters. If the procedure was called with
* a request that returns metadata in the middle parameter then
* xmlMetadataResponse will store the output XML. */
if (outputMetadata == true)
xmlMetadataResponse = callStmt.getString(2);
response = callStmt.getString(3);
/* See if there are any warnings. */
SQLWarning warning = callStmt.getWarnings();
/* If execute returns a warning with a non-zero SQL state
* then the API has had an error and returned some response
* info in the output XML document. */
if (warning != null)
{
OCLog.trace("Stored procedure execute returned a warning.");
OCLog.trace("SQL state: " + warning.getSQLState());
OCLog.trace("SQL state: " + warning.getErrorCode());
/* readResponseFromXML will throw an OCApiException containing
* the error info (which will then be thrown to our caller) or
* it will throw an OCException if a parsing error occurred. If
* for some strange reason the file does not contain error
* info it will just return and then we'll throw an OCException
* to notify the user. */
try { readResponseFromXML(response); }
/* If an API exception was thrown add the SQL state etc to
* it and then throw it again. */
catch (OCApiException apie)
{
apie.setSqlException(warning);
throw apie;
}
/* If we have had a warning we always want to rollback any changes.
* If we have a problem rolling back the exception will be caught
* below. */
finally
{
auroraCatalogConnection.rollback();
}
/* If we got here there must have been a warning with nothing
* in the output XML so throw an exception explaining this. */
throw new OCException("OC_ERR_API_DB2_STORED_PROC_FAIL_NO_INFO");
}
}
/* If we had an error executing the SQL, log the information and
* throw an exception. We also rollback any changes and catch
* the exception if the rollback has a problem. */
catch (SQLException e)
{
OCApiException newe = new OCApiException(e);
OCLog.trace( newe.getMessage() );
logExceptionInfo(e);
try { auroraCatalogConnection.rollback(); }
catch (SQLException e2)
{
OCLog.trace("An exception also occurred rolling back.");
logExceptionInfo(e2);
}
throw newe;
}
读取元数据 在获得成功调用该 API 的一些代码之后,将需要把注重力放在将正确的 XML 传递给该 API,以及能够解析输出 XML。 大多数程序将需要通过使用 DESCRIBE 操作来从 DB2 Cube Views 读取元数据。下面是一些示例: 示例 1. 读取所有元数据 下面是您要使用的操作 XML:<
olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe objectType="all" recurse="no">
</describe>
</olap:request>
注: 调用程序和服务器上的 DB2 存储过程之间的版本号(如 8.1.2.1.0)必须一致。 请注重,应该将请求标记限定为 <olap:request> 。 输出时,第二个参数将返回包含元数据的 CLOB。通常会返回许多对象。假如 DB2 只有一个 Attribute 对象,那么输出元数据 XML 将类似于:<olap:metadata xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<attribute name="FAMILY" schema="MDSAMPLE" businessName="FAMILY"
createTime="2003-04-11T21:28:22" creator="db2admin">
<datatype schema="SYSIBM" name="VARCHAR" length="15" scale="0"/>
<sqlExpression template="{$$1}">
<column name="FAMILY" tableSchema="MDSAMPLE" tableName="FAMILY"/>
</sqlExpression>
</attribute>
</olap:metadata>
假如成功,响应文档将类似于:<olap:response xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe>
<status id="0" text="Operation completed successfully. No errors were encountered."
type="informational"/>
</describe>
</olap:response>
示例 2. 获取特定的多维数据模型及相关对象 下面是您将用来获取 db2admin.MyCubeModel 的多维数据模型及其相关对象的操作 XML:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe objectType="cubeModel"
recurse="yes">
<restriction>
<predicate property="name" operator="=" value="MyCubeModel"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</describe>
</olap:request>
注: Recurse="yes" 告诉 API 返回多维数据模型以及该多维数据模型递归引用的所有对象。 请注重,谓词的运用,谓词指定我们感爱好的多维数据模型。 创建元数据 有两个用于创建新元数据的操作:CREATE 和 IMPORT。在创建新的元数据时,使用 CREATE。假如您想要创建的对象碰巧与现有对象冲突(因为名称相同),则使用 IMPORT。 示例. 在 DB2 Cube Views 中创建一些元数据对象 下面是您要使用的操作 XML:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<create/>
</olap:request>
通过第二个参数以 XML 格式将一个或多个元数据对象传递给存储过程。 改变元数据 有两个用于修改元数据对象的操作:ALTER 和 RENAME。 示例 1. 改变连接对象 ALTER 操作类似于 CREATE,但被传入的元数据对象必须已经存在。由新定义的对象替代原有对象。下面是您要使用的操作 XML:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<alter/>
</olap:request>
对于元数据 XML,传入我们想让它成为的 Join 对象:<join name="ProductFamily" schema="db2admin" businessName="ProductFamily"
type="inner" cardinality="n:1">
<attributeJoin operator="=">
<leftAttributeRef name="FAMILYID" schema="db2admin"/>
<rightAttributeRef name="FAMILYID (FAMILY)" schema="db2admin"/>
</attributeJoin>
</join>
示例 2. 重命名多维数据模型对象 假设我们想要将多维数据模型对象 db2admin.SalesModel 重命名为 db2admin.SalesModel (2003) 。下面是做到这一点的操作 XML:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<rename objectType="cubeModel">
<currentRef name="SalesModel" schema="db2admin"/>
<newRef name="SalesModel (2003)" schema="db2admin"/>
</rename>
</olap:request>
对于重命名,不需要元数据 XML。 删除元数据 用 DROP 操作删除元数据对象。 示例 1:删除 所有元数据对象 执行该操作时必须小心!下面是要使用的操作 XML:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<drop objectType="all"/>
</olap:request>
示例 2. 删除多维数据对象及其相关对象 下面是删除 db2admin.MyCube 及其相关对象的操作 XML。请注重,非凡的 <script> 标记,它可以在一次 API 调用中执行多次删除:<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<script>
<drop objectType="cube">
<restriction>
<predicate property="name" operator="=" value="My Cube"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
<drop objectType="cubeFacts">
<restriction>
<predicate property="name" operator="=" value="Cube Facts (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
<drop objectType="cubeDimension"><restriction>
<predicate property="name" operator="=" value="Market (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction></drop>
<drop objectType="cubeHierarchy">
<restriction><predicate property="name" operator="=" value="Region (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
</script>
</olap:request>
无需传入任何元数据 XML。 调试错误 尽管您必须习惯于消息中如何引用对象的命名约定,但是存储过程中的大多数错误都相当清楚,无需解释。正因如此,您经常不得不相当仔细地阅读消息。 下面是报告错误的 API 响应示例。当我们试图删除已不存在的 Cube 对象( db2admin.My Cube )时,会返回下面的响应。( 请注重:由于空间有限,状态消息被分成两行。)<olap:response xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<drop>
<status id="6006" text="No objects were found matching search criteria:
"objectType=CUBE & name=My Cube & schema=db2admin"." type="warning">
<tokens>
<text value="objectType=CUBE & name=My Cube & schema=db2admin"/>
</tokens>
</status>
</drop>
</olap:response>
跟踪 当发生错误而您又无法断定 API 失败的原因时,通常有必要打开 API 跟踪。从高级别跟踪(信息量最少)开始,仅当绝对需要时才打开中级或低级跟踪(这些级别的信息要具体得多)。 要打开跟踪,请修改配置文件 db2md_config.xml ,如下所示。每个 DB2 实例都有一个这样的文件,可以在实例目录中找到它。在 Windows 上,缺省的 DB2 实例名为“DB2”,可以在 sqllib/DB2/db2md_config.xml 中找到这个配置文件。在下面的 XML 中,已经将跟踪级别设置为 high。<?xml version="1.0" encoding="UTF-8" ?>
<!-- <copyright> -->
<!-- Licensed Materials - Property of IBM -->
<!-- 5724-E15 -->
<!-- (c) Copyright IBM Corp. 2002, 2003 All Rights Reserved. -->
<!-- US Government Users Restricted Rights - Use, duplication or disclosure -->
<!-- restricted by GSA ADP Schedule Contract with IBM Corp. -->
<!-- </copyright> -->
<olap:config xmlns:olap="http://www.ibm.com/olap">
<log>
<trace level="
high" logFile="db2mdtrace.log" bufferSize="0"/>
<error level="medium" logFile="db2mderror.log" bufferSize="0"/>
</log>
</olap:config>
请注重:不要尝试重命名跟踪文件。其名称必须是 db2mdtrace.log 。可以在实例目录中找到跟踪文件 db2mdtrace.log 。 创建元数据桥 元数据桥是将元数据从一种格式映射成另一种格式的软件组件或实用程序。开发桥是为了在第三方商业智能或 OLAP 工具与 DB2 Cube Views 之间交换元数据。 图 3. 元数据桥 例如,IBM 在 DB2 Cube Views 和 IBM DB2 OLAP Server 产品之间提供了桥。更准确地讲,桥在 DB2 Cube Views 和 DB2 OLAP Server 的 OLAP 集成服务器附加功能部件之间交换元数据。 在规划元数据桥时,有许多初始考虑事项。我们将更具体地讨论其中一些问题。 DB2 Cube Views 元数据对象模型与其它格式的对象模型相比,兼容性/相似程度如何? 桥应该是单向的还是双向的? 同时可以映射什么高级别的元数据分组?通常,多维数据模型或多维数据对象(以及所有引用对象)是桥的源或目标。 桥将支持并治理增量元数据更改吗? 将使用何种编程语言? 该编程语言可以使用哪些 XML 解析器? 当使用 DB2 Cube Views 元数据时,桥将调用 API 来读取元数据还是读取导出的元数据 XML 文件? 当产生 DB2 Cube Views 元数据时,桥将调用 API 来创建元数据还是将元数据写入 XML 文件? 映射练习 做映射练习是设计桥的首要步骤。做这个练习的架构设计师或开发人员必须通晓 DB2 Cube Views 元数据对象模型和其它元数据对象模型方面的应用知识。我们建议在原型设计和实现工作开始之前,仔细地记录并复查映射。 如 表 2所示,每个 DB2 Cube Views 对象在进行映射时都有一些需要考虑的公共特性。 表 2. DB2 Cube Views 对象的公共特性特性 | 说明 |
模式 | 当映射到 DB2 Cube Views 时,所有新对象通常都被放入单个模式中。但答应多维数据视图对象引用其它不同模式中的多维数据视图对象。DB2 Cube Views 中每个对象的完整名称由它的模式和名称构成,如 MYSCHEMA.MYATTRIBUTE 。 模式的长度不超过 30 个字节。 |
名称 | 每个 DB2 Cube Views 对象类型都有自己的名称空间,除了 Attribute 和 Measure 共享同一个名称空间。因此,例如,Attribute 和 Join 可以具有同一个完整名称。 至 DB2 Cube Views 的桥通常必须生成一些目标对象的名称。 名称的长度不超过 128 个字节。 |
商业名称 | 最多 128 个字节。 |
注释 | 最多 254 个字节。 |
创建者 | 当映射到 DB2 Cube Views 时不需要。 |
创建时间 | 当映射到 DB2 Cube Views 时不需要。 |
修改者 | 当映射到 DB2 Cube Views 时不需要。 |
修改时间 | 当映射到 DB2 Cube Views 时不需要。 |
对象类型 | 映射说明 |
Attribute | SQL 表达式模板是映射过程中最难的特性,因为它通常需要对表达式进行解析。另外,始于 DB2 Cube Views 的桥需要处理引用其它 Attribute 的 Attribute,并以递归方式遍历所有 Attribute 来确定给定 Attribute 的最终 SQL 表达式。 当映射为 Attribute 时,不需要数据类型特性;当创建该 Attribute 时,由 DB2 多维数据视图确定它。 |
Join | 当映射到 DB2 Cube Views 时创建 Join 很重要,因为它们捕捉构建 Dimension 和 Cube Model 所需的结构信息。 |
Attribute Relationship | 属于 Hierarchy 的一部分。可在较复杂的 Cube Model 中找到它。 |
Measure | 与 Attribute 的问题一样(即 SQL 表达式模板的映射很难)。通常,桥对支持十分复杂的量方面有一些限制。 |
Facts | 一组具有相同维数的 Measure。请注重,需要映射可选的 Attribute 和 Join。 |
Dimension | 当创建 Dimension 时,请确保包括了所有的 Attribute。请注重,Hierarchy 和 Join 是可选的。 |
层次结构 | 请注重,Attribute 列表是经过排序的。还要注重,并不答应所有的类型和部署的组合。有时候,桥在可以映射的层次结构类型方面有一些限制。 |
Cube Model | 它是桥在通常的映射过程中的最高一层对象。假如完全可能的话,至 DB2 Cube Views 的桥应该创建 Cube Model 对象。 |
Cube(和 Cube Facts、Cube Dimension、Cube Hierarchy) | 被映射为 Cube Model 的一部分(假如它有意义的话)。 |
新闻热点
疑难解答