在模块中添加例程原型的实现

可在定义一个或多个例程原型后在模块中实现已定义例程原型的例程体。

开始之前

继续此任务之前:
  • 查看 ALTER MODULE 语句文档。
  • 确保您具有执行 ALTER MODULE 语句的特权。

关于此任务

模块 SQL 过程一开始被允许声明为原型。SQL 过程原型允许您定义过程及其参数而不必同时指定例程体的逻辑。

在完成例程实现之前定义例程原型非常有用,并且使您不必担心交叉引用其他例程的例程的创建顺序。例如,在不使用原型的情况下,如果有 3 个例程分别名为 A、B 和 C,并且按计划您希望 A 调用 B,B 调用 C,那么必须按以下顺序创建例程:C、B、A。如果先创建例程原型,那么允许您按任意顺序实现例程、按名称引用其他例程及稍后实现例程。

不能调用没有例程体的例程。实现已定义为原型的例程的例程体是成功调用例程的先决条件。

限制

有关模块的限制,请参阅对模块的限制

过程

  1. 创建 ALTER MODULE 语句:
    1. 指定 ADD 子句以实现已在模块中对其定义原型的函数或过程。
    2. 指定下列其中一项:模块函数定义或模块过程定义。覆盖例程必须以先前指定原始原型的方式指定:参数必须完全按它们在现有例程中的方式指定,包括参数名、数据类型以及每个参数的 IN、OUT 或 INOUT 属性。
    3. 指定要更改的所有属性值。如果未指定任何一项,那么将保留原始原型定义的属性值。
  2. 从受支持 接口执行 ALTER MODULE 语句。
  3. 重复步骤 1 到 2 以完成模块中的其他例程定义。

结果

如果 ALTER MODULE 语句成功执行,那么将在模块中完整定义这些例程并可调用这些例程。例程的属性不会更改,除非显式指定且与现有例程不同。覆盖例程保留原始发布标志,并且例程在模块外部仍然可用。

示例

以下是某个脚本的另一示例,其中创建了模块及发布了较复杂的过程原型,并且添加了已发布原型的过程定义:

CREATE MODULE moo@

ALTER MODULE moo PUBLISH PROCEDURE prot 
(IN a INT, IN b BIGINT, IN c VARCHAR(20))
LANGUAGE SQL@

ALTER MODULE moo ADD PROCEDURE prot
(IN a INT, IN b BIGINT, IN c VARCHAR(20))
BEGIN
  DECLARE stmt VARCHAR(1000);
  DECLARE c1 CURSOR WITH RETURN FOR sl;

  SET stmt = 'SELECT 1 FROM (values(1))';
  PREPARE sl FROM stmt;
  OPEN c1;
END@


ALTER MODULE moo PUBLISH FUNCTION fprot (r1 INT)
RETURNS int@

ALTER MODULE moo ADD FUNCTION fprot (r1 INT)
RETURNS int
BEGIN
   RETURN r1-1;
END
@

下一步做什么

一旦您将完整例程定义添加至模块,那么您将能够成功调用这些例程。