2016-04-13 22 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) 
    }