Resolving the anchor object for an anchored row type
The anchor object of an anchored type that includes the ROW keyword is specified with a name that could represent a variety of objects, depending on the context and the number of identifiers in the name and the context of the ANCHOR clause.
The objects include the following:
- An SQL variable
- An SQL parameter
- A global variable
- A module variable
- A table
- A view
The
way the anchor object is resolved depends on the number of identifiers
in the anchor object name and the context of the statement using the
ANCHOR clause.
- If the anchor object name is specified with 1 identifier, the name could represent an SQL variable, an SQL parameter, a module variable, a global variable, a table, or a view.
- If the anchor object name is specified with 2 identifiers, the name could represent a label-qualified SQL variable, a routine-qualified SQL parameter, a schema-qualified global variable, a module variable, a schema-qualified table, or a schema-qualified view.
- If the anchor object name is specified with 3 identifiers, the name could represent a global variable qualified by the current server name and a schema, a table qualified by the current server name and a schema, a view qualified by the current server name and a schema, or a schema-qualified module variable.
An SQL variable is a candidate for an anchor object name
only if the ANCHOR clause is used in an SQL variable declaration within
a compound statement. An SQL parameter is a candidate for an anchor
object name only if the ANCHOR clause is used in an SQL variable declaration
within a compound statement used in an SQL routine body. Resolving
the anchor object name that has 1 identifier is done using the following
steps:
- If the ANCHOR clause is in an SQL variable declaration of a compound statement, search for a matching SQL variable name starting from the innermost nested compound to the outermost compound.
- If the ANCHOR clause is in an SQL variable declaration of a compound statement within a routine body, search for a matching SQL parameter name for the routine.
- If the ANCHOR clause is used in defining a module object, then search for a matching module variable name within the module.
- If not yet found, then search for a table or view with a matching name in the current schema.
- If not yet found, then search for a schema global variable with a matching global variable name on the SQL path.
Resolving the anchor object name that has 2 identifiers
is done using the following steps:
- If the ANCHOR clause is in an SQL variable declaration of a compound statement, search for a matching qualified SQL variable name starting from the innermost nested compound to the outermost compound.
- If the ANCHOR clause is in an SQL variable declaration of a compound statement within a routine body, search for a matching SQL parameter name for the routine if the first identifier of the anchor object name matches the name of the routine.
- If the ANCHOR clause is used in defining a module object and if the first identifier matches the module name of that module, then search for a module variable name within the module that matches the second identifier.
- If not yet found, then search for a table or view using the first identifier as the schema name and the second identifier as the table or view name.
- If not yet found, then search for a global variable using the first identifier as a schema name and the second identifier as a global variable name.
- If not found and a module was not searched in step 3, then search for a module on the SQL path with a name that matches the first identifier. If found, then use the second identifier to search for a matching published module variable name in the module.
- If a module is not found using the SQL path in step 6, check for a module public alias that matches the name of the first identifier. If found, then use the second identifier to search for a matching published module variable name in the module identified by the module public alias.
Resolving the anchor object name that has 3 identifiers
is done using the following steps:
- If the ANCHOR clause is used in defining a module object and if the first 2 identifiers match the schema name and the module name of that module, then search for a module variable with a name that matches the last identifier.
- If not found and the first identifier is the same as the current server name, then search for a table or view using the second identifier as the schema name and the third identifier as the table or view name.
- If not found and the first identifier is the same as the current server name, then search for a global variable using the second identifier as the schema name and the third identifier as the global variable name.
- If not found and a module was not searched in step 1, then search for a published module variable using the first identifier as a schema name, the second identifier as a module name and, if such a module exists, use the third identifier to search for a matching published variable name in the module.