db2-xdb:condition decomposition annotation
The db2-xdb:condition annotation specifies a condition that determines if a row will be inserted into a table. A row that satisfies the condition might be inserted (depending on other conditions for the rowSet, if any); a row that does not satisfy the condition will not be inserted.
db2-xdb:condition belongs to the set of decomposition annotations that can be added to an XML schema document to describe the mappings between elements and attributes of XML documents to Db2® base tables. The decomposition process uses the annotated XML schema to determine how elements and attributes of an XML document should be decomposed into Db2 tables.
Annotation type
Attribute of <xs:element> or <xs:attribute>, or optional child element of <db2-xdb:rowSetMapping>. Condition is applied regardless of whether the annotation to which it belongs contains a column mapping.
How to specify
<xs:element db2-xdb:condition="value" />
<xs:attribute db2-xdb:condition="value" />
<db2-xdb:rowSetMapping> <db2-xdb:rowSet>value</db2-xdb:rowSet> <db2-xdb:condition>value</db2-xdb:condition> ... </db2-xdb:rowSetMapping>
Namespace
http://www.ibm.com/xmlns/prod/db2/xdb1
Valid values
SQL predicates of the following types: basic, quantified, BETWEEN, EXISTS, IN, IS VALIDATED, LIKE, NULL, and XMLEXISTS. The predicates must also consist of expressions that are supported by the db2-xdb:expression annotation, column names or both.
Details
The db2-xdb:condition annotation enables you to specify conditions under which values are inserted into the database during decomposition. This annotation filters rows by applying user-specified conditions. The rows that satisfy the specified conditions are inserted into the database; rows that do not meet the conditions are not inserted during decomposition.
If the db2-xdb:condition annotation is specified on multiple element or attribute declarations of the same rowSet, then the row will be inserted only when the logical AND of all conditions evaluate to true.
Column names in db2-xdb:condition
Because db2-xdb:condition consists of SQL predicates, column names can be specified in this annotation. If a db2-xdb:condition annotation involving a rowSet contains an unqualified column name, there must exist a mapping to that column among all of the mappings involving that rowSet. Other column names, when used in predicates containing SELECT statements, must be qualified. If db2-xdb:condition specifies an unqualified column name, but the element or attribute for which db2-xdb:condition is specified does not have a column mapping specified, then when the condition is evaluated, the value that is evaluated is the content of the element or attribute that maps to the referenced column name.
<xs:element name="a" type="xs:string"
db2-xdb:rowSet="rowSetA" db2-xdb:condition="columnX='abc'" />
<xs:element name="b" type="xs:string"
db2-xdb:rowSet="rowSetB" db2-xdb:column="columnX" />
Notice
that <a> does not have a column mapping specified, but the condition
references the column "columnX". When the condition is evaluated,
"columnX" in the condition will be replaced with the value from <b>,
because <b> has specified a column mapping for "columnX", while <a>
does not have a column mapping. If the XML document contained: <a>abc</a>
<b>def</b>
then the condition would evaluate
to false in this case, because the value from <b>, "def", is
evaluated in the condition.<xs:element name="a" type="xs:string"
db2-xdb:rowSet="rowSetA" db2-xdb:condition="$DECOMP_CONTENT='abc'" />
<xs:element name="b" type="xs:string"
db2-xdb:rowSet="rowSetB" db2-xdb:column="columnX" />
If
the XML document contained: <a>abc</a>
<b>def</b>
then the condition would evaluate
to true in this case, because the value from <a>, "abc", is
used in the evaluation.This conditional processing, using column names and $DECOMP_CONTENT, can be useful in cases where you want to decompose only a value based on the value of another element or attribute that will not be inserted into the database.
Conditions specified on mapped elements or attributes absent from the document
<xs:element name="intElem" type="xs:integer"
db2-xdb:rowSet="rowSetA" db2-xdb:column="colInt"
db2-xdb:condition="colInt > 100" default="0" />
If
the <intElem> element does not appear in the XML document, the
condition "colInt > 100" is still evaluated. Because <intElem>
does not appear, a default value of 0 is used in the condition evaluation
for "colInt". The condition is then evaluated as: 0 > 100, which
evaluates to false. The corresponding row is therefore not inserted
during decomposition.Example
<author ID="0800">
<firstname>Alexander</firstname>
<lastname>Smith</lastname>
<activeStatus>1</activeStatus>
</author>
Depending on the conditions specified
by db2-xdb:condition,
the values from this <author> element might or might not be
inserted into the target tables during decomposition. Two cases are
presented next.All conditions satisfied
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="GIVENNAME"
db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL" />
<xs:element name="lastname" type="xs:string"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="SURNAME"
db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL" />
<xs:element name="activeStatus" type="xs:integer"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="statusCode"
db2-xdb:condition="$DECOMP_CONTENT=1" />
<xs:attribute name="ID" type="xs:integer"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="AUTHID"
db2-xdb:condition="$DECOMP_CONTENT BETWEEN 1 and 999 />
</xs:sequence>
</xs:complexType>
</xs:element>
Because all of the conditions specified
by db2-xdb:condition are
satisfied by the values in the <author> element example shown
previously, the AUTHORS table is populated with the data from the <author>
element.
AUTHID | GIVENNAME | SURNAME | STATUSCODE | NUMBOOKS |
---|---|---|---|---|
0800 | Alexander | Smith | 1 | NULL |
One condition fails
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="GIVENNAME"
db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL"/>
<xs:element name="lastname" type="xs:string"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="SURNAME"
db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL"/>
<xs:element name="activeStatus" type="xs:integer" />
<xs:attribute name="ID" type="xs:integer"
db2-xdb:rowSet="AUTHORS" db2-xdb:column="AUTHID"
db2-xdb:condition="$DECOMP_CONTENT BETWEEN 1 and 100 />
</xs:sequence>
</xs:complexType>
</xs:element>
Although the <firstname> and <lastname>
elements of the example <author> element meet the conditions
specified, the value of the ID attribute does not, and so the entire
row is not inserted during decomposition. This is because the logical
AND of all three conditions specified on the AUTHORS table is evaluated.
In this case, one of the conditions is false, and so the logical
AND evaluates to false, and therefore, no rows are inserted.