我有一个基于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个主键。该语句的结果是以下错误消息: enter image description here
我不知道为什么执行存储过程时出现权限错误。我使用相同的用户帐户创建了存储过程,该用户帐户使用上述参数调用了该过程。 HSQL DBMS版本是hsqldb-2.4.0。有人知道我的错误吗?怎么了?
答案 0 :(得分:0)
由于该过程具有两个参数,因此必须使用两个参数来调用它。
对于测试,您可以先使用DECLARE TESTVAR NUMERIC ARRAY
,然后再使用call GET_GENERATED_PKS_SEQ_VALUES(10, TESTVAR)
在Java程序中,第二个参数应为?
,并应使用JDBC getArray()
类的CallableStatement
方法进行检索。