2013-12-12 4 views
0

я написал этот MySQL хранимой процедуру (Полную процедуру в конце вопроса), и это дает мне ошибку в следующих утверждениях:MySQL: не удается получить доступ к временной таблице

UPDATE TrialBalTbl 
    SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM TrialBalTbl), 
     totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM TrialBalTbl); 

была ошибкой:

не удается открыть заново таблицу

(TrialBalTbl это временная таблица) Я искал над ним и нашел that

Вы не можете обратиться к ВРЕМЕННОЙ таблице более чем один раз в одном запросе

Так я думал использовать псевдоним tbal для временной таблицы TrialBalTbl для достижения эффекта и пришел с этим:

UPDATE TrialBalTbl as tbal 
SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM tbal), 
     totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM tbal); 

Теперь, к сожалению, это тоже не сработает. Это говорит

Таблица «digitalmanager.tbal» не существует

Может кто-нибудь пожалуйста, скажите мне, что случилось с ним? И как я могу заставить это работать? Вот моя полная хранимая процедура, которая работает до этого UPDATE заявления:

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `Trial_Balance`(IN startDate Varchar(200), IN endDate Varchar(200)) 
BEGIN 

DROP TABLE IF EXISTS digitalmanager.TrialBalTbl; 

CREATE TEMPORARY TABLE TrialBalTbl (
    CTR INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    PARTY_ID VARCHAR(100), 
    ACCOUNT_ID VARCHAR(100), 
    PARTY_NAME VARCHAR(500), 
    DEBIT DECIMAL(19,2), 
    CREDIT DECIMAL(19,2), 
    L1 VARCHAR(200), 
    L1NAME VARCHAR(1000), 
    L2 VARCHAR(200), 
    L2NAME VARCHAR(1000), 
    L3 VARCHAR(200), 
    L3NAME VARCHAR(1000), 
    L1DebSUM decimal(19,2), 
    L1CredSUM decimal(19,2), 
    L2DebSUM decimal(19,2), 
    L2CredSUM decimal(19,2), 
    L3DebSUM decimal(19,2), 
    L3CredSUM decimal(19,2), 
    totalCred decimal(19,2), 
    totalDeb decimal(19,2) 
); 

INSERT INTO TrialBalTbl 
SELECT 
    null, 
    P.PARTY_ID, 
    P.ACCOUNT_ID, 
    P.NAME, 
    SUM(L.DEBIT)-SUM(L.CREDIT), 
    0, 
    l1.L1, 
    l1.`name` AS 'L1NAME', 
    l2.L2, 
    l2.`name` AS 'L2NAME', 
    l3.L3, 
    l3.`name` AS 'L3NAME', 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
FROM 
    PLEDGER AS L INNER JOIN PARTY AS P ON L.party_id = p.party_id 
    INNER JOIN level3 AS l3 ON l3.l3 = p.level3 
    INNER JOIN level2 AS l2 ON l2.l2 = l3.l2 
    INNER JOIN level1 AS l1 ON l1.l1 = l2.l1 
WHERE 
    DATE(L.VRDATE) BETWEEN startDate AND endDate 
GROUP BY 
    l1.L1, l2.L2, l3.L3, P.PARTY_ID,P.NAME 
HAVING IFNULL(SUM(L.DEBIT),0)-IFNULL(SUM(L.CREDIT),0) >0 
order by 
    P.ACCOUNT_ID ASC; 

INSERT INTO TrialBalTbl 
SELECT 
    null, 
    P.PARTY_ID, 
    P.ACCOUNT_ID, 
    P.NAME, 
    0, 
    SUM(L.CREDIT)-SUM(L.DEBIT), 
    l1.L1, 
    L1.NAME AS 'L1NAME', 
    l2.L2, 
    L2.NAME AS 'L2NAME', 
    l3.L3, 
    L3.NAME AS 'L3NAME', 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
FROM 
    PLEDGER AS L INNER JOIN PARTY AS P ON L.party_id = p.party_id 
    INNER JOIN level3 AS l3 ON l3.l3 = p.level3 
    INNER JOIN level2 AS l2 ON l2.l2 = l3.l2 
    INNER JOIN level1 AS l1 ON l1.l1 = l2.l1 
