0
我想用我的Java代碼使用hibernate動態添加存儲過程。 我做了以下但這經常會導致錯誤說「是否可以從休眠動態添加存儲過程?
您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊正確的語法使用
我究竟做錯了
String dnyLockProcedure = "DELIMITER ||"
+"\n DROP PROCEDURE IF EXISTS `dyn_lock`; "
+"\n CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
-- PROCEDURE HERE
+"\n END;"
+"\n || "
+"\n DELIMITER ;";
Query queryTest = mEntityManager.createNativeQuery(dnyLockProcedure);
queryTest.executeUpdate();
編輯:下面是整個過程:
String dnyLockProcedure ="DROP PROCEDURE IF EXISTS `dyn_lock`; "
+" CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
+" NO SQL "
+" LANGUAGE SQL "
+" COMMENT 'Get a lock for dyn cursor' "
+" BEGIN "
+" DECLARE lock_res TINYINT UNSIGNED;"
+" DECLARE CONTINUE HANDLER"
+" FOR SQLEXCEPTION"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Dynamic SQL returned an error';"
+" SET lock_res = GET_LOCK(`lock_name`, IFNULL(`timeout`, 5));"
+" IF (lock_res IS NULL) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Unknown error';"
+" ELSEIF (lock_res = 0) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Timeout expired';"
+" END IF;"
+" SET @dyn_sql = CONCAT('CREATE OR REPLACE VIEW `', lock_name, '` AS ', query, ';');"
+" PREPARE stmt_dyn_view FROM @dyn_sql;"
+" EXECUTE stmt_dyn_view;"
+" DEALLOCATE PREPARE stmt_dyn_view;"
+" END;";
你真的需要\ n和||嗎?在dnyLockProcedure? –
它會是一個問題,我可以嘗試刪除\ n但不是必需的分隔符? – rd22
請分享整個程序代碼,以便有人可以幫助你。可能是程序體中有一些語法錯誤。 – BabyDuck