在SQL PL中引用SQL参数和变量

某些规则适用于 SQL PL 例程(包括 SQL 函数、SQL 存储过程和高级触发器)中对 SQL 参数和变量的引用。

更改开始

变量通常可以在 SQL PL 例程(包括 SQL 函数、SQL 存储过程和高级触发器)的 SQL 语句中引用。 然而,在SQL PL例程中不能指定主机变量。 相反,根据上下文,SQL PL例程中的语句可以在任何需要表达式或变量的地方引用SQL变量、SQL参数、转换变量或全局变量,包括在非SQL PL上下文中可以指定主机变量的位置。 SQL变量可在其声明的复合语句中的任意位置被引用,包括该复合语句中直接或间接嵌套的任何SQL语句。 SQL参数可以在SQL函数或SQL程序体中引用。 触发器主体中可以引用过渡变量。

在带有变量的 SQL 语句中,尤其是当两个或多个变量具有相同的名称,或者一个变量和另一个对象具有相同的名称时,可能会产生歧义。 在这种情况下,确定引用的是哪个变量以及标识符是变量名称还是其他对象(如列)可能会让人感到困惑。 如果标识符是一个变量的名称,则可能难以确定该引用是针对 SQL 变量、SQL 参数、过渡变量还是全局变量。

SQL 函数或 SQL 存储过程中的 SQL 变量、SQL 参数或全局变量的名称可以与函数或存储过程中引用的表或视图中的列名相同。 触发器中的SQL变量、转换变量或全局变量的名称可以与触发器中引用的表或视图中的列的名称相同。 SQL变量的名称也可以与在同一函数、过程或触发器中声明的另一个SQL变量的名称相同。 当两个SQL变量在不同的复合语句中声明时,就会出现这种情况。 包含 SQL 变量声明的复合语句决定了该变量的作用域。 更多信息,请参阅复合语句

如果 SQL 变量、SQL 参数或全局变量的名称没有限定,则以下规则会说明该名称是指标识符、SQL 变量还是 SQL 参数:

  • 更改开始在 SET PATH 或 SET SCHEMA 语句中,名称将作为 SQL 变量、SQL 参数、过渡变量或全局变量进行检查。 如果找不到该名称的 SQL 变量、SQL 参数、过渡变量或全局变量,则假定该名称为模式名称。更改结束
  • 更改开始在 CONNECT、RELEASE 和 SET CONNECTION 语句中,名称被用作服务器名称。更改结束
  • 更改开始在 CALL 语句中,名称被用作存储过程名称。更改结束
  • 更改开始在 ASSOCIATE LOCATORS 或 DESCRIBE PROCEDURE 语句中,名称被用作存储过程名称。更改结束

相同的名称应明确加以限定。 对名称进行限定可以明确名称是指列、全局变量、SQL 变量、SQL 参数还是过渡变量:

  • SQL参数可以用SQL函数或SQL过程的名称来限定。
  • SQL变量可以用复合语句的标签进行限定,复合语句中声明了SQL变量。
  • 可以用CREATE TRIGGER或ALTER TRIGGER语句中指定的相关名称来限定过渡变量。
  • 全局变量可以在创建时使用隐式或显式指定的模式进行限定。

如果名称未限定,或限定但仍含糊不清,以下规则将说明如何解析该名称。 名称的解析是按以下顺序检查是否匹配:

  • 如果在创建SQL函数或SQL过程时指定了表和视图,则首先将名称作为列进行检查。
  • 如果未找到列,则将名称作为SQL变量、SQL参数或转换变量进行检查。 SQL变量可以在包含引用的复合语句 中声明,也可以在嵌套的复合语句中声明。 如果两个SQL变量、一个SQL变量和一个SQL参数或一个SQL变量和一个转换变量具有相同的名称,则使用在最里面的复合语句中声明的SQL变量。
  • 如果未找到作为 SQL 变量名的名称,则将其作为 SQL 参数名或转换变量进行检查。
  • 如果未作为 SQL 参数或转换变量找到,则将名称作为全局变量进行检查。

如果名称仍未被解析为列、SQL 变量、SQL 参数、全局变量或过渡变量,且名称的作用域包括当前服务器中不存在的表或视图,则假定该名称为列。 如果当前服务器上存在所有表和视图,则假定它是全局变量。 否则会返回错误。

SQL 函数、SQL 存储过程或触发器中的 SQL 变量、SQL 参数、过渡变量或全局变量的名称可以与某些 SQL 语句中用作名称的标识符相同。 这些语句不支持SQL变量、SQL参数或转换变量的限定名称。

更改结束