在您创建 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
例程。要删除已重载了的例程,您必须指定它的签名或它的特定的名称。下图展示您可能
删除重载了的例程的两种方式。
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 274 -
图: 删除重载了的例程。
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 例程和所有强制转型。