【发布时间】:2015-06-10 05:37:12
【问题描述】:
我想使用 hibernate 从我的 Java 代码中动态添加存储过程。 我做了以下操作,但这经常导致错误提示“
您的 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,但分隔符不是必需的吗?
-
请分享整个程序代码,以便有人可以帮助您。过程体中可能存在一些语法错误。
-
@BabyDuck 问题是用整个程序代码更新的,但是我认为程序中不会出现错误,因为我可以在 MySql 中成功运行相同的程序。 PS。我已删除“\n”和 DELIMITER。
-
我猜问题可能出在方法调用 executeUpdate() 上,因为这应该使用更新查询来调用,但这是一个创建语句,你怎么看?
标签: java mysql sql hibernate stored-procedures