全局变量引用的解析

全局变量引用解析取决于全局变量名称是否是限定的以及引用全局变量的位置。

对 SQL 参数, SQL 变量和全局变量的引用中描述了解析与列, SQL 变量, SQL 参数或行变量字段的名称相关的全局变量引用的顺序。

未限定用户定义的类型,函数,过程,特定,全局变量和模块名称中描述了用作 CREATE , ALTER , COMMENT , DROP , GRANT 或 REVOKE 语句的主对象的非限定全局变量名称的隐式限定。

最佳实践是在 SQL 语句中引用全局变量时完全限定全局变量的名称。 这将阻止 SQL 路径中的后续更改对全局变量的解析产生影响。

数据库管理器在所有其他上下文中对全局变量引用的解析取决于是否限定了全局变量名称。

限定名

要解析限定全局变量的名称,将根据以下过程对引用进行求值:

  1. 如果从模块中进行全局变量引用,并且限定符与模块的名称匹配,那么将搜索模块以查找匹配的模块全局变量。 适用下列规则:
    • 如果限定符是单个标识,那么将限定符与模块名称进行比较时,将忽略模块的模式名称。
    • 如果限定符是两部分标识,那么会将其与模式限定模块名称进行比较。
    如果模块全局变量的名称与引用中的未限定全局变量名称匹配,那么解析已完成。 如果限定符与模块的名称不匹配,或者没有匹配的模块全局变量,那么解析将继续执行下一步。
  2. 现在,该限定符被视为模式名称。 将在该指定模式中搜索匹配的模式全局变量。
    • 如果模式全局变量名与引用中的未限定全局变量名匹配,那么解析已完成。
    • 如果模式不存在,那么将返回错误。
    • 如果模式中没有匹配的模式全局变量,并且限定符与第一步中模块的名称匹配,那么将返回错误。
    • 否则,将继续执行下一步。
  3. 现在,该限定符被视为模块名称。 适用下列规则:
    • 如果使用模式名称限定模块名称,那么将搜索模块以查找匹配的已发布模块全局变量。
    • 如果未使用模式名称限定模块名称,那么模块的模式是 SQL 路径中具有匹配模块名称的第一个模式。 如果模块的名称与 SQL 路径中找到的模式名称相匹配,那么将搜索该模块以查找匹配的已发布模块全局变量。
    • 如果未通过 SQL 路径找到模块,那么将考虑是否存在与全局变量限定符的名称匹配的模块公用别名。 如果找到模块公用别名,那么将搜索与该模块公用别名相关联的模块以查找匹配的已发布模块全局变量。
    如果已发布的模块全局变量的名称与全局变量引用中的未限定全局变量名称匹配,那么解析已完成。 如果找不到匹配的模块,或者匹配的模块中没有匹配的模块全局变量,那么将返回错误。

未限定的名称

要解析未限定的全局变量的名称,将根据以下过程对引用进行求值:

  1. 如果从模块中进行非限定全局变量引用,那么将搜索模块以查找匹配的模块全局变量。 如果模块全局变量名与引用中的全局变量名匹配,那么解析已完成。 如果没有匹配的模块全局变量,那么解析将继续执行下一步。
  2. 将按从左到右的顺序搜索 SQL 路径中的模式以查找匹配的模式全局变量。 如果模式全局变量名与引用中的全局变量名匹配,那么解析已完成。 如果在完成此步骤后未找到匹配的全局变量,那么将返回错误。