【问题标题】:Is it possible to add Stored procedure dynamically from hibernate?是否可以从休眠状态动态添加存储过程?
【发布时间】: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


【解决方案1】:

所以我发现上面的存储过程有什么问题:

  1. 不需要使用 DELIMITER,从 CREATE PROCEDURE 开始
  2. “\n”的使用也不是必须的,但使用不会提示错误。
  3. 您不能在同一个查询中使用 DROP 和 CREATE;应该从单独的查询中调用它们。

干杯!

【讨论】:

    【解决方案2】:

    尝试使用此代码。希望您的问题能得到解决。

    public final List<CoverageEntity> getCMDataTable(final String countryCode, final CoverageBean coverageBean) {
    
                getHibernateTemplate().execute(new HibernateCallback() {
                    public (List) doInHibernate(final Session session)throws HibernateException, SQLException {
    //                  Query query = getQuery(countryCode, coverageBean , session);
                        Query query = session.createSQLQuery("call ASPECT.SC_CVRG_SEARCH('99991',null,null,null,null,null,null)").addEntity(CoverageEntity.class);
                        System.out.println(ToStringBuilder.reflectionToString(query.list(),ToStringStyle.MULTI_LINE_STYLE));
    
                        return query.query.list();
    
            }
                })
               ;
                return new  ArrayList<CoverageEntity>();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2023-02-17
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多