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;
是否可以在 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;