Ergebniss Tabelle von einer Prozedur erstellen

Sind funktion und projekt Variablen innerhalb der Prozedur? Poste doch bitte mal den Code der Prozedur ich hab echt keine Lust mir die ganze Zeit Aussagen über Code aus den Fingern zu saugen den ich nicht kenne, das ist ja schlimmer als Lotto spielen.
 
Werbung:
hier der code von der prozedur
von dem formular wird nur die projektnummer übergeben

Code:
BEGIN
DECLARE ANZ_LOS,ANZ_HG,ANZ_G INT  DEFAULT 1;
  DECLARE L_COUNTER,HG_COUNTER,G_COUNTER INT DEFAULT 1;
  DECLARE ANZ_ANLAGEN, ANZ_HERSTELLER,ANZ_TYP INT DEFAULT 1;
  DECLARE  ANL_IDENT INT DEFAULT 0;
  DECLARE HG_WR_HERST,G_WR_T VARCHAR(255) DEFAULT NULL;
  -- Anzahl der Anlage-Lose ermitteln
  SELECT COUNT(a1.L_ANLAGE_IDENT) from  s3_lv_100kw a1 where a1.P_Projekt = projekt INTO ANZ_LOS;
    -- zurücksetzen
    update s3_lv_100kw set LOS = 0 where P_Projekt = projekt ;
    update s3_lv_100kw set HAUPTGEWERK = 0 where P_Projekt = projekt ;
    update s3_lv_100kw set GEWERK = 0 where P_Projekt = projekt ;
   
    -- Los
    WHILE L_COUNTER <= ANZ_LOS    DO
   
    SELECT a1.L_ANLAGE_IDENT from  s3_lv_100kw a1 where a1.P_Projekt = projekt AND  LOS = 0  ORDER BY L_ANLAGE_IDENT  LIMIT 1 INTO ANL_IDENT;
    update s3_lv_100kw set LOS = L_COUNTER where P_Projekt = projekt and LOS = 0 AND L_ANLAGE_IDENT = ANL_IDENT ;
       
        -- Hauptgewerk   

              SELECT DISTINCT COUNT(HG_WR_HERSTELLER) from  s3_lv_100kw where L_ANLAGE_IDENT = ANL_IDENT INTO ANZ_HERSTELLER;   
             
              SET HG_COUNTER = 1;
              WHILE HG_COUNTER <= ANZ_HERSTELLER    DO             
                SELECT HG_WR_HERSTELLER from  s3_lv_100kw where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = 0 ORDER BY LOS LIMIT 1 INTO HG_WR_HERST;
               
                update s3_lv_100kw set HAUPTGEWERK = HG_COUNTER where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = 0 AND HG_WR_HERSTELLER = HG_WR_HERST ;
                -- Gewerk
                    SELECT DISTINCT COUNT(G_WR_TYP) from  s3_lv_100kw where L_ANLAGE_IDENT = ANL_IDENT AND LOS = L_COUNTER INTO ANZ_TYP;   
             
                      SET G_COUNTER = 1;
                      WHILE G_COUNTER <= ANZ_TYP    DO             
                    SELECT G_WR_TYP from  s3_lv_100kw where P_Projekt = projekt AND LOS = L_COUNTER AND HAUPTGEWERK = HG_COUNTER AND GEWERK = 0 ORDER BY HAUPTGEWERK LIMIT 1 INTO G_WR_T;
               
                    update s3_lv_100kw set GEWERK = G_COUNTER, POSITION = G_COUNTER where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = HG_COUNTER AND  GEWERK = 0 AND  G_WR_TYP = G_WR_T ;
                        -- Position
                   
  -- in log tabelle shcreiben?
                  update s3_lv_num_log set projekt = P_Projekt, POSITION = Ergebniss;
                    INSERT INTO s3_lv_num_log (id, Fkt_Name, ausgeführt_am, Ergebniss)
                    VALUES (funktion, projekt);
                       
                        -- Positionen
                    SET G_COUNTER = G_COUNTER +1;
                        END WHILE; -- GEWERK
               
                -- Gewerke
                SET HG_COUNTER = HG_COUNTER +1;
                END WHILE; -- HAUPTGEWERK
          -- Hauptgewerke
      SET L_COUNTER = L_COUNTER +1;
        END WHILE;

      -- LOSE

