我有一个基于spring的java web应用程序,它使用HSQLDB dbms后端在事务中插入大量记录。为了减少为要插入的记录生成主键的往返次数,我想创建一个存储过程,生成主键,在插入之前将其用作标识符。因此,我用以下代码创建了一个存储过程:
CREATE PROCEDURE GET_GENERATED_PKS_SEQ_VALUES(
IN NUMBEROFIDS INTEGER,
OUT GENERATEDID NUMERIC ARRAY)
BEGIN ATOMIC
DECLARE GENID NUMERIC ARRAY;
DECLARE COUNTER INTEGER DEFAULT 1;
WHILE COUNTER <= NUMBEROFIDS DO
SET GENID[COUNTER] = NEXT VALUE FOR GENERATE_PKS_SEQ;
END WHILE;
SET GENERATEDID = GENID;
END;
有一个序列GENERATE_PKS_SEQ,用于为要插入的记录生成唯一标识符。此存储过程需要一个数字输入(NUMBEROFIDS)来定义要生成的密钥数。
如果我在HSQLDB数据库管理器(Swing应用程序)中执行这条语句来创建存储过程,那么一切都正常。也就是说,执行语句时没有错误。
创建存储过程后,我尝试访问它以测试输出。所以基本上,我在HSQLDB数据库管理器中执行以下公共命令:
call GET_GENERATED_PKS_SEQ_VALUES(10);
所以我只想用上面提到的序列创建10个主键。该语句的结果是以下错误消息:在此处输入图像描述
我不知道为什么执行存储过程会出现权限错误。我创建存储过程的用户帐户与调用过程的参数相同。HSQL DBMS版本是hsqldb-2.4.0。有人知道我的错误吗?怎么了?
由于该过程有两个参数,因此必须使用两个参数调用它。
对于测试,您可以使用DECLARE TESTVAR NUMERIC ARRAY
,然后使用调用GET_GENERATED_PKS_SEQ_VALUES(10, TESTVAR)
在Java程序中,第二个参数应该是并且应该使用JDBC
CallableStatement
类的getArray()
方法来检索它。
我试图在我的内存Hsqldb数据库中设置一个存储过程,用于测试目的。我正在使用的存储过程是在MySql中开发的,所以我想用HSqlDb来设置它,以适应我的测试包 我试图创建一个简化版本的程序,但还没有乐趣。 程序是 我在运行测试时遇到的错误如下
问题内容: 是否可以在另一个存储过程中使用一个存储过程的结果? IE 我尝试使用,但无法在嵌套语句中调用。 有什么办法可以做到这一点?环境是SQL Server 2008。 问题答案: 您最多可以嵌套32个级别的存储过程。 我建议阅读这篇有关INSERT- EXEC的文章。这是一个摘录: 如果some_sp尝试使用INSERT-EXEC调用some_other_sp,您将收到一条错误消息。因此,一
是否可以在HSQLDB存储过程结束之前返回? 我试过: 这不能编译。用或代替。
是否可以在HSQLDB中创建递归存储过程? 我编写了以下一个来更新一个记录,并递归地更新所有父记录: 但我得到了以下错误: 在HyperSQL用户指南中,我找到了一些信息(请参阅HyperSQL用户指南中的递归例程),但它似乎只支持函数。 提前感谢您的支持。
在HSQLDB中,我试图创建一个存储过程,在更新数据库后执行提交。 类似:创建过程MY_PROC(p_id整数)修改SQL数据开始原子更新提交结束 创建此过程时,通过调用JDBC Statement.execute()方法,我得到了一个错误:SQLSynTaxErrorExctive:意外令牌:COMMIT必需:END 如果没有COMMIT语句,则过程将被正确编译。 知道我做错了什么吗?
我在Windows 10中使用cmake构建了一个C项目(Visual Studio 2019,尽管它只使用了构建工具而不是GUI,实际使用的编译器是clang)。如果我在没有编译器优化的情况下构建它,它会构建得很好,但是如果我使用< code > set(CMAKE _ CXX _ FLAGS _ RELEASE“-O3”)传递< code>-O3,那么编译后的二进制文件会有某种权限问题。cte