更新时间:2023-02-22 18:21:25
我不得不自己写这个过程,这里是帮助我理解 MySQL 中的存储过程的链接:http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/.以及我想出的程序
I had to write this procedure on my own, here is the link that helped me understand the Stored Procedures in MySQL: http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/. And the procedure that I came up wit
DROP PROCEDURE IF EXISTS `Acc_Ledger`;
DELIMITER //
CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
DECLARE RunningTotal, deb, cred DECIMAL(19,2);
DECLARE counter, row_count int;
SET RunningTotal = 0;
SET counter = 1;
DROP TABLE IF EXISTS LedgerTbl;
CREATE TEMPORARY TABLE LedgerTbl (CTR int primary key auto_increment, PARTY_ID INT,VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL(19,2),CREDIT DECIMAL(19,2),RTotal DECIMAL(19,2));
INSERT INTO LedgerTbl
SELECT 0, PARTY_ID,VRDATE,DCNO,ETYPE,DESCRIPTION,DEBIT,CREDIT, null FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2010/10/02' AND '2013/12/02'
ORDER BY VRDATE,ETYPE,DCNO;
SELECT COUNT(*) INTO row_count FROM LedgerTbl;
WHILE counter <= row_count DO
SELECT debit INTO deb FROM LedgerTbl WHERE ctr = counter;
SELECT credit INTO cred FROM LedgerTbl WHERE ctr = counter;
SET RunningTotal = RunningTotal + (deb-cred);
UPDATE LedgerTbl
SET LedgerTbl.RTotal = RunningTotal
WHERE ctr = counter;
SET counter = counter + 1;
END WHILE;
SELECT * FROM LedgerTbl;
END//
DELIMITER ;
现在我找到了相对有效的解决方案:
Now I found the comparatively efficient solution:
DROP PROCEDURE IF EXISTS `Acc_Ledger`;
DELIMITER //
CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
DECLARE RunningTotal, deb, cred DECIMAL(19,2);
DECLARE counter, row_count int;
SET RunningTotal = 0;
SET counter = 1;
DROP TABLE IF EXISTS LedgerTbl;
CREATE TEMPORARY TABLE LedgerTbl (CTR int primary key auto_increment, PARTY_ID INT,VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL(19,2),CREDIT DECIMAL(19,2),RTotal DECIMAL(19,2));
INSERT INTO LedgerTbl
SELECT 0, PARTY_ID,VRDATE,DCNO,ETYPE,DESCRIPTION,DEBIT,CREDIT, null FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2010/10/02' AND '2013/12/02'
ORDER BY VRDATE,ETYPE,DCNO;
SELECT COUNT(*) INTO row_count FROM LedgerTbl;
SET @RunningTotal := 0;
UPDATE LedgerTbl
SET RTotal = (@RunningTotal := @RunningTotal + (DEBIT - CREDIT));
SELECT * FROM LedgerTbl;
END//
DELIMITER ;