ALTER MODULE 语句

ALTER MODULE 语句将更改模块的定义。

调用

此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

权限

语句的授权标识所拥有的特权必须包括模块的所有权,并且还必须包括调用 ALTER MODULE 语句中指定的 SQL 语句所必需的所有 特权。

语法

Read syntax diagramSkip visual syntax diagramALTER MODULEmodule-nameADDmodule-condition-definitionmodule-function-definitionmodule-procedure-definitionmodule-type-definitionmodule-variable-definitionDROPBODYmodule-object-identificationPUBLISHmodule-condition-definitionmodule-function-definitionmodule-procedure-definitionmodule-type-definitionmodule-variable-definition
module-condition-definition
Read syntax diagramSkip visual syntax diagramCONDITIONcondition-nameFORSQLSTATEVALUEstring-constant
module-object-identification
Read syntax diagramSkip visual syntax diagrammodule-function-designatormodule-procedure-designatorCONDITIONcondition-nameTYPEtype-nameVARIABLEvariable-name
module-function-designator
Read syntax diagramSkip visual syntax diagramFUNCTIONunqualified-function-name(,data-type)SPECIFIC FUNCTIONunqualified-specific-name
module-procedure-designator
Read syntax diagramSkip visual syntax diagramPROCEDUREunqualified-procedure-name(,data-type)SPECIFIC PROCEDUREunqualified-specific-name

描述

模块名称
标识要变更的模块。 module-name 必须标识当前服务器上存在的模块 (SQLSTATE 42704)。 指定的名称不得是模块的别名 (SQLSTATE 560CT)。
ADD
将对象添加到模块或将主体添加到没有主体的模块中已存在的例程定义。 如果添加用户定义的类型或全局变量,那么对象不得标识模块中已存在的用户定义的类型或全局变量。 如果用户定义的类型或全局变量不存在,那么会将其添加到模块中,以便仅在模块中使用。
如果添加例程并且指定的例程不存在,那么将添加该例程。 如果添加例程并且指定的例程存在,那么现有例程定义不得包含例程主体 (SQLSTATE 42723)。 此例程原型将完全替换为新的例程定义,包括例程属性和例程主体,但已发布的属性将保留。 如果满足下列其中一个条件,那么将认为指定的例程存在:
  • 模块中有一个具有相同特定名称和相同例程名称的例程。
  • 指定的例程是一个过程,并且模块中有一个过程具有相同的过程名称和相同的参数数目。 参数的名称和数据类型不需要匹配。
  • 指定的例程是一个函数,在模块中有一个函数具有相同的函数名和具有匹配数据类型的相同数目的参数。 参数数据类型的长度,精度和小数位不会进行比较,并且在确定指定的例程是否存在时可以不同。 参数的名称不需要匹配。
module-condition-definition
添加模块条件。
condition-name
条件的名称。 该名称不得标识模块中的现有条件。 必须在没有任何限定的情况下指定 condition-name (SQLSTATE 42601)。 条件的名称在模块中必须唯一。
FOR SQLSTATE 字符串常量
指定与条件相关联的 SQLSTATE。 必须将字符串常量指定为以单引号括起的五个字符,并且 SQLSTATE 类 (前两个字符) 不得为 "00"。 这是一个可选子句。
module-function-definition
用于添加函数的语法与 CREATE FUNCTION 语句 (不包括 CREATE 关键字) 相同,并且必须在没有任何限定的情况下指定 function-name 和 specific-name (SQLSTATE 42601)。 如果该函数在模块中是唯一的,那么将添加新的函数。 如果该函数与不包含主体 (SQL-routine-body 或 EXTERNAL NAME 子句) 的现有函数匹配,那么此函数原型将替换为新定义,但保留已发布的属性除外。 将处理添加到模块的所有 SQL 函数,就像使用了复合 SQL (已编译) 语句一样。

仅当 SQL-routine-body 是指定 NOT ATatomic 的复合 SQL (编译型) 语句时,模块函数定义才能指定 RETURNS TABLE 子句。 模块函数定义不得指定 SOURCE 子句, TEMPLATE 子句或 LANGUAGE OLEDEB 选项 (SQLSTATE 42613)。

