【问题标题】:call simple database procedure using Slick 3.0使用 Slick 3.0 调用简单的数据库过程
【发布时间】:2016-04-13 04:51:53
【问题描述】:

我在mySQL中写了一个简单的数据库过程如下:

DROP PROCEDURE IF EXISTS sp_doSomething;  
DELIMITER //
CREATE PROCEDURE sp_doSomething    
(IN pVal1 varchar(100),
 IN pVal2 int(15)
)
BEGIN
  DECLARE vCnt int(5)  DEFAULT 0;   
  DECLARE vID int(15)  DEFAULT 0;
  DECLARE vTempID int(15)  DEFAULT 0;

  -- get ID
  SELECT id INTO vID FROM T1
  WHERE name = pVal1;

  -- get count
  SELECT count(*) INTO vCnt FROM T1
  WHERE owner = vID;

  -- get the log
  INSERT INTO log select CONCAT('-v1-:', pVal1, ':-v2-:', pVal2);

  -- Create basic stuff if it doesn't exist
  IF vFolderCnt = 0 THEN 
    INSERT INTO T1 (`id`, `col1`, `col2`, `col3`)  
    SELECT null, vID, 'some value', CONCAT(vID,'^1') FROM T1
    WHERE owner = 0;
  END IF;

  commit;

END //
DELIMITER ;

现在,我想在使用 Slick 3.0 的 Play Framework 2.4 应用程序中调用此过程。这是一件如此简单的事情,但我真的很挣扎,因为没有适当的文档可用。这很令人沮丧。

正如在 Google Group 中提到的 https://groups.google.com/forum/#!searchin/scalaquery/procedure/scalaquery/BUB2-ryR0bY/EFZGX663tRYJ

我尝试以不同的方式调用该过程。代码编译,但过程根本没有被调用。

这个语句给出了一个动作错误。

db.run(sql"{call sp_doSomething('${st.val1}', 1)}")

以下语句编译正常,但不调用过程。

db.run(sql"{call sp_doSomething('${st.val1}', 1)}".as[Int])

以下语句编译正常,但不调用过程。

db.run(sqlu"{call sp_doSomething('${st.val1}', 1)}")

或者 db.run(sqlu"{?=call sp_doSomething('${st.val1}', 1)}")

我已向我的数据库用户授予该过程的执行权限并对其进行了验证。

另外,我不确定在程序中是否需要 COMMIT?

任何帮助,将不胜感激。

【问题讨论】:

  • COMMIT 仅在 START TRANSACTION 块的末尾需要,而您没有。

标签: mysql scala stored-procedures playframework slick-3.0


【解决方案1】:

我已经设法使用旧的 prepareCall 方法调用存储过程。这就是我的做法。希望,它可能对某人有所帮助。

db.withSession {
    implicit session => {
        val cs = session.conn.prepareCall("{call sp_doSomething(?, ?)}")
        cs.setString(1, st.val1)
        cs.setLong(2, 1L)
        val result = cs.executeUpdate()
    }
}

但我仍然对使用 sql"" 或 sqlu"" 调用过程感兴趣。

【讨论】:

    【解决方案2】:

    对我来说,Slick 3.2 中的以下作品:

    delimiter //
    create procedure Try1()
    begin
        select userid from TBL_USER where id = "4";
    end //
    delimiter ;
    

    然后

      def runProcByRawSql() : Future[Vector[String]] = {
        def runproc = sql"""call Try1()""".as[String]
    
        db.run(runproc)
      }
    

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2012-05-21
      • 2018-11-28
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多