CALL 语句调用例程。
调用的例程必须以匹配其定义的方式进行调用。例如,如果例程是用三个参数定义的,前两个是整数型,第三个是字符型,CALL 语句就必须向该例程传递三个变量,每个变量的数据类型应与例程定义的参数类型匹配。这称为精确特征符匹配,意味着 CALL 语句提供的特征符必须与例程定义提供的特征符匹配。
精确特征符匹配也适用于例程的返回值。如果在 CREATE FUNCTION 语句中指定了 RETURNS 子句,或者例程是内置函数,则必须在 CALL 语句中指定 INTO 子句。例程的返回值不可忽略。反之,如果 CREATE FUNCTION 语句中未指定 RETURNS 子句,由于例程没有返回值,因此不可指定 INTO 子句。
这种实现方式的多样性意味着 CALL 语法图中的某些子句并非适用于(或允许用于)所有类型的例程。同时还允许 CALL 语句调用任何类型的例程,而不管此例程是如何定义的。
未指定可选的 BrokerSchemaName 参数时,代理的 SQL 解析器使用 PATH 语句(请参阅 BROKER SCHEMA 语句的 PATH 子句)中描述的算法搜索指定的过程。
指定了 BrokerSchemaName 参数时,代理的 SQL 解析器在指定的模式中调用指定的过程,不必首先搜索该路径。但是,如果过程引用不明确(即,两个过程在不同的代理模式中有相同的名称),并且未用可选的 BrokerSchemaName 限定引用, Eclipse 工具集将生成“任务查看错误”,您必须更正此错误才能部署不明确的代码。
代理提供的内置函数自动放在名为 SQL 的预定义代理模式中。SQL 模式始终搜索尚未匹配用户定义例程的例程。因此,用户定义的模块优先于同名的内置例程。
每个代理模式为例程提供唯一的符号或名称空间,因此当例程受限于所在模式的名称时,例程名是唯一的。
CALL myProc1() INTO cursor; CALL myProc1() INTO OutputRoot.XML.TestValue1;
CALL 语句按给定的顺序将参数传递给过程。在执行 CALL 语句之前,会对例程定义中定义为 IN 或 INOUT 的参数求值,但定义为 OUT 的参数始终作为正确类型的 NULL 参数传递。过程完成时,将更新所有声明为 OUT 或 INOUT 的参数以反映过程执行期间对它们进行的任何更改。过程执行期间从不更改定义为 IN 的参数。
不支持例程重载。这表示无法在同一个代理模式中创建两个同名的例程。如果代理检测到例程已超负荷,则会报告异常。同样,您也无法调用重载的数据库存储过程。如果同一个数据库模式中存在两个同名过程,则数据库存储过程被视为重载。但是您可以调用重载 Java 方法,只要为每个要调用的重载方法创建单独的 ESQL 定义,并向每个 ESQL 定义赋予一个唯一的例程名即可。