module-procedure-definition
用于定义过程的语法与 CREATE PROCEDURE 语句 (不包括 CREATE 关键字) 相同,必须在没有任何限定的情况下同时指定 procedure-name 和 specific-name (SQLSTATE 42601)。 如果过程特征符在模块中是唯一的,那么将添加新过程。 如果该过程与不包含主体 (SQL-routine-body 或 EXTERNAL NAME 子句) 的现有过程匹配,那么此过程原型将替换为新定义,除非保留已发布的属性。 该过程的名称只能以 SYS_ 开头,以添加名为 SYS_INIT 的模块初始化过程。 请参阅 "注释" 以获取详细信息。
module-type-definition
用于定义用户定义的类型的语法与 CREATE TYPE 语句 (不包括 CREATE 关键字) 相同,必须指定 type-name 而不进行任何限定 (SQLSTATE 42601)。 用户定义类型的名称在模块中必须唯一。 无法在模块中定义结构化类型。 在模块中还定义了支持类型定义所需的任何生成的函数。 如果已发布模块用户定义的类型,那么生成的函数也是如此。
module-variable-definition
用于定义变量的语法与 CREATE VARIABLE 语句 (不包括 CREATE 关键字) 相同,必须在没有任何限定的情况下指定 variable-name (SQLSTATE 42601)。 变量的名称在模块中必须唯一。
DROP
删除模块的指定部分。 module-object-identification 语法用于标识要删除的对象,除非正在删除模块的主体。
BODY
删除模块主体,包括:
  • 所有未发布的对象。
  • 任何已发布 SQL 例程的例程主体
  • 任何已发布的外部例程的 EXTERNAL 引用。
PUBLISH
向模块添加新对象并使其可供在模块外部使用。 对于例程,可以指定不包含例程的可执行主体的例程原型。
module-condition-definition
添加可在模块外部使用的模块条件。
condition-name
条件的名称。 该名称不得标识模块中的现有条件。 必须在没有任何限定的情况下指定 condition-name (SQLSTATE 42601)。 条件的名称在模块中必须唯一。
FOR SQLSTATE 字符串常量
指定与条件相关联的 SQLSTATE。 必须将字符串常量指定为以单引号括起的五个字符,并且 SQLSTATE 类 (前两个字符) 不得为 "00"。 这是一个可选子句。
module-function-definition
用于定义该函数的语法与 CREATE FUNCTION 语句 (不包括 CREATE 关键字) 相同,必须在没有任何限定的情况下指定 function-name 和 specific-name (SQLSTATE 42601)。 函数的定义必须包括函数名,任何参数的完整规范和返回子句。 未发布的模块用户定义的数据类型不是参数数据类型或 RETURNS 子句数据类型的候选者。 未发布的模块变量不是参数数据类型或返回数据类型的 ANCHOR 子句中的锚点对象的候选者。 可以通过省略 LANGUAGE 子句 (或指定 LANGUAGE SQL) 和 SQL 例程主体来指定函数原型。 函数特征符在模块中必须唯一。 函数的名称不得以 "SYS_" 开头 (SQLSTATE 42939)。 将处理添加到模块的所有 SQL 函数,就像使用了复合 SQL (已编译) 语句一样。 

仅当 SQL-routine-body 是指定 NOT ATatomic 的复合 SQL (编译型) 语句时,模块函数定义才能指定 RETURNS TABLE 子句。 模块函数定义不得指定 SOURCE 子句, TEMPLATE 子句或 LANGUAGE OLEDEB 选项 (SQLSTATE 42613)。