WHERE 
    DATE(L.VRDATE) BETWEEN startDate AND endDate 
GROUP BY 
    l1.L1, l2.L2, l3.L3, P.PARTY_ID,P.NAME HAVING IFNULL(SUM(L.CREDIT),0)-IFNULL(SUM(L.DEBIT),0) > 0 
ORDER BY 
    P.ACCOUNT_ID ASC; 

-- Update the whole level's credit and debit sums 

UPDATE TrialBalTbl as tbal 
SET L1DebSUM = (
     SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1 
     HAVING 
      IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0 
); 

UPDATE TrialBalTbl as tbal 
SET L1CredSUM = (
     SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1 
     HAVING 
      IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0 
); 

UPDATE TrialBalTbl as tbal 
SET L2DebSUM = (
     SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1, level2.L2 
     HAVING 
      IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0 
); 

UPDATE TrialBalTbl as tbal 
SET L2CredSUM = (
     SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1, level2.L2 
     HAVING 
      IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0 
); 

UPDATE TrialBalTbl as tbal 
SET L3DebSUM = (
     SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND level3.l3 = tbal.l3 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1, level2.L2, level3.L3 
     HAVING 
      IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0 
); 

UPDATE TrialBalTbl as tbal 
SET L3CredSUM = (
     SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT) 
     FROM 
      PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID 
        INNER JOIN Level3 ON level3.l3 = Party.level3 
        INNER JOIN Level2 ON Level3.l2 = level2.l2 
        INNER JOIN Level1 on Level1.l1 = level2.l1 
     WHERE 
      level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND level3.l3 = tbal.l3 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate 
     GROUP BY 
      level1.L1, level2.L2, level3.L3 
     HAVING 
      IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0 
); 
    -- PROBLEM here. 
UPDATE TrialBalTbl 
SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM TrialBalTbl), 
    totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM TrialBalTbl); 

SELECT * FROM TrialBalTbl ORDER BY ACCOUNT_ID; 

END 
+0

@Malimovka да. Должен быть какой-то способ достичь этого. Я ** использовал ** тот же способ, чтобы обновить эту временную таблицу выше, и это сработало, но не работает над указанным утверждением. –

+0

Я думаю, что это может быть связано с группировкой (используя 'DISTINCT' в' SUM'). – AeroX

+1

Невозможно обойти это ограничение (помимо обновления до СУБД, которая не накладывает ограничений) - и даже если вы можете дважды использовать таблицу temp, вам не разрешено использовать таблицу, которую вы обновляете в подпункте -выберите, если я не ошибаюсь. –

ответ

1

Вы могли бы сделать это с помощью переменного.

Объявляются две переменные в начале вашей процедуры:

DECLARE @CredSUM decimal(19,2); 
DECLARE @DebSUM decimal(19,2); 

Затем установите их и обновить временную таблицу, используя их:

SET @CredSUM = (SELECT SUM(DISTINCT L1CredSUM) FROM TrialBalTbl); 
SET @DebSUM = (SELECT SUM(DISTINCT L1DebSUM) FROM TrialBalTbl); 

UPDATE TrialBalTbl SET 
    totalCred = @CredSUM, 
    totalDeb = @DebSUM 
; 
+0

Он работает, но вы не использовали правильный синтаксис для объявления переменной, я думаю ... Поскольку переменные в MySQL не имеют '@ 'в начале, пользовательские переменные имеют' @ 'в начале, но для присвоения им значения, вы должны использовать': = 'Не так ли? –

+0

Честно говоря, я не уверен на 100% правильного синтаксиса, поскольку я работал только в MS-SQL уже несколько лет. Я тестировал это на SQL Fiddle перед публикацией. Heres [Пример скрипта SQL] (http://www.sqlfiddle.com/#!2/b14c16/1/0). – AeroX

+1

Я только что просмотрел его, и это ': =' назначить как часть 'SELECT' и просто' = 'как часть' SET'. – AeroX

Смежные вопросы