MINI MINI MANI MO
<?xml version="1.0"?>
<!--
Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
NAME
kuacnstr.xsl
DESCRIPTION
Convert constraint diffs in sxml TABLE diff document to ALTER_XML document
MODIFIED MM/DD/YY
jstenois 03/30/17 - 25410933: pass UID for current user to parse
functions
sdavidso 02/09/17 - bug25440009 handle user name with apostrophe
abodge 06/10/14 - CM MODIFIED: Restore CM fixes
lbarton 02/06/14 - bug 17943479: make template name unique
bwright 08/15/13 - Bug 17312600: Remove hard tabs from DP src code
lbarton 01/11/10 - bug 8796742: translatable error messages
abodge 09/21/09 - CONSOLIDATE STYLESHEETS: MAKE_DIFF_READY -> CM_MODE
rapayne 03/10/09 - bug 8227850: process all drops for all constraint
type to avoid rename constraint conflicts.
rapayne 01/12/09 - bug 7595899: pick up some changes for CM
rapayne 09/17/08 - bug 7374528: Use RELY when 'adding' a constraint.
lbarton 07/03/08 - bug 5709159: drop/modify unnamed constraint
rapayne 02/29/08 - Add support for AlterConstraints for OBJECT_TABLEs.
- fix COL_LIST//@src syntax
- force drop/create for changes to INITIALLY_DEFERRED and
changes to unnamed constraints.
- merge CM changes.
- use common SourceName.
- add support for RELY diffs in modify path.
rapayne 02/27/08 - Generate drop/create for diffs in:
DEFERRABLE, INITIALLY DEFERRABLE
lbarton 11/28/07 - bug 6474004: RELY
rapayne 10/19/07 - Do not drop-create diffs in novalidate.
rapayne 01/19/07 - Only call ModifyConstraints if there have been changes.
rapayne 12/21/06 - move AlterCOL_LIST to kuacomm.xsl
lbarton 12/18/06 - drop unnamed constraints
htseng 11/21/06 - more work for using index
lbarton 11/20/06 - remove ENABLE VALIDATE
htseng 11/16/06 - add index for constraint_state
lbarton 10/17/06 - still more
htseng 10/10/06 - more work
htseng 10/03/06 - more work
htseng 09/26/06 - constraints
lbarton 09/22/05 - Initial version
-->
<xsl:stylesheet version="1.0" xmlns:sxml="http://xmlns.oracle.com/ku" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Top level imports -->
<xsl:import href="kuacomm.xsl"/>
<xsl:import href="kuatprop.xsl"/>
<!-- Templates -->
<xsl:template name="ProcessDropConstraints">
<xsl:param name="TableNode" select="''"/>
<xsl:param name="ParentNode" select="''"/>
<!-- *******************************************************************
Template: ProcessDropConstraints
Description: cycle through all of the constraint types and process any
approprate drops. This will avoid any ADDs with same name constraints
from producing runtime errors.
Parameters:
TableNode - Parent node of SCHEMA, NAME, constraint lists
ParentNode - Parent of *CONSTRAINT_LIST
RELATIONAL_TABLE || OBJECT_TABLE
******************************************************************** -->
<!-- PRIMARY_KEY_CONSTRAINT_LIST -->
<xsl:for-each select="$ParentNode/sxml:PRIMARY_KEY_CONSTRAINT_LIST/sxml:PRIMARY_KEY_CONSTRAINT_LIST_ITEM">
<xsl:if test="./@src='1' or ../@src='1'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="'PRIMARY'"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<!-- FOREIGN_KEY_CONSTRAINT_LIST -->
<xsl:for-each select="$ParentNode/sxml:FOREIGN_KEY_CONSTRAINT_LIST/sxml:FOREIGN_KEY_CONSTRAINT_LIST_ITEM">
<xsl:if test="./@src='1' or ../@src='1'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="'FOREIGN'"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<!-- UNIQUE_KEY_CONSTRAINT_LIST -->
<xsl:for-each select="$ParentNode/sxml:UNIQUE_KEY_CONSTRAINT_LIST/sxml:UNIQUE_KEY_CONSTRAINT_LIST_ITEM">
<xsl:if test="./@src='1' or ../@src='1'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="'UNIQUE'"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<!-- CHECK_CONSTRAINT_LIST -->
<xsl:for-each select="$ParentNode/sxml:CHECK_CONSTRAINT_LIST/sxml:CHECK_CONSTRAINT_LIST_ITEM">
<xsl:if test="./@src='1' or ../@src='1'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="'CHECK'"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<!-- SCOPE_CONSTRAINT_LIST -->
<xsl:for-each select="$ParentNode/sxml:SCOPE_CONSTRAINT_LIST/sxml:SCOPE_CONSTRAINT_LIST_ITEM">
<xsl:if test="./@src='1' or ../@src='1'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="'SCOPE'"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<!-- ROWID_CONSTRAINT_LIST -->
</xsl:template>
<xsl:template name="AlterConstraints">
<xsl:param name="TableNode" select="''"/>
<xsl:param name="ParentNode" select="''"/>
<!-- *******************************************************************
Template: AlterConstraints
Parameters:
TableNode - Parent node of SCHEMA, NAME, constraint lists
ParentNode - Parent of *CONSTRAINT_LIST
RELATIONAL_TABLE || OBJECT_TABLE
******************************************************************** -->
<!-- It is necessary to drop designated constraints (i.e., src=1) for each type
of constraint to avoid renamed constraint conflicts
-->
<xsl:call-template name="ProcessDropConstraints">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="TableNode" select="$TableNode"/>
</xsl:call-template>
<!-- PRIMARY_KEY_CONSTRAINT_LIST -->
<xsl:if test="$ParentNode/sxml:PRIMARY_KEY_CONSTRAINT_LIST">
<xsl:call-template name="DoAlterConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="TableTypeNode" select="$ParentNode"/>
<xsl:with-param name="ListItemNodes" select="$ParentNode/sxml:PRIMARY_KEY_CONSTRAINT_LIST/sxml:PRIMARY_KEY_CONSTRAINT_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="'PRIMARY'"/>
<xsl:with-param name="DoAll">
<xsl:choose>
<xsl:when test="$ParentNode/sxml:PRIMARY_KEY_CONSTRAINT_LIST/@src='2'">ADD</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- FOREIGN_KEY_CONSTRAINT_LIST -->
<xsl:if test="$ParentNode/sxml:FOREIGN_KEY_CONSTRAINT_LIST">
<xsl:call-template name="DoAlterConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="TableTypeNode" select="'$ParentNode'"/>
<xsl:with-param name="ListItemNodes" select="$ParentNode/sxml:FOREIGN_KEY_CONSTRAINT_LIST/sxml:FOREIGN_KEY_CONSTRAINT_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="'FOREIGN'"/>
<xsl:with-param name="DoAll">
<xsl:choose>
<xsl:when test="$ParentNode/sxml:FOREIGN_KEY_CONSTRAINT_LIST/@src='2'">ADD</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- UNIQUE_KEY_CONSTRAINT_LIST -->
<xsl:if test="$ParentNode/sxml:UNIQUE_KEY_CONSTRAINT_LIST">
<xsl:call-template name="DoAlterConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="TableTypeNode" select="'$ParentNode'"/>
<xsl:with-param name="ListItemNodes" select="$ParentNode/sxml:UNIQUE_KEY_CONSTRAINT_LIST/sxml:UNIQUE_KEY_CONSTRAINT_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="'UNIQUE'"/>
<xsl:with-param name="DoAll">
<xsl:choose>
<xsl:when test="$ParentNode//sxml:UNIQUE_KEY_CONSTRAINT_LIST/@src='2'">ADD</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- CHECK_CONSTRAINT_LIST -->
<xsl:if test="$ParentNode/sxml:CHECK_CONSTRAINT_LIST">
<xsl:call-template name="DoAlterConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="TableTypeNode" select="'$ParentNode'"/>
<xsl:with-param name="ListItemNodes" select="$ParentNode/sxml:CHECK_CONSTRAINT_LIST/sxml:CHECK_CONSTRAINT_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="'CHECK'"/>
<xsl:with-param name="DoAll">
<xsl:choose>
<xsl:when test="$ParentNode/sxml:CHECK_CONSTRAINT_LIST/@src='2'">ADD</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- SCOPE_CONSTRAINT_LIST -->
<xsl:if test="$ParentNode/sxml:SCOPE_CONSTRAINT_LIST">
<xsl:call-template name="DoAlterConstraints">
<xsl:with-param name="ParentNode" select="$TableNode"/>
<xsl:with-param name="TableTypeNode" select="'$ParentNode'"/>
<xsl:with-param name="ListItemNodes" select="$ParentNode/sxml:SCOPE_CONSTRAINT_LIST/sxml:SCOPE_CONSTRAINT_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="'SCOPE'"/>
<xsl:with-param name="DoAll">
<xsl:choose>
<xsl:when test="$ParentNode/sxml:SCOPE_CONSTRAINT_LIST/@src='2'">ADD</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<!-- ROWID_CONSTRAINT_LIST -->
</xsl:template>
<xsl:template name="DoAlterConstraints">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TableTypeNode" select="''"/>
<xsl:param name="ListItemNodes" select="''"/>
<xsl:param name="ConsType">N</xsl:param>
<xsl:param name="DoAll">N</xsl:param>
<!-- *******************************************************************
Template: DoAlterConstraints
Parameters:
ParentNode - Parent node of SCHEMA, NAME
TableTypeNode - <RELATIONAL_TABLE> | <OBJECT_TABLE>
ListItemNodes - CONSTRAINT_LIST_ITEM nodes
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
DoAll - "DROP" = entire list is in doc1, not in doc2
"ADD" = entire list is in doc2, not in doc1
"N" = otherwise
******************************************************************** -->
<xsl:for-each select="$ListItemNodes">
<xsl:choose>
<!-- Drop
note: *_ITEM/@src='1' are processed in DropAllConstraints and should have already been dropped.
-->
<xsl:when test="$DoAll='DROP'">
<xsl:call-template name="DropConstraints">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
</xsl:when>
<!-- Add -->
<xsl:when test="$DoAll='ADD' or @src='2'">
<xsl:call-template name="AddConstraints">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
</xsl:when>
<!-- Condition is different -->
<!-- Modify or Rename -->
<!-- look for descendant nodes with a value1 or src attribute -->
<xsl:when test="(.//@value1 or .//@src) and not(./@src='1')">
<xsl:call-template name="ModifyConstraints">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="TableTypeNode" select="$TableTypeNode"/>
<xsl:with-param name="ListItem" select="."/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="DropConstraints">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType">N</xsl:param>
<!-- *******************************************************************
Template: DropConstraints - wrapper which calls DropConstraint for
Parse and SQL actions.
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
******************************************************************** -->
<xsl:element name="ALTER_LIST_ITEM">
<xsl:call-template name="DropConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">PARSE</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="DropConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">SQL</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="DropConstraint">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType" select="''"/>
<xsl:param name="Action" select="''"/>
<!-- *******************************************************************
Template: DropConstraint - process (i.e., drop) current constraint
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
Action - PARSE or SQL
******************************************************************** -->
<xsl:choose>
<xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or
$PRS_CLAUSE_TYPE=1 or
$PRS_CONSTRAINT_TYPE=1 or
$PRS_CONSTRAINT_STATE=1 or
$PRS_ALTERABLE=1 or
$PRS_XPATH=1)">
<xsl:element name="PARSE_LIST">
<xsl:call-template name="AddXPathParseItem">
<xsl:with-param name="Node" select="$ListItem"/>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_NAME"/>
<xsl:with-param name="Item">NAME</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:choose>
<xsl:when test="sxml:NAME/@value1">
<xsl:value-of select="sxml:NAME/@value1"/>
</xsl:when>
<xsl:when test="@NAME">
<xsl:value-of select="@NAME"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sxml:NAME"/>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
<xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
<xsl:with-param name="Value1">DROP_CONSTRAINT</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CONSTRAINT_TYPE"/>
<xsl:with-param name="Item">CONSTRAINT_TYPE</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:value-of select="$ConsType"/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$Action='SQL'">
<xsl:element name="SQL_LIST">
<xsl:call-template name="DropConstr">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="DropConstr">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType" select="''"/>
<!-- *******************************************************************
Template: DropConstr - generate the SQL_LIST_ITEM for the drop constraint
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of table SCHEMA, NAME
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
******************************************************************** -->
<xsl:element name="SQL_LIST_ITEM">
<xsl:choose>
<xsl:when test="$ListItem/sxml:NAME">
<!-- named constraint -->
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP CONSTRAINT </xsl:text>
<xsl:call-template name="SourceName">
<xsl:with-param name="NameNode" select="$ListItem/sxml:NAME"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$ConsType='PRIMARY'">
<!-- unnamed primary key constraint -->
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP PRIMARY KEY</xsl:text>
</xsl:element>
</xsl:when>
<xsl:when test="$ConsType='UNIQUE'">
<!-- unnamed unique constraint -->
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP </xsl:text>
<xsl:call-template name="GetConstraint">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="ColListItems" select="$ListItem/sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$ListItem/@NAME">
<!-- NAME attribute in constraint list item element;
this was generated by CM_MODE transform param -->
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP CONSTRAINT </xsl:text>
<xsl:value-of select="$ListItem/@NAME"/>
</xsl:element>
</xsl:when>
<xsl:when test="$ConsType='CHECK'">
<!-- unnamed check constraint -->
<xsl:element name="TEXT">
<xsl:text>DECLARE
cname VARCHAR2(30);
BEGIN
cname := dbms_metadata.get_check_constraint_name
(SYS_CONTEXT('USERENV','CURRENT_USERID'),'TABLE','</xsl:text>
<xsl:call-template name="UnquotedSourceName">
<xsl:with-param name="NameNode" select="$ParentNode/sxml:SCHEMA"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
<xsl:call-template name="UnquotedSourceName">
<xsl:with-param name="NameNode" select="$ParentNode/sxml:NAME"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
</xsl:element>
<xsl:choose>
<xsl:when test="$ListItem/sxml:CONDITION">
<xsl:element name="TEXT">
<xsl:call-template name="EscapeStringSxD">
<xsl:with-param name="TheString" select="$ListItem/sxml:CONDITION"/>
</xsl:call-template>
<xsl:text>',FALSE);</xsl:text>
</xsl:element>
</xsl:when>
<xsl:when test="$ListItem/sxml:PARSED_CONDITION">
<xsl:element name="ELEMENTS">
<xsl:copy-of select="$ListItem/sxml:PARSED_CONDITION/*"/>
</xsl:element>
<xsl:element name="TEXT">
<xsl:text>',TRUE);</xsl:text>
</xsl:element>
</xsl:when>
</xsl:choose>
<xsl:element name="TEXT">
<xsl:text>
execute immediate 'ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP CONSTRAINT ' || cname;
END;</xsl:text>
</xsl:element>
</xsl:when>
<xsl:when test="$ConsType='FOREIGN'">
<!-- unnamed foreign key constraint -->
<xsl:element name="TEXT">
<xsl:text>DECLARE
h NUMBER;
cname VARCHAR2(30);
BEGIN
h := dbms_metadata.open_get_fk_constraint_name('TABLE','</xsl:text>
<xsl:call-template name="UnquotedSourceName">
<xsl:with-param name="NameNode" select="$ParentNode/sxml:SCHEMA"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
<xsl:call-template name="UnquotedSourceName">
<xsl:with-param name="NameNode" select="$ParentNode/sxml:NAME"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
<xsl:call-template name="EnQuote">
<xsl:with-param name="String" select="$ListItem/sxml:REFERENCES/sxml:SCHEMA"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
<xsl:call-template name="EnQuote">
<xsl:with-param name="String" select="$ListItem/sxml:REFERENCES/sxml:NAME"/>
</xsl:call-template>
<xsl:text>');</xsl:text>
<xsl:for-each select="$ListItem/sxml:COL_LIST/sxml:COL_LIST_ITEM">
<xsl:text>
dbms_metadata.set_fk_constraint_col_pair(h,'</xsl:text>
<xsl:call-template name="EnQuote">
<xsl:with-param name="String" select="sxml:NAME"/>
</xsl:call-template>
<xsl:text>','</xsl:text>
<xsl:call-template name="EmitReferenceName">
<xsl:with-param name="ColList" select="$ListItem/sxml:REFERENCES/sxml:COL_LIST"/>
<xsl:with-param name="pos" select="position()"/>
</xsl:call-template>
<xsl:text>');</xsl:text>
</xsl:for-each>
<xsl:text>
cname := dbms_metadata.get_fk_constraint_name(h);
execute immediate 'ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> DROP CONSTRAINT ' || cname;
END;</xsl:text>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="TEXT">
<xsl:text>-- ERROR: Unable to drop constraint of type </xsl:text>
<xsl:value-of select="$ConsType"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template name="EmitReferenceName">
<xsl:param name="ColList" select="''"/>
<xsl:param name="pos">0</xsl:param>
<xsl:value-of select="$ColList/sxml:COL_LIST_ITEM[$pos]/sxml:NAME"/>
</xsl:template>
<xsl:template name="AddConstraints">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType">N</xsl:param>
<!-- *******************************************************************
Template: AddConstraints
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
******************************************************************** -->
<xsl:element name="ALTER_LIST_ITEM">
<xsl:call-template name="AddConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">PARSE</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="AddConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">SQL</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="AddConstraint">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType" select="''"/>
<xsl:param name="Action" select="''"/>
<!-- *******************************************************************
Template: AddConstraint
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
Action - PARSE or SQL
******************************************************************** -->
<xsl:choose>
<xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or
$PRS_CLAUSE_TYPE=1 or
$PRS_CONSTRAINT_TYPE=1 or
$PRS_CONSTRAINT_STATE=1 or
$PRS_ALTERABLE=1 or
$PRS_XPATH=1)">
<xsl:element name="PARSE_LIST">
<xsl:call-template name="AddXPathParseItem">
<xsl:with-param name="Node" select="$ListItem"/>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_NAME"/>
<xsl:with-param name="Item">NAME</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:choose>
<xsl:when test="sxml:NAME/@value1">
<xsl:value-of select="sxml:NAME/@value1"/>
</xsl:when>
<xsl:when test="@NAME">
<xsl:value-of select="@NAME"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sxml:NAME"/>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
<xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
<xsl:with-param name="Value1">ADD_CONSTRAINT</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CONSTRAINT_TYPE"/>
<xsl:with-param name="Item">CONSTRAINT_TYPE</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:value-of select="$ConsType"/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$Action='SQL'">
<xsl:element name="SQL_LIST">
<xsl:element name="SQL_LIST_ITEM">
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> ADD </xsl:text>
<xsl:if test="sxml:NAME">
<xsl:text>CONSTRAINT </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME"/>
</xsl:call-template>
</xsl:if>
<xsl:call-template name="GetConstraint">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="ColListItems" select="sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
<xsl:if test="$ConsType!='SCOPE'">
<xsl:call-template name="AlterConstraintState">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="TypeNode">ADD</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="ModifyConstraints">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TableTypeNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType">N</xsl:param>
<!-- *******************************************************************
Template: ModifyConstraints
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
TableTypeNode - <RELATIONAL_TABLE> | <OBJECT_TABLE>
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
******************************************************************** -->
<xsl:element name="ALTER_LIST_ITEM">
<xsl:call-template name="ModifyConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="TableTypeNode" select="$TableTypeNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">PARSE</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="ModifyConstraint">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="TableTypeNode" select="$TableTypeNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="Action">SQL</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="ModifyConstraint">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TableTypeNode" select="''"/>
<xsl:param name="ListItem" select="''"/>
<xsl:param name="ConsType" select="''"/>
<xsl:param name="Action" select="''"/>
<!-- *******************************************************************
Template: ModifyConstraint
Current node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - Parent node of SCHEMA, NAME
TableTypeNode - <RELATIONAL_TABLE> | <OBJECT_TABLE>
ListItem - CONSTRAINT_LIST_ITEM node
ConsType - 'PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'SCOPE'
Action - PARSE or SQL
******************************************************************** -->
<xsl:choose>
<xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or
$PRS_CLAUSE_TYPE=1 or
$PRS_CONSTRAINT_TYPE=1 or
$PRS_CONSTRAINT_STATE=1 or
$PRS_ALTERABLE=1 or
$PRS_XPATH=1)">
<xsl:element name="PARSE_LIST">
<xsl:call-template name="AddXPathParseItem">
<xsl:with-param name="Node" select="$ListItem"/>
</xsl:call-template>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_NAME"/>
<xsl:with-param name="Item">NAME</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:choose>
<xsl:when test="$CM_MODE=1">
<xsl:choose>
<!-- NOTE - different selection order -->
<xsl:when test="sxml:NAME">
<xsl:value-of select="sxml:NAME"/>
</xsl:when>
<xsl:when test="@NAME">
<xsl:value-of select="@NAME"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sxml:NAME/@value1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="sxml:NAME/@value1">
<xsl:value-of select="sxml:NAME/@value1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sxml:NAME"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
<xsl:choose>
<xsl:when test="sxml:COL_LIST/sxml:COL_LIST_ITEM/sxml:NAME/@value1
or sxml:CONDITION/@value1
or $ListItem/sxml:COL_LIST//@src
or sxml:REFERENCES/sxml:NAME/@value1
or sxml:DEFERRABLE/@src
or sxml:INITIALLY_DEFERRED/@src">
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
<xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
<xsl:with-param name="Value1">DROP_CREATE_CONSTRAINT</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="ClauseType">
<xsl:choose>
<xsl:when test="sxml:DISABLE/@src='2'">DISABLE_CONSTRAINT</xsl:when>
<xsl:when test="sxml:DISABLE/@src='1'">ENABLE_CONSTRAINT</xsl:when>
<xsl:otherwise>MODIFY_CONSTRAINT</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
<xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
<xsl:with-param name="Value1" select="$ClauseType"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="AddParseItem">
<xsl:with-param name="ParseIt" select="$PRS_CONSTRAINT_TYPE"/>
<xsl:with-param name="Item">CONSTRAINT_TYPE</xsl:with-param>
<xsl:with-param name="Value1">
<xsl:value-of select="$ConsType"/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$Action='SQL'">
<xsl:element name="SQL_LIST">
<xsl:choose>
<!-- look for descendant nodes with a value1 or src attribute -->
<xsl:when test="sxml:COL_LIST/sxml:COL_LIST_ITEM/sxml:NAME/@value1
or sxml:CONDITION/@value1
or sxml:COL_LIST/sxml:COL_LIST_ITEM//@src
or sxml:REFERENCES/sxml:NAME/@value1
or sxml:DEFERRABLE/@src
or sxml:INITIALLY_DEFERRED/@src">
<xsl:call-template name="DropConstr">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
<xsl:with-param name="ListItem" select="$ListItem"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
<xsl:element name="SQL_LIST_ITEM">
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> ADD </xsl:text>
<xsl:if test="sxml:NAME">
<xsl:text>CONSTRAINT </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME"/>
</xsl:call-template>
</xsl:if>
<xsl:call-template name="GetConstraint">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="ColListItems" select="sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
</xsl:call-template>
<!-- DEFERRABLE need do in create/add statement -->
<xsl:if test="$ListItem/sxml:DEFERRABLE">
<xsl:choose>
<xsl:when test="$ListItem/sxml:DEFERRABLE/@src='1'"/>
<xsl:otherwise>
<xsl:text> DEFERRABLE</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:call-template name="AlterConstraintState">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="TypeNode">ADD</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$ListItem/sxml:INITIALLY_DEFERRED/@src='2' or
$ListItem/sxml:DISABLE/@src or
$ListItem/sxml:NOVALIDATE/@src or
($ListItem/sxml:USING_INDEX/@src='2' and not($TableTypeNode/sxml:PHYSICAL_PROPERTIES/sxml:INDEX_ORGANIZED_TABLE/@src)) or
$ListItem/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:PCTFREE/@value1 or
$ListItem/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:INITRANS/@value1 or
$ListItem/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:STORAGE/sxml:NEXT/@value1 or
$ListItem/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:STORAGE/sxml:MINEXTENTS/@value1 or
$ListItem/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/@src or
$ListItem/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM//@value1 or
$ListItem/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM/sxml:SEGMENT_ATTRIBUTES//@value1 or
$ListItem/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/@src or
$ListItem/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM//@value1 or
$ListItem/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM/sxml:SEGMENT_ATTRIBUTES//@value1">
<xsl:element name="SQL_LIST_ITEM">
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<!-- Need to handle named and unnamed constraints differently -->
<xsl:choose>
<xsl:when test="sxml:NAME and not (sxml:NAME/@src='2')">
<!-- Named constraint -->
<xsl:text> MODIFY CONSTRAINT </xsl:text>
<xsl:call-template name="SourceName">
<xsl:with-param name="NameNode" select="sxml:NAME"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- Unnamed constraint -->
<xsl:text> MODIFY</xsl:text>
<xsl:choose>
<xsl:when test="$ConsType='PRIMARY' or $ConsType='UNIQUE'">
<xsl:call-template name="GetConstraint">
<xsl:with-param name="ParentNode" select="$ListItem"/>
<xsl:with-param name="ColListItems" select="$ListItem/sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
<xsl:with-param name="ConsType" select="$ConsType"/>
<xsl:with-param name="ForModify" select="TRUE"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:text> CANNOT MODIFY UNNAMED CONSTRAINT OF TYPE </xsl:text>
<xsl:value-of select="$ConsType"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="AlterConstraintState">
<xsl:with-param name="ParentNode" select="$ListItem"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
<!-- first rename it then modify -->
<xsl:if test="sxml:NAME/@value1">
<xsl:element name="SQL_LIST_ITEM">
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> RENAME CONSTRAINT </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME/@value1"/>
</xsl:call-template>
<xsl:text> TO </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<!-- Rename: nothing diff except constraint name -->
<xsl:if test="sxml:NAME/@value1">
<xsl:element name="SQL_LIST_ITEM">
<xsl:element name="TEXT">
<xsl:text>ALTER TABLE </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="$ParentNode"/>
</xsl:call-template>
<xsl:text> RENAME CONSTRAINT </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME/@value1"/>
</xsl:call-template>
<xsl:text> TO </xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:NAME"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="GetConstraint">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="ColListItems" select="''"/>
<xsl:param name="ConsType" select="''"/>
<xsl:param name="ForModify">FALSE</xsl:param>
<!-- ***************************************************************
Template: GetConstraint
Current Node: CONSTRAINT_LIST_ITEM
Parameters:
ParentNode - CONSTRAINT_LIST_ITEM
ColListItems - COL_LIST_ITEM nodes
ConsType - PRIMARY/FOREIGN/UNIQUE/CHECK/SCOPE
ForModify - TRUE (constraint is being modified)
FALSE (drop/create constraint)
******************************************************************** -->
<xsl:choose>
<xsl:when test="$ConsType='PRIMARY'">
<xsl:text> PRIMARY KEY </xsl:text>
<xsl:if test="$ForModify='FALSE'">
<xsl:text>(</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="$ColListItems"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$ConsType='FOREIGN'">
<xsl:text> FOREIGN KEY (</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="$ColListItems"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
<!-- reference_clause -->
<xsl:if test="sxml:REFERENCES">
<xsl:text> REFERENCES "</xsl:text>
<xsl:if test="$EMIT_SCHEMA=1">
<xsl:value-of select="sxml:REFERENCES/sxml:SCHEMA"/>
<xsl:text>"."</xsl:text>
</xsl:if>
<xsl:value-of select="sxml:REFERENCES/sxml:NAME"/>
<xsl:text>"</xsl:text>
<!-- using it can not get right result, don't know why
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="sxml:REFERENCES"/>
</xsl:call-template>
-->
<xsl:text>(</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="sxml:REFERENCES/sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
<xsl:if test="sxml:REFERENCES/sxml:ON_DELETE">
<xsl:text> ON DELETE </xsl:text>
<xsl:choose>
<xsl:when test="sxml:REFERENCES/sxml:ON_DELETE='SET_NULL'">SET NULL</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sxml:REFERENCES/sxml:ON_DELETE"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
</xsl:when>
<xsl:when test="$ConsType='UNIQUE'">
<xsl:text> UNIQUE (</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="$ColListItems"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
</xsl:when>
<xsl:when test="$ConsType='CHECK'">
<xsl:text> CHECK (</xsl:text>
<xsl:value-of select="sxml:CONDITION"/>
<xsl:text>)</xsl:text>
</xsl:when>
<xsl:when test="$ConsType='SCOPE'">
<xsl:text> SCOPE FOR (</xsl:text>
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="sxml:COL"/>
</xsl:call-template>
<xsl:text>) IS </xsl:text>
<xsl:call-template name="SchemaName">
<xsl:with-param name="ParentNode" select="sxml:REFERENCES"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="AlterConstraintState">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TypeNode" select="''"/>
<!-- *******************************************************************
Template: AlterConstraintState
Current node: parent of ENABLE, DISABLE, etc.
Parameters:
ParentNode - Parent node of SCHEMA, NAME
TypeNode - ADD or '' (modify)
******************************************************************** -->
<xsl:choose>
<xsl:when test="$TypeNode='ADD'">
<!-- add constraint_state for add constraint ddl -->
<xsl:if test="$ParentNode/sxml:INITIALLY_DEFERRED/@src='2' or $ParentNode/sxml:INITIALLY_DEFERRED/@src!='1'"> INITIALLY DEFERRED</xsl:if>
<!-- In the ADD case we only need to see if we need to propagate the RELY (i.e., should never have a src or value1 -->
<xsl:if test="$ParentNode/sxml:RELY"> RELY</xsl:if>
<!-- [NO]VALIDATE -->
<xsl:if test="$ParentNode/sxml:USING_INDEX">
<!-- need more , partitioning -->
<xsl:text> USING INDEX</xsl:text>
<xsl:call-template name="AlterPhysicalAttributes">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES"/>
<xsl:with-param name="TypeNode" select="$TypeNode"/>
</xsl:call-template>
<!-- hui -->
<xsl:choose>
<xsl:when test="$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING">
<xsl:call-template name="GlobalPartIndex">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING"/>
<xsl:with-param name="TypeNode" select="$TypeNode"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING">
<xsl:call-template name="LocalPartIndex">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING"/>
<xsl:with-param name="TypeNode" select="$TypeNode"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:if>
<!-- ENABLE/DISABLE -->
<xsl:call-template name="ConstraintState2">
<xsl:with-param name="ParentNode" select="."/>
</xsl:call-template>
</xsl:when>
<!-- modify constraint_state -->
<xsl:otherwise>
<xsl:if test="$ParentNode/sxml:INITIALLY_DEFERRED/@src='2'"> INITIALLY DEFERRED</xsl:if>
<xsl:if test="$ParentNode/sxml:RELY/@src='2' or $ParentNode/sxml:RELY/@src!='1'"> RELY</xsl:if>
<xsl:if test="$ParentNode/sxml:RELY/@src='1' or $ParentNode/sxml:RELY/@src!='2'"> NORELY</xsl:if>
<xsl:if test="$ParentNode/sxml:USING_INDEX/@src='2' or
$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:PCTFREE/@value1 or
$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:INITRANS/@value1 or
$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:STORAGE/sxml:NEXT/@value1 or
$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES/sxml:STORAGE/sxml:MINEXTENTS/@value1 or
$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/@src or
$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM//@value1 or
$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM/sxml:SEGMENT_ATTRIBUTES//@value1 or
$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/@src or
$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM//@value1 or
$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM/sxml:SEGMENT_ATTRIBUTES//@value1">
<!-- need more , partitioning -->
<xsl:text> USING INDEX</xsl:text>
<xsl:call-template name="AlterPhysicalAttributes">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:INDEX_ATTRIBUTES"/>
<xsl:with-param name="TypeNode">
<xsl:if test="$ParentNode/sxml:USING_INDEX/@src='2'">ADD</xsl:if>
</xsl:with-param>
</xsl:call-template>
<xsl:choose>
<xsl:when test="$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING">
<xsl:call-template name="GlobalPartIndex">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING"/>
<xsl:with-param name="TypeNode" select="$TypeNode"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING">
<xsl:call-template name="LocalPartIndex">
<xsl:with-param name="ParentNode" select="$ParentNode/sxml:USING_INDEX/sxml:LOCAL_PARTITIONING"/>
<xsl:with-param name="TypeNode" select="$TypeNode"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:if>
<!-- ENABLE/DISABLE -->
<xsl:call-template name="ConstraintState2">
<xsl:with-param name="ParentNode" select="."/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="GlobalPartIndex">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TypeNode" select="''"/>
<!-- *******************************************************************
Template: GlobalPartIndex
Current node: sxml:USING_INDEX/sxml:GLOBAL_PARTITIONING
Parameters:
ParentNode - GLOBAL_PARTITIONING
TypeNode - ADD
******************************************************************** -->
<xsl:choose>
<xsl:when test="$ParentNode/sxml:HASH_PARTITIONING">
<xsl:text> GLOBAL PARTITION BY HASH (</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="$ParentNode/sxml:HASH_PARTITIONING/sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
</xsl:call-template>
<xsl:text>) </xsl:text>
<xsl:text>(</xsl:text>
<xsl:call-template name="IndexPartList">
<xsl:with-param name="PartList" select="$ParentNode/sxml:HASH_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM"/>
</xsl:call-template>
<xsl:text>) </xsl:text>
</xsl:when>
<xsl:when test="$ParentNode/sxml:RANGE_PARTITIONING">
<xsl:text> GLOBAL PARTITION BY RANGE (</xsl:text>
<xsl:call-template name="AlterCOL_LIST">
<xsl:with-param name="ColListItems" select="$ParentNode/sxml:RANGE_PARTITIONING/sxml:COL_LIST/sxml:COL_LIST_ITEM"/>
</xsl:call-template>
<xsl:text> )</xsl:text>
<xsl:text>(</xsl:text>
<xsl:call-template name="IndexPartList">
<xsl:with-param name="PartList" select="$ParentNode/sxml:RANGE_PARTITIONING/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM"/>
</xsl:call-template>
<xsl:text>) </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="LocalPartIndex">
<xsl:param name="ParentNode" select="''"/>
<xsl:param name="TypeNode" select="''"/>
<!-- *******************************************************************
Template: LocalPartIndex
Current node: sxml:USING_INDEX/sxml:LOCAL_PARTITIONING
Parameters:
ParentNode - LOCAL_PARTITIONING
TypeNode - ADD
******************************************************************** -->
<xsl:text> LOCAL (</xsl:text>
<xsl:call-template name="IndexPartList">
<xsl:with-param name="PartList" select="$ParentNode/sxml:PARTITION_LIST/sxml:PARTITION_LIST_ITEM"/>
</xsl:call-template>
<xsl:text>) </xsl:text>
</xsl:template>
<xsl:template name="IndexPartList">
<xsl:param name="PartList" select="''"/>
<!-- *******************************************************************
Template: IndexPartList
Parameters:
IndexPartList - PARTITION_LIST
******************************************************************** -->
<xsl:for-each select="$PartList">
<xsl:if test="position()!=1">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text>PARTITION "</xsl:text>
<xsl:value-of select="sxml:NAME"/>
<xsl:text>" </xsl:text>
<xsl:if test="sxml:VALUES">
<xsl:text>VALUES LESS THAN (</xsl:text>
<xsl:value-of select="sxml:VALUES"/>
<xsl:text>) </xsl:text>
</xsl:if>
<xsl:if test="sxml:SEGMENT_ATTRIBUTES">
<xsl:call-template name="AlterSegmentAttributes">
<xsl:with-param name="ParentNode" select="sxml:SEGMENT_ATTRIBUTES"/>
<xsl:with-param name="TypeNode" select="'ADD'"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="sxml:SUBPARTITION_LIST">
<xsl:text>( </xsl:text>
<xsl:for-each select="sxml:SUBPARTITION_LIST/sxml:SUBPARTITION_LIST_ITEM">
<xsl:if test="position()!=1">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text>SUBPARTITION "</xsl:text>
<xsl:value-of select="sxml:NAME"/>
<xsl:text>" </xsl:text>
<xsl:if test="sxml:TABLESPACE">
<xsl:text>TABLESPACE </xsl:text>
<xsl:value-of select="sxml:TABLESPACE"/>
</xsl:if>
</xsl:for-each>
<xsl:text>)</xsl:text>
</xsl:if>
<xsl:if test="sxml:TABLESPACE">
<xsl:text> TABLESPACE "</xsl:text>
<xsl:value-of select="sxml:TABLESPACE"/>
<xsl:text>"</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
OHA YOOOO