1. 程式人生 > >mysql儲存過程以"陣列"形式入參實現表間複製 並實現回滾

mysql儲存過程以"陣列"形式入參實現表間複製 並實現回滾

這個程式碼是我需要實現,前端稽核某個稽核後,這個資料會在另一個頁面中呈現,涉及到兩個資料庫表。一下內容是用於測試的程式碼。

前端進行處理,將id封裝成陣列後提交到Java後臺,"陣列"使用 - 來分隔,是因為入參時,我使用了逗號,但是測試失敗了,就改用-或空格


在點提交後,實際提交的是id的陣列的形式提交,後臺獲取之後進行儲存過程的呼叫 入參,實際傳入的是字串,並非陣列。

DELIMITER // --由於該測試是在cmd進行的,需要進行該項修改,mysql才不會使用分號做預設結束標識

create procedure copytest(in strid text, out testresult varchar(5)) --之所以使用text而不用char,是以你為char需要設定長度,當我們從Java傳過來的id個數不確定時,就不是很理想了。
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;--當有一條insert執行失敗時,直接exit,也就是退出 不繼續執行,同時進行rollback
    set testresult = 0;
    START TRANSACTION;--新的事物開始
    insert into testcopy(id, name, sex) 
    select id,name,sex from testtable where id regexp replace(strid,' ','-');--對字串中的指定字元進行拆分後當成查詢條件,進行將testtable表的資料插入到testcopy表中
    COMMIT;
    set testresult = 1;
END;//

可直接複製的程式碼:

DELIMITER //
create procedure copytest(in strid text, out testresult varchar(5))
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
    SET testresult = '0';
    START TRANSACTION;
    INSERT INTO testcopy(id, name, sex) 
    SELECT id,name,sex FROM testtable WHERE id  REGEXP REPLACE(strid,' ','-');
    COMMIT;
    SET testresult = '1';
END;//

call copytest('1 2 3' ,@result);

select @result;//

 刪除該儲存過程:

DROP PROCEDURE IF EXISTS copytest;

Java程式碼:

jdbc:

public class JDBCUtil {
private static String  driverClass = "com.mysql.jdbc.Driver";//資料庫驅動類名
private static String   url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";   //連線資料為URL.統一資源定位符。
private static String   username = "root"; //連線資料庫的使用者名稱
private static String   password = "";//資料連線的密碼
static{
//1.註冊
try {
Class  c = Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 獲取連線物件
* @return
*/
public  static Connection  getConnection(){
Connection conn = null;
//2.如何獲取連線物件
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return conn;
}
}

呼叫儲存過程:

public void testProcedure(){

String  sql = "{call copytest(?,?)}";//呼叫函式 copytest來實現業務操作
Connection  conn = JDBCUtil.getConnection();
try {
CallableStatement  csmt = conn.prepareCall(sql);//建立呼叫過程的物件
csmt.setString(1, "1 2 3");
csmt.setString(2, 0);  //設定第2個引數輸入值為0.因為第2個引數為輸入輸出型別。
csmt.registerOutParameter(2, Types.INTEGER);//註冊輸出值型別為整型數。
csmt.execute();//執行呼叫儲存過程。

System.out.println("返回結果:"+csmt.getInt(2));//執行過程後,獲取指定的索引對應的返回值。

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}