You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可用于索引表达式的自定义函数?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)。

确定性函数指的是,对于相同的输入参数,每次调用都会返回完全一致的结果。你的原函数未标记为确定性,这是触发错误的关键原因。

具体实现步骤:

  1. 修改函数定义,添加DETERMINISTIC关键字
    重新创建函数时,需在返回类型声明后明确标注该属性:

    CREATE FUNCTION MyFunc 
       ( 
       InputValue CHAR(10)
       )
       RETURNS CHAR(10) DETERMINISTIC
    BEGIN
    RETURN InputValue;
    END;
    

    这样ADS就能识别该函数符合索引键的稳定性要求。

  2. 重新创建索引
    确认函数修改完成后,你可以继续使用sp_CreateIndex90存储过程,或使用更简洁的CREATE INDEX语句创建索引:

    CREATE INDEX IDX_FIELD1 ON table1 (MyFunc(field1))
    

注意事项:

  • 非确定性函数(例如包含GETDATE()、随机数生成或依赖外部状态的逻辑)无法用于索引键,因为索引需要稳定的键值支撑。
  • 确保函数返回类型与索引键的类型要求兼容,避免因隐式类型转换引发异常。

内容的提问来源于stack exchange,提问作者Ivan Yuzafatau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:25:01