使用 CALL 语句来调用用户编写的例程

ESQL CALL 语句调用例程。例程是用户定义的函数或过程,已通过下列某个语句对其进行了定义:
  • CREATE FUNCTION 语句
  • CREATE PROCEDURE 语句
注: 与标准的用户定义函数和过程一样,您也可以使用 CALL 调用内置(代理提供的)函数和用户定义的 SQL 函数。然而,通常调用这些函数类型的方法仅是以表达式使用其名称。
您可以使用 CALL 语句调用通过以下某种方法实现的例程:
  • ESQL。
  • Java。
  • 作为数据库中的存储过程。
  • 作为内置(代理提供的)函数。(但请参阅上述有关调用内置函数的注意事项。)

有关 CALL 语句的语法和参数的详细信息,请参阅 CALL 语句。有关使用 CALL 的示例,请参阅 CREATE PROCEDURE 语句中的示例。

调用 EQSL 例程

如果例程的定义指定 ESQL 的 LANGUAGE 子句或例程是内置函数,则以 ESQL 方法调用该例程。

在定义和 CALL 之间,必须存在数据类型和每个参数方向的精确一对一匹配。

允许 ESQL 例程返回任何 ESQL 数据类型,但不包括列表和行。

调用 Java 例程

如果例程的定义指定 Java 的 LANGUAGE 子句,则以 JAVA 方法调用该例程。

在定义和 CALL 之间,必须存在数据类型和每个参数方向的精确一对一匹配。

如果 Java 方法有空返回类型,则不能使用 INTO 子句,因为不存在要返回的值。

Java 例程可返回 ESQL 到 Java 的数据类型映射表中的任何数据类型。 请注意,这不包括列表和行。

调用数据库存储过程

如果例程的定义指定 DATABASE 的 LANGUAGE 子句,则以 DATABASE 存储过程调用该例程。

对数据库存储过程进行调用时,代理会搜索与过程的局部名相匹配的定义(由 CREATE PROCEDURE 语句定义)。 然后,代理使用以下序列解析为数据库中过程所知的名称以及该过程所属的数据库模式:

  1. 如果 CALL 语句指定 IN 子句,则从 IN 子句中获取数据源和/或数据库模式的名称。
  2. 如果数据源的名称不是由 CALL 语句上的 IN 子句提供的,则从节点的 DATASOURCE 属性获取该名称。
  3. 如果数据库模式不是由 CALL 语句上的 IN 子句提供的,但在 CREATE PROCEDURE 语句的 EXTERNAL NAME 子句上指定,则从 EXTERNAL NAME 子句获取该数据库模式。
  4. 如果没有在 CREATE PROCEDURE 语句的 EXTERNAL NAME 子句上指定任何数据库模式,则将数据库的用户名用作模式名称。如果找到匹配过程,则调用例程。
CALL 语句的 IN 子句的主要用途是允许在运行时动态选择数据源和/或数据库模式。
注: 和 CALL 语句的 IN 子句一样,EXTERNAL SCHEMA 子句也允许动态选择包含存储过程的数据库模式,但它的灵活性不如 IN 子句且仅用于向后兼容性保留。在新应用程序中不推荐使用。

如果调用的例程在其定义中指定了任何 DYNAMIC RESULT SETS,则 CALL 语句的 ParameterList 中的表达式数量必须等于到例程的实际参数数量与 DYNAMIC RESULT SETS 数量之和。例如,如果例程有三个参数、两个 DYNAMIC RESULT SETS,则 CALL 语句必须传递五个参数到调用的例程。 所传递的用于两个 DYNAMIC RESULT SETS 的参数必须为列表参数;即,必须为使用数组方括号 [ ] 限定的字段引用;例如,Environment.ResultSet1[]

允许数据库存储过程返回任何 ESQL 数据类型,但不包括时间间隔、列表和行。

相关概念
ESQL 概述
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac06009_