-- HAuptgewerke nummerieren 
 
-- SELECT COUNT(a1.HG_WR_HERSTELLER) from  s3_lv_100kw a1 where a1.P_Projekt = projekt INTO ANZ_HG;
 
END
 
hier der code von der prozedur
von dem formular wird nur die projektnummer übergeben

Code:
BEGIN
DECLARE ANZ_LOS,ANZ_HG,ANZ_G INT  DEFAULT 1;
  DECLARE L_COUNTER,HG_COUNTER,G_COUNTER INT DEFAULT 1;
  DECLARE ANZ_ANLAGEN, ANZ_HERSTELLER,ANZ_TYP INT DEFAULT 1;
  DECLARE  ANL_IDENT INT DEFAULT 0;
  DECLARE HG_WR_HERST,G_WR_T VARCHAR(255) DEFAULT NULL;
  -- Anzahl der Anlage-Lose ermitteln
  SELECT COUNT(a1.L_ANLAGE_IDENT) from  s3_lv_100kw a1 where a1.P_Projekt = projekt INTO ANZ_LOS;
    -- zurücksetzen
    update s3_lv_100kw set LOS = 0 where P_Projekt = projekt ;
    update s3_lv_100kw set HAUPTGEWERK = 0 where P_Projekt = projekt ;
    update s3_lv_100kw set GEWERK = 0 where P_Projekt = projekt ;
  
    -- Los
    WHILE L_COUNTER <= ANZ_LOS    DO
  
    SELECT a1.L_ANLAGE_IDENT from  s3_lv_100kw a1 where a1.P_Projekt = projekt AND  LOS = 0  ORDER BY L_ANLAGE_IDENT  LIMIT 1 INTO ANL_IDENT;
    update s3_lv_100kw set LOS = L_COUNTER where P_Projekt = projekt and LOS = 0 AND L_ANLAGE_IDENT = ANL_IDENT ;
      
        -- Hauptgewerk  

              SELECT DISTINCT COUNT(HG_WR_HERSTELLER) from  s3_lv_100kw where L_ANLAGE_IDENT = ANL_IDENT INTO ANZ_HERSTELLER;  
            
              SET HG_COUNTER = 1;
              WHILE HG_COUNTER <= ANZ_HERSTELLER    DO            
                SELECT HG_WR_HERSTELLER from  s3_lv_100kw where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = 0 ORDER BY LOS LIMIT 1 INTO HG_WR_HERST;
              
                update s3_lv_100kw set HAUPTGEWERK = HG_COUNTER where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = 0 AND HG_WR_HERSTELLER = HG_WR_HERST ;
                -- Gewerk
                    SELECT DISTINCT COUNT(G_WR_TYP) from  s3_lv_100kw where L_ANLAGE_IDENT = ANL_IDENT AND LOS = L_COUNTER INTO ANZ_TYP;  
            
                      SET G_COUNTER = 1;
                      WHILE G_COUNTER <= ANZ_TYP    DO            
                    SELECT G_WR_TYP from  s3_lv_100kw where P_Projekt = projekt AND LOS = L_COUNTER AND HAUPTGEWERK = HG_COUNTER AND GEWERK = 0 ORDER BY HAUPTGEWERK LIMIT 1 INTO G_WR_T;
              
                    update s3_lv_100kw set GEWERK = G_COUNTER, POSITION = G_COUNTER where P_Projekt = projekt AND LOS = L_COUNTER AND  HAUPTGEWERK = HG_COUNTER AND  GEWERK = 0 AND  G_WR_TYP = G_WR_T ;
                        -- Position
                  
  -- in log tabelle shcreiben?
                  update s3_lv_num_log set projekt = P_Projekt, POSITION = Ergebniss;
                    INSERT INTO s3_lv_num_log (id, Fkt_Name, ausgeführt_am, Ergebniss)
                    VALUES (funktion, projekt);
                      
                        -- Positionen
                    SET G_COUNTER = G_COUNTER +1;
                        END WHILE; -- GEWERK
              
                -- Gewerke
                SET HG_COUNTER = HG_COUNTER +1;
                END WHILE; -- HAUPTGEWERK
          -- Hauptgewerke
      SET L_COUNTER = L_COUNTER +1;
        END WHILE;

      -- LOSE

