您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

表参数的类型和长度检查

对于类型代码和长度或精度/标度信息,表格变量的派生表类型应始终与相应变量的声明类型匹配。这对于签名变量尤为重要,因为它们可视为调用者将遵循的合同。如果可以转换而不丢失信息,则会隐式转换派生类型代码(有关支持哪些数据类型转换的更多详细信息,请参阅《SAP HANA SQL 和系统视图参考》)。

如果派生类型比预期类型(例如 BIGINT)大(例如 INTEGER),则可能导致错误,如以下示例所示。

过程 PROC_TYPE_MISMATCH 具有已定义的表格输出变量 RESULT,其单个列类型为 VARCHAR,长度为 2。从表变量分配派生的类型具有长度为 10 的类型为 VARCHAR 的单个列。

CREATE COLUMN TABLE  tab_vc10 (A VARCHAR(10));

INSERT INTO tab_vc10 VALUES ('ab');

INSERT INTO tab_vc10 VALUES ('ab');

CREATE PROCEDURE PROC_WITH_TYPE_MISMATCH (OUT result TABLE(A VARCHAR(2))) AS

BEGIN

result = select A from tab_vc10;

END;

只要长度差异无关紧要,调用此过程就会正常工作,例如,从任何 SQL 客户端调用此过程都不会导致问题。但是,使用结果进行进一步处理可能会导致错误,如以下示例所示:

CREATE PROCEDURE PROC_WITH_TYPE_MISMATCH_CALLER() AS

BEGIN

CALL PROC_WITH_TYPE_MISMATCH (result);

INSERT INTO tab_vc2(select * from :result);

END

过程 PROC_WITH_TYPE_MISMATCH_CALLER 尝试将过程 PROC_WITH_TYPE_MISMTACH 的结果插入到表 tab_vc2 中,该表具有长度为 2 的类型为 VARCHAR 的单个列。如果接收到的结果中的值长度超过 2 个字符,此操作将抛出错误:inserted value to large。请注意,如果接收的结果中的值长度不超过 2 个字符,INSERT 操作将正常运行。

为避免此类错误,引入了配置参数 Typecheck_Procedure_Output_Var 和 Typecheck_Procedure_Input_Var。这些参数旨在公开预期和派生类型信息之间的差异。参数的缺省行为是在类型不匹配时返回警告。例如,在创建或调用过程 PROC_WITH_TYPE_MISMATCH 期间,将抛出以下警告:

Declared type "VARCHAR(2)" of attribute "A" not same as assigned type "VARCHAR(10)"

如果派生类型大于预期类型,则配置参数具有三个不同级别来显示预期类型和派生类型之间的差异: 级别输出描述静默--忽略潜在类型错误警告常规警告:属性 "A" 的声明类型 "VARCHAR(2)" 与分配的类型 "VARCHAR(10)" 不同类型不匹配时打印警告(缺省行为)严格返回类型不匹配:属性 "A" 的声明类型 "VARCHAR(2)" 与分配的类型 "VARCHAR(10)" 不同潜在类型错误情况下的错误  备注需要在 sqlscript 部分定义这两个配置参数。