当前位置: 首页 > 知识库问答 >
问题:

HSQLDB中的递归存储过程

太叔景同
2023-03-14

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

但我得到了以下错误:

用户缺少权限或找不到对象:UPDATEFOLDERTOTALS/错误代码:-5501/状态:42501

在HyperSQL用户指南中,我找到了一些信息(请参阅HyperSQL用户指南中的递归例程),但它似乎只支持函数。

提前感谢您的支持。

共有1个答案

郭璞
2023-03-14

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

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数据库中设置一个存储过程,用于测试目的。我正在使用的存储过程是在MySql中开发的,所以我想用HSqlDb来设置它,以适应我的测试包 我试图创建一个简化版本的程序,但还没有乐趣。 程序是 我在运行测试时遇到的错误如下

  • 是否可以在HSQLDB存储过程结束之前返回? 我试过: 这不能编译。用或代替。

  • 在HSQLDB中,我试图创建一个存储过程,在更新数据库后执行提交。 类似:创建过程MY_PROC(p_id整数)修改SQL数据开始原子更新提交结束 创建此过程时,通过调用JDBC Statement.execute()方法,我得到了一个错误:SQLSynTaxErrorExctive:意外令牌:COMMIT必需:END 如果没有COMMIT语句,则过程将被正确编译。 知道我做错了什么吗?

  • 我试图写一个存储过程。通过SQL浏览器创建它很顺利,但是当我把它保存在SQL文件中并通过SQLTool加载它时,它失败了 我收到以下错误 调用SqlTool。objectMain(sqlToolParams); 在哪里 我需要帮助纠正语法。 我试图从他那里得到线索http://hsqldb.org/doc/2.0/util-guide/sqltool-chapt.html#sqltool_raw-

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 我正在尝试制作一个可为特定类别递归构建路径的函数 当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它可以正常工作,但是当我尝试使用parent_id> 0的类别时,我得到1424递归存储的函数和触发器是不允许的。 我该如何解决?我将在常规的Web托管服务上托管此代码,该服务至少应具有MySQL服务器版本5.1。 在Ike Walker的帮助下,我做了一个程序,但是