module-procedure-definition
用于定义过程的语法与 CREATE PROCEDURE 语句 (不包括 CREATE 关键字) 相同,必须在没有任何限定的情况下同时指定 procedure-name 和 specific-name (SQLSTATE 42601)。 过程的定义必须包含过程名称和任何参数的完整规范。 未发布的模块用户定义的数据类型不是参数数据类型的候选者。 未发布的模块变量不是参数定义的 ANCHOR 子句中锚点对象的候选者。 可以通过省略 LANGUAGE 子句 (或指定 LANGUAGE SQL) 和 SQL 例程主体来指定函数原型。 过程特征符在模块中必须唯一。 该过程的名称不得以 "SYS_" 开头 (SQLSTATE 42939)。
module-type-definition
用于定义用户定义的类型的语法与 CREATE TYPE 语句 (不包括 CREATE 关键字) 相同,必须指定 type-name 而不进行任何限定 (SQLSTATE 42601)。 未发布的模块用户定义的数据类型不是模块用户定义的数据类型定义中引用的任何数据类型的候选者。 未发布的模块变量不是 ANCHOR 子句中锚点对象的候选者。 用户定义类型的名称不得以 "SYS_" 开头 (SQLSTATE 42939) ,并且在模块中必须唯一。 无法在模块中定义结构化类型。 支持类型定义所需的任何已生成函数也在模块中定义为已发布函数。
module-variable-definition
用于定义变量的语法与 CREATE VARIABLE 语句 (不包括 CREATE 关键字) 相同,必须在没有任何限定的情况下指定 variable-name (SQLSTATE 42601)。 未发布的模块用户定义的数据类型不是变量定义中引用的任何数据类型的候选者。 未发布的模块变量不是 ANCHOR 子句中锚点对象的候选者。 变量的名称不得以 "SYS_" 开头 (SQLSTATE 42939) ,并且在模块中必须唯一。
module-object-identification
标识唯一的模块对象。
module-function-designator
唯一地标识单个模块函数。
FUNCTION unqualified-function-name
标识特定函数,并且仅当模块中正好有一个名为 unqualified-function-name 的函数实例时才有效。 所识别的函数可以定义有任意数目的参数。 如果模块中不存在具有此名称的函数,那么会产生错误 (SQLSTATE 42704)。 如果模块中有多个函数实例,那么会发生错误 (SQLSTATE 42725)。
FUNCTION unqualified-function-name (data type , ...)
提供函数特征符,该特征符唯一地识别函数。 不使用函数解析算法。
unqualified-function-name
指定函数的名称。
(data-type,...)
值必须与最初定义函数时 (在相应位置) 指定的数据类型匹配。 使用数据类型的数目以及数据类型的逻辑并置来识别特定函数实例。

如果某种数据类型未限定,那么会通过在 SQL 路径上搜索模式来解析类型名称。 这也适用于指定给 REFERENCE 类型的数据类型名称。

不必指定参数化数据类型的长度、精度或小数位。 相反,可以编码一组空的括号,以指出查找数据类型匹配时应忽略这些属性。 不得使用 FLOAT() (SQLSTATE 42601),因为参数值指示不同的数据类型(REAL 或 DOUBLE)。 如果对长度,精度或小数位进行了编码,那么该值必须与定义函数时指定的值完全匹配。

A type of FLOAT(n) does not need to match the defined value for n, because 0 < n < 25 means REAL, and 24 < n < 54 means DOUBLE. 匹配会根据类型是 REAL 还是 DOUBLE 来进行。 如果模块中不存在具有指定特征符的函数,那么将发生错误 (SQLSTATE 42883)。

SPECIFIC FUNCTION unqualified-specific-name
使用在函数定义时指定或缺省为的名称来标识特定用户定义的函数。 未限定的特定名称必须标识模块中的特定函数实例; 否则,将返回错误 (SQLSTATE 42704)。
module-procedure-designator
唯一地标识单个模块过程。
PROCEDURE unqualified-procedure-name
标识特定过程,并且仅当模块中正好有一个名为 unqualified-procedure-name 的过程实例时才有效。 所识别的过程可以定义有任意数目的参数。 如果模块中不存在具有此名称的过程,那么将返回错误 (SQLSTATE 42704)。 如果模块中存在该过程的多个实例,那么将返回错误 (SQLSTATE 42725)。
PROCEDURE unqualified-procedure-name (data type , ...)
提供过程特征符,该特征符唯一地识别过程。 不使用过程解析算法。
unqualified-procedure-name
指定过程的名称。
(data-type,...)
值必须与最初定义过程时 (在相应位置) 指定的数据类型相匹配。 使用数据类型的数目以及数据类型的逻辑并置来识别特定过程实例。

如果某种数据类型未限定,那么会通过在 SQL 路径上搜索模式来解析类型名称。 这也适用于指定给 REFERENCE 类型的数据类型名称。

不必指定参数化数据类型的长度、精度或小数位。 相反,可以编码一组空的括号,以指出查找数据类型匹配时应忽略这些属性。

不得使用 FLOAT() (SQLSTATE 42601),因为参数值指示不同的数据类型(REAL 或 DOUBLE)。 如果编码了长度,精度或小数位,那么该值必须与定义过程时指定的值完全匹配。

