我在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?
任何帮助,将不胜感激。
答案 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)
}