在本地的或远程的数据库中删除例程

在您创建 SPL 例程之后,您不可更改该例程体。相反,您需要删除该例程并重新创建它。然而,在您删除例程之前,请确保您在数据库之外的某个地方有它的文本的副本。

通常,请使用带有 SPL 过程名称的 DROP PROCEDURE 和带有 SPL 函数名称的 DROP FUNCTION,如下图所示。

图: DROP PROCEDURE 和 DROP FUNCTION。

DROP PROCEDURE raise_prices;
          DROP FUNCTION read_address;
提示: 您还可使用带有函数名称的 DROP PROCEDURE 来删除 SPL 函数。然而,推荐您使用仅带有过程名称的 DROP PROCEDURE,以及仅带有函数名称的 DROP FUNCTION。
如果数据库有同名称的其他例程(重载的例程),则您不可只通过它的例程名称来删除 SPL 例程。要删除已重载了的例程,您必须指定它的签名或它的特定的名称。下图展示您可能删除重载了的例程的两种方式。

图: 删除重载了的例程。

DROP FUNCTION calculate( a INT, b INT, c INT);
            -- this is a signature
            
            DROP SPECIFIC FUNCTION calc1;
            -- this is a specific name
如果您不知道例程的类型(是函数还是过程),则您可使用 DROP ROUTINE 语句来删除它。DROP ROUTINE 对函数或过程都有效。DROP ROUTINE 还有 SPECIFIC 关键字,如下图所示。

图: DROP ROUTINE 语句。

DROP ROUTINE calculate;
            DROP SPECIFIC ROUTINE calc1;

在您删除存储在远程数据库服务器上的 SPL 例程之前,请注意下列限制。仅当只用例程名称而不需它的参数,就足以标识该例程时,您才可以 database@dbservername:owner.routinename 的形式使用完全限定的例程来删除 SPL 例程。

分布式操作中对数据类型的限制

如果 SPL 例程访问非本地的数据库服务器中的表,或调用 SPL 例程作为另一数据库服务器的数据库的 UDR,则该例程仅可有非 opaque 内建的数据类型作为它们的参数或返回的值。

然而,如果表或 UDR 驻留在同一 GBase 8s 示例的另一数据库上,则使用 SPL(或 GBase 8s 支持的外部语言)编写的例程的参数和返回的值可为内建的 opaque 数据类型 BLOB、BOOLEAN、CLOB 和 LVARCHAR。如果下列条件为真,则它们还可为 UDT 或 DISTINCT 数据类型:
  • 远程数据库与当前的数据库有相同的服务器。
  • 将 UDT 参数显式地强制转型为内建的数据类型。
  • DISTINCT 类型是基于内建的类型的,且被显式地强制转型为内建的类型。
  • 在所有参与的数据库中定义 SPL 例程和所有强制转型。