当您具有现有过程或函数并希望创建使用它们的新过程时,可以使用标头代替原件以避免相关性问题。
创建过程时,必须事先存在属于该过程的所有嵌套过程。如果过程 P1 在内部调用 P2,则必须在 P1 之前创建 P2。否则,创建 P1 失败,并显示错误消息“P2 不存在”。如果应用程序逻辑较大,并且没有可用的导出或交付单元,则很难确定需要创建对象的顺序。
为避免出现此类相关性问题,SAP 引入了 HEADERS. HEADERS 允许您创建一组仅包含过程或函数接口的最小元数据信息。
AS HEADER ONLY通过使用 HEADER ONLY 关键字为过程创建标头,如以下示例所示:
CREATE PROCEDURE [()] AS HEADER ONLY; 使用此语句,可以创建具有给定签名
以下语句使用标量输入 TEST_PROC 和表格输出 INVAR 创建过程 OUTTAB:
CREATE PROCEDURE TEST_PROC (IN INVAR NVARCHAR(10), OUT OUTTAB TABLE(A INT)) AS HEADER ONLY您可以以类似的方式创建功能抬头。
CREATE FUNCTION [()] RETURNS AS HEADER ONLY 通过检查系统视图 is_header_only 中的 PROCEDURES 字段,可以验证是否已定义仅抬头过程。
SELECT procedure_name, is_header_only from SYS.PROCEDURES如果要检查功能,则需要查看系统视图 FUNCTIONS。
定义过程或函数的标头后,其他过程或函数可以在其过程主体中引用它。包含这些标头的过程可以按以下示例所示进行编译:
CREATE PROCEDURE OUTERPROC (OUT OUTTAB TABLE (A INT)) LANGUAGE SQLSCRIPT
AS
BEGIN
DECLARE s INT;
s = 1;
CALL TEST_PROC (:s, outtab);
END;
只要过程或函数仅包含标头定义,就无法执行它们。此外,使用此过程或包含标头的功能的所有过程和函数无法执行,因为它们都无效。
要对此进行更改并从标头定义中创建有效过程或函数,需要将标头 替换为完整容器定义。使用 ALTER 语句替换过程的标头定义,如下所示:
ALTER PROCEDURE [()] [LANGUAGE ]
[DEFAULT SCHEMA ]
[READS SQL DATA] [] [ DETERMINISTIC ] [WITH ENCRYPTION] [AUTOCOMMIT DDL { ON|OFF } ] AS
BEGIN [SEQUENTIAL EXECUTION]
END
对于功能抬头,任务相似,如以下示例所示:
ALTER FUNCTION [()] RETURNS
[LANGUAGE ] [SQL SECURITY ] [DEFAULT SCHEMA ] [READS SQL DATA] []
[DETERMINISTIC][WITH ENCRYPTION]
AS
BEGIN
END
例如,如果要替换已经定义的 TEST_PROC 的标头定义,则 ALTER 语句将如下所示:
ALTER PROCEDURE TEST_PROC (IN INVAR NVARCHAR(10), OUT OUTTAB TABLE(A INT))
LANGUAGE SQLSCRIPT SQL SECURITY INVOKER READS SQL DATA
AS
BEGIN
DECLARE tvar TABLE (A INT, name nvarchar(10));
tvar = SELECT * FROM TAB WHERE name = :invar;
outtab = SELECT A FROM :tvar;
END
名为 HEADER ONLY ON INVALID 的可选关键字允许函数在变为无效时自动切换到 HEADER ONLY 状态。通常,如果功能无效,则无法创建相关对象。但是,使用 HEADER ONLY ON INVALID 选项,可以创建依赖对象,因为函数在变为无效时转换为 HEADER ONLY 状态。
此选项仅适用于表用户定义函数 (TUDF),不适用于标量用户定义函数 (SUDF) 或过程创建。
此示例使用 hooi1 选项创建函数 HEADER ONLY ON INVALID,使其在变为无效时切换到仅标头状态。
CREATE TABLE T2 (i INT);
CREATE FUNCTION hooi1
RETURNS TABLE(i INT)
AS HEADER ONLY
ON INVALID
BEGIN
RETURN SELECT i FROM T2;
END;
DROP TABLE T2;
CREATE FUNCTION hooi2
RETURNS TABLE(i INT)
AS
BEGIN
RETURN SELECT i FROM hooi1();
END;
此选项确保即使函数处于无效状态,也可以对其进行引用,从而更有效地管理依赖项。