會連接發送到存儲過程的數據工作嗎?我無法想象一次向數據庫發送超過1000條細節行。
do_movement('ACME','2:TNT,100||Anvil,5');
前面的2表示希望的細節數量,可能有助於捕獲錯誤。只是一個想法。
這種方式代碼將負責格式化,但我可以輸出SQLEXCEPTIONS並讓一切都發生在一個真實的事務中。
從此後拉伸嚴重:MySQL Split Comma Separated String Into Temp Table
使用來自SPLIT_STR功能(在以前的帖子中引用):http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
然後我的功能解析N:s1|s2|..|sN
和檢查。
我可以輕鬆地再次呼叫SPLIT_STR如果我有這樣的事情N:s1,a1|s2,a2|..|sN,aN
BEGIN
DECLARE defined_quantity INT;
IF serial_numbers REGEXP '^[^0]{0,}[[:digit:]]+:.*$' = TRUE THEN -- check that we are indeed at least starting properly formatted.
SET defined_quantity = CONVERT(LEFT(serial_numbers,LOCATE(':',serial_numbers)-1), UNSIGNED);
IF defined_quantity <= 0 THEN
SIGNAL SQLSTATE '45006'
SET MESSAGE_TEXT = 'The quantity defined with the serial number list is <= 0.';
END IF;
SET serial_numbers = RIGHT(serial_numbers,LENGTH(serial_numbers) - LOCATE(':',@serial_numbers));
BEGIN
DECLARE a INT Default 0 ;
DECLARE str VARCHAR(255);
DECLARE q INT;
simple_loop: LOOP
SET a=a+1;
SET str=TRIM(SPLIT_STR(serial_numbers,"|",a));
IF str='' THEN
SET a=a-1; -- we ignore the last increment
LEAVE simple_loop;
END IF;
#Do Inserts into temp table here with str going into the row
INSERT INTO transaction_detail (transaction_id, serial_number,created_at,updated_at) VALUES(transaction_id, str,NOW(),NOW());
END LOOP simple_loop;
SELECT a, defined_quantity, quantity;
IF a <> defined_quantity OR a <> quantity OR defined_quantity <> quantity THEN
SIGNAL SQLSTATE '45007'
SET MESSAGE_TEXT = 'The quantities do not match for the serial numbers provided.';
END IF;
END;
ELSE
SIGNAL SQLSTATE '45005'
SET MESSAGE_TEXT = 'The serial number formatted list is not properly formatted. Please provide in "n:s1|s2|s3|...|sn" format.';
END IF;
END;
爲什麼不開始/通過PHP提交事務,如果您已經有工作的代碼? – Bulat 2014-09-25 00:09:45
我想確保來自不同應用程序的調用執行某些檢查以保持數據完整性。如果提供給存儲過程的數據不符合客戶標誌/要求,我可以輕鬆地拋出錯誤並回滾事務。有些東西會依賴於誰在PHP/Java /等中實現它。 – 2014-09-25 18:31:34
好吧,如果你想在可重用代碼的基礎上構建,我通常使用服務層而不是在數據庫中構建你的應用程序。然後你可以通過JSON或XML傳遞它沒問題。 – Bulat 2014-09-25 21:09:55