HSQLDB 中的递归存储过程

Recursive stored procedure in HSQLDB

是否可以在 HSQLDB 中创建递归存储过程?

我写了下面的代码来更新记录并递归所有父记录:

CREATE PROCEDURE updateFolderTotals(IN p_id VARCHAR(32), IN p_size BIGINT, IN p_files INT, IN p_folders INT) 
  MODIFIES SQL DATA 
  BEGIN ATOMIC  
    DECLARE l_parentid VARCHAR(32); 
    UPDATE folders  
    SET tot_files = tot_files + p_files, 
        tot_size = tot_size + p_size , 
        tot_folders = tot_folders + p_folders 
    WHERE id = p_id;  

    SELECT parentid INTO l_parentid FROM folders WHERE id = p_id; 

    IF (l_parentid IS NOT NULL) THEN 
        CALL updateFolderTotals(l_parentid,p_size,p_files,p_folders); 
    END IF; 

  END; 

但我收到以下错误:

user lacks privilege or object not found: UPDATEFOLDERTOTALS / Error Code: -5501 / State: 42501

我在 HyperSQL 用户指南中找到了一些信息(请参阅 HyperSQL 用户指南中的 Recursive Routines),但它似乎仅支持函数。

在此先感谢您的支持。

您可以按照相同的准则创建递归过程。首先用一个抛出异常的简单主体创建过程。您需要指定过程的具体名称:

CREATE PROCEDURE updateFolderTotals(IN p_id VARCHAR(32), IN p_size BIGINT, IN p_files   INT, IN p_folders INT) 
  SPECIFIC updateFolderTotals_1 MODIFIES SQL DATA 
  SIGNAL SQLSTATE '45000'

然后修改创建的程序全文:

ALTER SPECIFIC ROUTINE updateFolderTotals_1
  BEGIN ATOMIC  
  DECLARE l_parentid VARCHAR(32); 
  UPDATE folders  
  SET tot_files = tot_files + p_files, 
    tot_size = tot_size + p_size , 
    tot_folders = tot_folders + p_folders 
  WHERE id = p_id;  

  SELECT parentid INTO l_parentid FROM folders WHERE id = p_id; 

  IF (l_parentid IS NOT NULL) THEN 
    CALL updateFolderTotals(l_parentid,p_size,p_files,p_folders); 
  END IF; 
END;