Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получите дълбочина в рекурсията на mysql store процедура?

Знам, че конкретно попитахте как да направите това без променлива, създадена от потребителя - но за други, които попаднат на тази мисъл, би си струвало да публикуват как да го направят с едно, тъй като е доста просто:

CREATE PROCEDURE sp_recursive
BEGIN
  // ... DECLAREs here

  -- Set maximum recursion depth (max is 255)
  SET @@SESSION.max_sp_recursion_depth = 10;

  -- Increment current recursion depth
  SET @recursion_depth = IFNULL(@recursion_depth + 1, 1);
  
  -- ... More stored procedure code

  -- Decrement current recursion depth. Note: Care must be taken to ensure this line
  -- is *always* executed at the end of the stored procedure.
  SET @recursion_depth = @recursion_depth - 1;
END

Обяснение

@recursion_depth Променливата с обхват на сесията се увеличава с горния SET изявление всеки път, когато се въвежда съхранената процедура. Първият път, когато се въведе, променливата е неинициализирана и така има стойност NULL - това се проверява от IFNULL() , което го пренасочва към един в този случай. В края на съхранената процедура точно преди излизане, дълбочината трябва да бъде намалена.

Допълнителни бележки

Струва си да се отбележи, че SQL Server прави осигурете вграден @@NESTLEVEL променлива за извършване на горното - но за съжаление MySQL изглежда няма еквивалент.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Повторете една таблица

  2. Можете ли да дефинирате литерални таблици в SQL?

  3. Как да добавя ограничение за проверка в миграция на Rails?

  4. последния петък на месеца в MySQL

  5. Необходимо ли е да има индекс за всяка комбинация от заявени полета в SQL таблица, за да се оптимизира производителността?