2016-04-13 24 views
1

我已经写在MySQL中的简单的数据库程序如下:调用简单的数据库程序用油滑3.0

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 ; 

现在,我想调用这个过程中我的发挥框架2.4的应用程序,它使用3.0油滑。这是一件很简单的事情,但我真的很困难,因为没有适当的文件可用。这非常令人沮丧。

,因为它是在谷歌集团提到这里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 “{?=调用sp_doSomething( '$ {} st.val1',1)}”)

我已授予程序执行权限我数据库用户并验证它。

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

任何帮助,将不胜感激。

+0

'COMMIT'只需要在'START TRANSACTION'块的结束,这你不必。 – thund

回答

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“”调用过程感兴趣。

0

对于我在油滑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) 
    }