简体   繁体   中英

Convert MS-SQL Server stored procedure to MySQL Query

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 ;

UPDATE

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM