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

Динамичен курсор в съхранената процедура

От Ръководството за MySQL

Има обаче 2 начина.

Първият е за случаите, когато абсолютно само един потребител в даден момент ще изпълнява процедурата. Изявление за подготовка може да се използва за създаване на изглед с динамичния SQL и курсорът може да избира от този изглед със статично име. Няма почти никакво влияние върху производителността. За съжаление, тези изгледи са видими и за други потребители (няма такова нещо като временен изглед), така че това няма да работи за множество потребители.

Аналогично, временна таблица може да бъде създадена в изявлението за подготовка и курсорът може да избира от временната таблица. Само текущата сесия може да види временна таблица, така че проблемът с множество потребители е разрешен. Но това решение може да има значително въздействие върху производителността, тъй като трябва да се създава временна таблица всеки път, когато процедурата се изпълнява.

В крайна сметка:Все още имаме нужда от курсори, за да можем да се създават динамично!

Ето пример за използване на изглед за предаване на името на таблицата и името на колоната в курсора от mysql форуми

DELIMITER // 
DROP PROCEDURE IF EXISTS test_prepare// 

CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50)) 
BEGIN 
DECLARE cursor_end CONDITION FOR SQLSTATE '02000'; 
DECLARE v_column_val VARCHAR(50); 
DECLARE done INT DEFAULT 0; 
DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw; 
DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1; 

SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename); 
select @query; 
PREPARE stmt from @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

OPEN cur_table; 
FETCH cur_table INTO v_column_val; 
WHILE done = 0 DO 
SELECT v_column_val; 
FETCH cur_table INTO v_column_val; 
END WHILE; 
CLOSE cur_table; 

DROP VIEW test_prepare_vw; 

END; 
// 

DELIMITER ;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изчисляване на процентилен ранг в MySQL

  2. MySQL - Mac - Грешка 2002 - Не мога да се свържа с локално... чрез сокет

  3. Как да коригирам тази грешка mysql_fetch_assoc() очаква параметър 1 да бъде ресурс, логически посочен?

  4. актуализиране на няколко реда, използвайки лимит в mysql?

  5. Вътрешна грешка на Django 500 на сървъра - неправилно конфигурирана:Грешка при зареждане на модула MySQLdb: