2014-04-16 179 views
0

我希望動態sql在mysql中創建存儲過程。例如:存儲過程從動態sql創建存儲過程

delimiter /// 

create procedure x1() 
begin 

set @sql = ' 
drop procedure if exists x2; 

delimiter /// 

create procedure x2() 
begin 

    INSERT INTO `world`.`city` 
    (`Name`, 
    `CountryCode`, 
    `District`, 
    `Population`) 
    VALUES 
    (''Meyerton'', 
    ''ZAR'', 
    ''Africa'', 
    500); 


end /// 

delimiter ; 

call x2(); 

drop procedure if exists x2;'; 

prepare stmt1 from @sql; 
execute stmt1; 
deallocate prepare stmt1; 

end /// 

delimiter ; 

call x1(); 

,但是當過我打電話的過程x1我收到以下錯誤Error Code: 1064. 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 'DELIMITER /// CREATE PROCEDURE 20140416_TriggerSP_NoUserFound() BEGIN DECLARE ' at line 3

這是從SQL代碼的實際觸發。上面的sql代碼是實際sql代碼的一個非常簡化的版本。

所以問題是,動態sql在存儲過程中可以在mysql中創建存儲過程嗎? 如果需要,請加載原始SQL。

回答

1

從MySQL的5.5 manual

下面的SQL語句可以作爲預處理語句:

ALTER TABLE 
ANALYZE TABLE 
CACHE INDEX 
CALL 
CHANGE MASTER 
CHECKSUM {TABLE | TABLES} 
COMMIT 
{CREATE | RENAME | DROP} DATABASE 
{CREATE | DROP} INDEX 
{CREATE | RENAME | DROP} TABLE 
{CREATE | RENAME | DROP} USER 
{CREATE | DROP} VIEW 
DELETE 
DO 
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES 
    | LOGS | STATUS | MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES} 
GRANT 
INSERT 
INSTALL PLUGIN 
KILL 
LOAD INDEX INTO CACHE 
OPTIMIZE TABLE 
REPAIR TABLE 
REPLACE 
RESET {MASTER | SLAVE | QUERY CACHE} 
REVOKE 
SELECT 
SET 
SHOW {AUTHORS | CONTRIBUTORS | WARNINGS | ERRORS} 
SHOW BINLOG EVENTS 
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW} 
SHOW {MASTER | BINARY} LOGS 
SHOW {MASTER | SLAVE} STATUS 
SLAVE {START | STOP} 
TRUNCATE TABLE 
UNINSTALL PLUGIN 
UPDATE 

其他語句沒有在MySQL 5.5支持。

因此創建程序是不可能的。

0

我找到了答案。

您不能在mysql中使用動態SQL創建存儲過程。

如果你把這個sql文本在mysql workbench中運行,你會發現無論你使用動態sql創建的存儲過程如何,它都會失敗。

+1

只是爲了讓你知道,stackoverflow的目標(雖然它似乎並不如此乍一看)是,某種類型的維基。因此,包括事實在內的答案將受到讚賞,包括來源。 – fancyPants

+0

對不起,我現在意識到我的答案有點模糊,而且信息量不大 –