A type of FLOAT(n) does not need to match the defined value for n, because 0 < n < 25 means REAL, and 24 < n < 54 means DOUBLE. 匹配会根据类型是 REAL 还是 DOUBLE 来进行。

如果模块中不存在具有指定特征符的过程,那么将返回错误 (SQLSTATE 42883)。

SPECIFIC PROCEDURE unqualified-specific-name
使用在过程定义时指定或缺省为的名称来标识特定过程。 未限定的特定名称必须标识模块中的特定过程实例; 否则,将返回错误 (SQLSTATE 42704)。
TYPE type-name
标识模块中用户定义的类型。 必须在没有任何限定的情况下指定 type-name (SQLSTATE 42601) ,并且必须标识模块中存在的用户定义的类型 (SQLSTATE 42704)。
VARIABLE variable-name
标识模块中的全局变量。 必须在没有任何限定的情况下指定变量名 (SQLSTATE 42601) ,并且必须标识模块中存在的全局变量 (SQLSTATE 42704)。
CONDITION condition-name
标识模块中的条件。 必须在没有任何限定的情况下指定 condition-name ,并且必须标识模块中存在的条件 (SQLSTATE 42737)。

规则

  • 模块中对象的名称不能以 "SYS_" 开头,但专门指定的 SYS_INIT 过程名称除外 (SQLSTATE 42939)。
  • ALTER MODULE DROP FUNCTION: 如果在行许可权或列掩码的定义中引用了该函数,那么无法删除该函数 (SQLSTATE 42893)。
  • ALTER MODULE DROP VARIABLE: 如果在行许可权或列掩码的定义中引用了该变量,那么无法删除该变量 (SQLSTATE 42893)。
  • ALTER MODULE DROP BODY: 如果在行许可权或列掩码的定义中引用了该模块,那么无法删除该模块 (SQLSTATE 42893)。

注意

  • 模块初始化: 模块可以具有名为 SYS_INIT 的特殊初始化过程,该过程在对模块例程或模块全局变量进行第一个引用时隐式执行。 必须实现 SYS_INIT 过程而不使用任何参数,不能返回结果集,并且可以是无法发布的 SQL 或外部过程 (SQLSTATE 428HP)。 如果 SYS_INIT 过程失败,那么将针对导致模块初始化的语句返回错误 (SQLSTATE 56098)。
  • 使用模块条件: 模块条件只能与 SIGNAL 语句, RESIGNAL 语句或 复合 SQL (编译) 语句中的处理程序声明配合使用。
  • 失效: 如果使用 ADD 操作替换例程原型,那么依赖于已发布模块例程的所有对象都将失效。 如果发出 DROP BODY ,那么依赖于已发布的模块例程的所有对象都将失效。
  • 模糊处理: 可以采用模糊处理形式提交 ALTER MODULE ADD FUNCTION , ALTER MODULE ADD PROCEDURE , ALTER MODULE PUBLISH FUNCTION 和 ALTER MODULE PUBLISH PROCEDURE 语句。 在模糊化语句中,只有例程名称及其参数是可读的。 该语句的其余部分以不可读的方式进行编码,但可由数据库服务器进行解码。 可以通过调用 DBMS_DDL.WRAP 函数来生成模糊化的语句。

示例

以下语句创建名为 INVENTORY 的模块,其中包含关联数组类型,该数据类型的变量,向数组添加元素的过程以及从数组中抽取元素的函数。 根据相应 ALTER MODULE 语句中的 PUBLISH 关键字,只能从模块外部引用函数和过程。 数据类型和变量只能由模块中的其他对象引用。
     CREATE MODULE INVENTORY

     ALTER MODULE INVENTORY ADD
     TYPE ITEMLIST AS INTEGER ARRAY[VARCHAR(100)]

     ALTER MODULE INVENTORY ADD
     VARIABLE ITEMS ITEMLIST

     ALTER MODULE INVENTORY PUBLISH
     PROCEDURE UPDATE_ITEM(NAME VARCHAR(100), QUANTITY INTEGER)
     BEGIN
     SET ITEMS[NAME] = QUANTITY;
     END

     ALTER MODULE INVENTORY PUBLISH
     FUNCTION CHECK_ITEM(NAME VARCHAR(100)) RETURNS INTEGER
     RETURN ITEMS[NAME]