2015-01-26 3 views
0

Я пытаюсь написать общую процедуру sql, которая может выполнять любую строку в виде инструкции sql.динамический sql в mysql хранимой процедуре

Вот определение процедуры.

DELIMITER // 

DROP PROCEDURE IF EXISTS execute_dynamic_sql; 
CREATE PROCEDURE execute_dynamic_sql (IN sql_query longtext) 
BEGIN 
SELECT sql_query; 
PREPARE stmt FROM @sql_query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END // 

Я звоню выше функции, как это

mysql> call execute_dynamic_sql('show tables'); 
    -> // 
+-------------+ 
| sql_query | 
+-------------+ 
| show tables | 
+-------------+ 
1 row in set (0.00 sec) 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1 
mysql> # 

Может кто-нибудь сказать мне, почему приходит ошибка?

+0

... Почему вы пишете процедуру для выполнения запроса? Почему бы просто не выполнить запрос? – ceejayoz

+0

Мне нужно сделать много операторов sql и выполнить его. Итак, я переместил 4 общие строки в другую процедуру. –

ответ

2

Важно указать разницу между 9.4. User-Defined Variables и рутинными параметрами 13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax, это разные переменные.

В вашем примере @sql_query is NULL и sql_query присвоено значение SHOW TABLES.

Try:

DELIMITER// 

CREATE PROCEDURE `execute_dynamic_sql` (IN `sql_query` LONGTEXT) 
BEGIN 
    SET @`sql_query` := `sql_query`; 
    PREPARE `stmt` FROM @`sql_query`; 
    EXECUTE `stmt`; 
    DEALLOCATE PREPARE `stmt`; 
END// 

DELIMITER; 

SQL Fiddle demo

Смежные вопросы