stored procedure, select innerhalb bringt kein Ergebnis

Sry ich habe jetzt erstmal nicht alles gelesen und bin auch kein Experte für MariaDB aber ein paar Sachen triggern mich:
SELECT `cont` INTO content FROM `it` WHERE `id` = item; # contents of parts packaging
Hier bin ich nicht sicher, ist das der selbe Datentyp, also INT bei Spalte cont?
SELECT (CASE WHEN `itgroup` = 1000 then
`pack`
ELSE
`unit` END) into piece FROM `it` WHERE `id` = item; # look for storage unit
Hier bin ich mir ziemlich sicher das es am fehlenden Spaltennamen liegt. Wenn du das so ausführst sollte außerhalb der Prozedur eine Spalte ohne Namen im Ergebnis stehen, SQL braucht aber einen Alias um damit "weiter arbeiten" zu können. Versuch mal END) AS spalte INTO...

Abgesehen davon: id ist wirklich immer UNIQUE?
-- If the input is not like storage unit
IF unit != piece
THEN
set piecequant = quantity * content;
else
set piecequant = quantity;

END IF;
Das sollte so gehen, ich habe mir aber angewöhnt das immer sauber zu kapseln, vor allem weil ich häufig mehrere Anweisung im selben Block habe. (MSSQL):
IF
BEGIN
Anweisung1;
Anweisung2;
END
ELSE
BEGIN
Anweisung3;
Anweisung4;
END;

Hinter Anweisung1 und ; kann das IF sonst schon zu Ende sein :)
-- if input magazin is empty

IF magazin = 0 THEN
#HIER LIEFERT DAS SELECT KEIN ERGEBNIS, AUSSERHALB JA
SELECT `magazin` INTO store FROM `stock` WHERE `it` = item;
ELSE
set store = magazin;
END IF;
Noch keine Idee, check mal erst das mit dem Spaltennamen. Vielleicht Datentypen?

 
Werbung:
Liebe Leute vielen Dank,

ich habe dank eurer Anregungen die Lösung gefunden, Ich denke auch, ich kenne den Fehler. Ich denke die Routine möchte das solche ABfragen gleich als erstes erledigt werden ähnlich Declare.
Also habe ich alle fraglichen Werte in ein Select gepackt.
Hier mal meine Lösung die jetzt auch in allen gewünschten Varianten das benötigte Ergebnis liefert.
hier meine Lösung:
SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `updateStorage`(IN `item` INT(10) UNSIGNED, IN `reason` INT(5) UNSIGNED, IN `quantity` DECIMAL(10,2) UNSIGNED, IN `unit` INT(10) UNSIGNED, IN `magazin` INT(5) UNSIGNED, IN `users` INT(10) UNSIGNED)
BEGIN
    /*declare used values */
    DECLARE piece INT(10) DEFAULT NULL;
    DECLARE itgroup INT(10) DEFAULT NULL;
    DECLARE content INT(10) DEFAULT NULL;
    DECLARE order_id INT(10) DEFAULT NULL;
    DECLARE piecequant NUMERIC(10,2) DEFAULT NULL;
    DECLARE store INT(5) DEFAULT NULL;
    
    -- change unit between package and content, deepends input   
    SELECT it.`cont`,
             IF(it.`itgroup` = 1000,it. `pack`, it.`unit`),
             quantity * if(content>1 , content,1),
             IF(magazin = 0,stock.magazin,magazin)
    INTO content, piece, piecequant, store
    FROM `it`
    LEFT JOIN stock ON stock.it = it.id
    WHERE it.`id` = item;

         -- when input is goods receipt   --
         IF reason = 2  THEN
        
                -- CHECK IF ORDER EXISTS
                select  `po` into order_id FROM `pohis` where `it` = item AND `stat` = 1 ORDER BY `id` DESC LIMIT 1;               
                
                    Update `stock` SET
                    `stand` = `stand` + `piecequant`,
                    `pUp` = users
                    WHERE `it` = item;
                    
                -- loge the process in the order history table
                IF order_id != NULL OR order_id !='' THEN
                    
                    UPDATE `pohis`
                    LEFT JOIN `stock` ON `stock`.`it` = `pohis`.`it`
                    SET
                        `pohis`.`pack` = unit ,
                        `pohis`.`deliv` = curdate(),
                        `pohis`.`quantdel` = quantity,
                        `pohis`.`po` = order_id,
                        `pohis`.`pUp` = users,
                        `stock`.`stat` = 0,
                        `pohis`.`stat` = 0
                        WHERE `pohis`.`po` = order_id AND `pohis`.`it` = item;
                ELSE
                    INSERT INTO `pohis` (`it`, `pack`, `deliv`, `quantdel`, `po`, `pIn`) VALUES (item, unit, curdate(), quantity, order_id, users);
                END IF;
              
                
            -- correction for inventory entries
            ELSEIF reason = 3 THEN
            
                UPDATE `stock` set `stand` = piecequant
                WHERE `it` = item;
                
            -- enter new  existing material --   
            ELSEIF reason = 8 THEN
            
                INSERT INTO `stock`( `it`, `magazin`, `stand`, `pIn`) VALUES (item , magazin, piecequant, users);
                
            ELSEIF reason = 4 OR reason = 5 OR reason = 6 OR reason = 9    THEN 
            
                UPDATE `stock`
                    SET `stand` = `stand` - piecequant,
                    `pUp`= users
                WHERE `it`= item;   
                
            
        ELSEIF reason = 10 THEN
            INSERT INTO `po`( `pIn` ) VALUES (users);
            INSERT INTO `pohis` (`it`, `pack`, `quant`, `po`,`stat`, `pIn`) VALUES (item, piece, quantity, last_insert_id(),1, users);   
            UPDATE `stock` SET `stat` = 1 WHERE `it`= item;
                
            
         END IF;# end if reason is income
        
         -- log in statistics
         INSERT INTO `stati`( `reason`, `q`, `it`, `magazin`, `cos`, `po`) VALUES ( reason,piecequant,item, store, users, order_id);
    
END

nochmal vielen Dank an euch!
 
Zurück
Oben