-- HAuptgewerke nummerieren

-- SELECT COUNT(a1.HG_WR_HERSTELLER) from  s3_lv_100kw a1 where a1.P_Projekt = projekt INTO ANZ_HG;

END



Ich versuch nicht, den Sinn zu erraten, aber beim querlesen sehe ich:
  • in einer Schleife ein Update einer Tabelle ohne WHERE-Condition. Das erscheint mir recht sinn- und nutzfrei.
  • ein Insert, wo 4 Spalten aufgezählt werden, aber nur 2 Werte dann übergeben werden. Das dürfte recht sicher ein FAIL sein
  • generell: SQL in Schleifen...
 
Aber der Code der Prozedur wurde bisher noch nicht verändert, müsste also bisher lauffähig sein oder? Schlechter Code hin oder her aber verändern würd ich erstmal nur das nötigste :)

PS: Ich korrigiere mich, raffe den Code auch nicht:

- Die beiden Variablen für die Schleife L_COUNTER <= ANZ_LOS sind doch beide nur mit dem default Wert 1 gesetzt.
- Die meisten Selects finden einfach statt, erfolgt dann eine Bildschirmausgabe oder warum werden diese ausgeführt?
- SELECT DISTINCT COUNT(HG_WR_HERSTELLER) könnte auch falsch sein, eventuell eher SELECT count(DISTINCT HG...)?
- etc.
 
Zuletzt bearbeitet:
danke für eure hilfe.
das ist alles egal, das funktioniert schon so wie es soll.
es geht nur um den abschnitt

Code:
updates3_lv_num_logsetprojekt=P_Projekt,POSITION=Ergebniss; INSERTINTOs3_lv_num_log(id,Fkt_Name,ausgeführt_am,Ergebniss) VALUES(id,funktion,TIMESTAP,projekt);

er soll ja nur in s3_lv_num_log eine zeile anfügen mit der id, der funktion, dem datum mit uhrzeit und der projektnummer.

Leider bin ich mysql neuling. vielleicht erkläre ich es auch ganz falsch oder raff es einfach nicht. wenn ja, sorry dafür.
 
Also du musst einen INSERT machen wie folgt:
Code:
INSERT INTO s3_lv_num_log (spalte_id, spalte_funktion_name, spalte_ausgefuehrt_am, spalte_projekt)
VALUES (idfunktion,'wert_funktion_name',datumsfunktion, variable_projekt);
Der muss 3 bis 4 Werte in die Tabelle schreiben:
1) Die ID, die wird je nach Tabelle auch automatisch erzeugt. Du kannst sie aber nicht einfach bei VAULES weglassen sondern darfst sie dann auch nicht als Spalte spalte_id aufzählen. Wenn die Tabelle sie nicht automatisch einträgt musst du sie selbst über eine Funktion oder ähnliches erzeugen.
2) Der Name der Funktion kann als Wert in Hochkommas gesetzt werden, er ändert sich ja nicht.
3) Das aktuelle Datum kann unter mysql mit curdate() aufgerufen werden
4) Um welches Projekt es sich handelt dürfte eigentlich nur die Prozedur wissen wenn ich das richtig verstehe, das müsste dann schon irgendwo in einer Variablen stehen. Der INSERT muss auserdem an einer Stelle stehen wo alle genutzten Variablen richtig belegt sind. Ändert sich also die Projektvariable in der Schleife muss auch der INSERT mehrfach ausgeführt werden und innerhalb der Schleife stehen.
 
ok danke ich habs. bis auf die id ist alles drinne.
kann ich da irgendwo in mysql direkt einstellen das die sich hochzählt, quasi wie beim datum? oder mach ich am besten eine schleife in der prozedur?
 
Werbung:
Also bitte keine Schleife :) Du kannst mit SELECT max(id) FROM tabelle_log + 1 im Prinzip eine neue ID generieren. Du kannst auch UNIQUEIDENTIFIER nutzen da gibt es Funktionen zum erstellen für oder du suchst nach AUTO_INCREMENT, ich kenne aber die jeweilige MySQL Syntax nicht ausm Kopf.
 
Zurück
Oben