I am stuck at this for the past hour and unable to convert this MSSQL Server stored procedure to "MySQL query":
DECLARE @LedgerTbl TABLE (PARTY_ID VARCHAR(100),VRDATE VARCHAR(200),
VRNOA VARCHAR(200),ETYPE VARCHAR(50),
DESCRIPTION VARCHAR(500),DEBIT DECIMAL,
CREDIT DECIMAL, RunningTotal decimal)
DECLARE @RunningTotal decimal
SET @RunningTotal = 0
INSERT INTO @LedgerTbl
SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,DESCRIPTION,DEBIT,CREDIT, null
FROM PLEDGER WHERE PARTY_ID=@partyId AND VRDATE BETWEEN @from AND @to
ORDER BY VRDATE,ETYPE,VRNOA
UPDATE @LedgerTbl
SET @RunningTotal = RunningTotal = @RunningTotal + (DEBIT-CREDIT)
FROM @LedgerTbl
SELECT * FROM @LedgerTbl
How may I convert this to a single MySQL query or a MySQL Stored procedure?
UPDATE
I tried to transform it to but it is giving me these error that I have given below:
DELIMETER //
CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
DECLARE RunningTotal DECIMAL;
SET RunningTotal = 0;
CREATE TEMPORARY TABLE LedgerTbl (PARTY_ID VARCHAR(100),VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL,RTotal decimal);
INSERT INTO LedgerTbl
SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,DESCRIPTION,DEBIT,CREDIT, null
FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2013/12/02' AND '2010/12/02'
ORDER BY VRDATE,ETYPE,VRNOA;
UPDATE LedgerTbl
SET RunninTotal = RTotal = RunningTotal + (DEBIT-CREDIT)
FROM LedgerTbl;
SELECT * FROM LedgerTbl;
END//
DELIMETER;
Here are the errors:
There seems to be an error in your SQL query. The MySQL server error output below, if there is any, may also help you in diagnosing the problem
ERROR: Unknown Punctuation String @ 10 STR: // SQL: DELIMETER//
CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;DELIMETER//CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;SQL query:
DELIMETER// CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal DECIMAL;MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMETER//
CREATE PROCEDURE
Acc_Ledger
() BEGIN DECLARE RunningTotal' at line 1
Can anyone please review it?
It seems that the MSSQL procedure calculates a running total,
I've tested this procedure (slighly modified) on sqlfiddle and it gives the following results:
http://www.sqlfiddle.com/#!6/0e909/1
The MSSQL procedure contains probably a typo here: SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,
it's not clear whether DCNO VRNOA
are two separate columns, or maybe one column DCNO_VRNOA
with "missing" underscore between them.
I assume that they are two separate columns.
To calculate a running total in MySql there is no need to use a temporary table.
This simple query does this task:
SELECT PARTY_ID,VRDATE,DCNO, VRNOA,ETYPE,DESCRIPTION,
DEBIT,
CREDIT,
@RunningTotal := @RunningTotal + (DEBIT-CREDIT) RunningTotal
FROM PLEDGER ,
( SELECT @RunningTotal:=0) init_variables
WHERE PARTY_ID=1
AND VRDATE BETWEEN '2013-11-11' AND '2013-11-11'
ORDER BY VRDATE,ETYPE,VRNOA;
See demo here: --> http://www.sqlfiddle.com/#!2/daa6e/1
The procedure might look like:
DELIMITER /
CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
SELECT PARTY_ID,VRDATE,DCNO, VRNOA,ETYPE,DESCRIPTION,
DEBIT,
CREDIT,
@RunningTotal := @RunningTotal + (DEBIT-CREDIT) RunningTotal
FROM PLEDGER ,
( SELECT @RunningTotal:=0) init_variables
WHERE PARTY_ID=1
AND VRDATE BETWEEN '2013-11-11' AND '2013-11-11'
ORDER BY VRDATE,ETYPE,VRNOA;
END /
DELIMITER ;
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 ;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.