Рекурсивная хранимая процедура в HSQLDB - PullRequest
0 голосов
/ 24 апреля 2020

возможно ли создать рекурсивную хранимую процедуру в 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

В Hyper SQL Руководство пользователя Я нашел некоторую информацию (см. Рекурсивные подпрограммы в Hyper SQL Руководство пользователя), но это кажется, что он поддерживается только для функций.

Заранее благодарен за поддержку.

1 Ответ

0 голосов
/ 24 апреля 2020

Вы можете создавать рекурсивные процедуры, следуя тем же рекомендациям. Сначала создайте процедуру с простым телом, которое выдает исключение. Вам необходимо указать SPECIFI C название процедуры:

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; 
...