使用Slick 3.0调用简单的数据库过程

时间:2016-04-13 04:51:54

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

我在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?

任何帮助,将不胜感激。

2 个答案:

答案 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""。

答案 1 :(得分:0)

对我而言,下面的工作在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)
  }