如何创建可用于索引表达式的自定义函数?Advantage数据库是否支持?
问题:Advantage Database Server 中自定义函数能否用于索引键?
我创建了一个接收CHAR(10)类型参数并返回相同值的自定义函数MyFunc,该函数可在SELECT查询中正常使用,示例如下:
CREATE FUNCTION MyFunc ( InputValue CHAR(10) ) RETURNS CHAR(10) BEGIN RETURN InputValue; END;
SELECT查询使用示例:
SELECT MyFunc(field1) FROM table1;
但在调用sp_CreateIndex90创建索引时,将MyFunc(field1)作为索引键表达式执行如下语句:
EXECUTE PROCEDURE sp_CreateIndex90( 'table1', 'table1.adi', 'IDX_FIELD1', 'MyFunc(field1)', '', 2, 512, '' );
出现错误:
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 3007;
[SAP][Advantage SQL Engine][ASA] Error 3007: Unsupported function found in index key expression.
现咨询:Advantage Database Server是否允许创建可用于索引的自定义函数?若允许,该如何实现?
解答
Advantage Database Server (ADS) 允许将自定义函数用于索引键,但核心要求是:函数必须是确定性的(DETERMINISTIC)。
确定性函数指的是,对于相同的输入参数,每次调用都会返回完全一致的结果。你的原函数未标记为确定性,这是触发错误的关键原因。
具体实现步骤:
修改函数定义,添加
DETERMINISTIC关键字
重新创建函数时,需在返回类型声明后明确标注该属性:CREATE FUNCTION MyFunc ( InputValue CHAR(10) ) RETURNS CHAR(10) DETERMINISTIC BEGIN RETURN InputValue; END;这样ADS就能识别该函数符合索引键的稳定性要求。
重新创建索引
确认函数修改完成后,你可以继续使用sp_CreateIndex90存储过程,或使用更简洁的CREATE INDEX语句创建索引:CREATE INDEX IDX_FIELD1 ON table1 (MyFunc(field1))
注意事项:
- 非确定性函数(例如包含
GETDATE()、随机数生成或依赖外部状态的逻辑)无法用于索引键,因为索引需要稳定的键值支撑。 - 确保函数返回类型与索引键的类型要求兼容,避免因隐式类型转换引发异常。
内容的提问来源于stack exchange,提问作者Ivan Yuzafatau
相关产品推荐
相关产品推荐

