Announcement

Collapse
No announcement yet.

Procedure

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Procedure

    guten morgen an alle,

    ich bin neu hier und will erstmal alle begrüßen befor ich meine frage stelle.
    also...was ich machen will ist in eine procedure in dem ein SELECT Statement angelegt ist in eine andere procedure aufrufen.
    Bsp.:

    Code:
    PROCEDURE ürlaubrückstellung  AS  
    
    cursor firmen is
        SELECT  DISTINCT lpers1.MANDANT Mdt,
                                     lpstxxl.P_ABR_GR Abrgr 
        FROM lperst1 ,lpstxxl 
       WHERE  lperst1.lpers1_id = lpstxxl.lpers1_id;
    
    begin
             dbms_output.ENABLE(32000);
    
           for i in firmen loop
    
             dbms_output.PUT_LINE( .....);
          end loop;
    end;
    
    
    PROCEDURE  zwerg AS
    
       CREATE TABLE zwerg AS ürlaubrückstellung;
    
    end;
    also Proc "ürlaubrückstellung" muss in das Proc zwerg aufgerufen werden.
    ich bekomme keine fehlermeldung bei compilieren aber die tabelle wird nicht erstellt.

    kann bitte jemand weiter helfen? was mache ich falsch?

    danke f_mal!

  • #2
    Hallo f_mal,

    na, da ist schon ein wenig der Knopf drinnen.

    1. Man kann in plsql keine Tabelle direkt erzeugen. Hier ist ein execute immediate notwenifg!

    2. Ich glaube nicht, daß es geschickt ist immer eine Tabelle zu erzeugen, wenn man eine Prozedur aufruft. Überleg Dir hier besser etwas anderes! Zum Beispiel temporäre Tabellen oder einen Switch oder etwas was zu deiner Programmlogik paßt.

    3. Was meinst Du wird passieren, wenn Du die Proc zum 2. Aufruftst --> Fehler

    4. Wenn Du mit einer fixen Tabelle arbeitest, dann ist ein insert .. into zwerg as select * die Lösung.

    5. Generell: Schau dir den Code an: Du erwartest als Argument für das create Table also die Daten. dh Du mußt generell eine Funktion verwenden die ein Ergebnis zurückgibt. d.h. aber auch, daß du etwas vom Cursor zurückgeben mußt.

    Ich glaube Du solltest Dir die Sache nochmals überlegen und ein wenig die Basics von PLSQL anschauen!

    lg Dietmar

    Comment


    • #3
      guten morgen,

      vielen dank für deine antwort.

      ich habe auch eine andere lösung ausprobiert aber leider funktioniert nicht.
      kann mir bitte jemand sagen was ist falsch daran?

      vieleicht mal den code ausführen in pl/sql.

      Code:
      Procedure zwerg  AS
      str long;
      begin
      str:= 'CREATE TABLE zwerg AS SELECT  DISTINCT lpers1.MANDANT Mdt,
              lpstxxl.P_ABR_GR Abrgr ,
              lpers1.P_NUMMER PNr,
              lpers1.P_NAME Nachname,
              lpers1.P_VORNAME Vorname ,
              lstkonto.ST_GESBRUTTO * (select count(a.P_NUMMER) PNr_Total
                                       from lbruttos a ,lstkonto b
                                       where a.P_NUMMER = b.P_NUMMER
                                       and a.VAR_ERF_DAT Between 01-01-2000 and 31-12-2000) Gesamtbrutto ,
              urestges.REST  Resturlaub,
              CASE
                      WHEN lbruttos.LA_NR = 55 THEN 0
                      ELSE lbruttos.VAR_BETRAG * 12
              END Anteil_VWL,
              lbruttos.la_nr,
              CASE
                      WHEN lbruttos.LA_NR = 99
                           or lbruttos.LA_NR = 100
                           or lbruttos.LA_NR = 91 THEN 0
                      ELSE lbruttos.VAR_BETRAG * 12
              END Sonstige_Abzüge,
               lstkonto.ST_GESBRUTTO * (select count(a.P_NUMMER) PNr_Total
                                       from lbruttos a ,lstkonto b
                                       where a.P_NUMMER = b.P_NUMMER
                                       and a.VAR_ERF_DAT Between 01-01-2000 and 31-12-2000)  -
      
              CASE
                      WHEN lbruttos.LA_NR = 55 THEN 0
                      ELSE lbruttos.VAR_BETRAG * 12
              END  -
              CASE
                      WHEN lbruttos.LA_NR = 99
                           or lbruttos.LA_NR = 100
                           or lbruttos.LA_NR = 91 THEN 0
                      ELSE lbruttos.VAR_BETRAG * 12
              END Brutto_VWL_sonstAbz
      
              FROM lpers1,
                   lpstxxl,
                   lstkonto,
                   urestges,
                   lbruttos
              WHERE lpers1.P_NUMMER = lpstxxl.P_NUMMER --AND lpers1.MANDANT = lpstxxl.MANDANT
              AND
                    lstkonto.P_NUMMER = lpers1.P_NUMMER 
              AND
                    lpers1.P_NUMMER = urestges.P_NUMMER 
              AND
                    lpers1.P_NUMMER = lbruttos.P_NUMMER 
              ORDER BY Anteil_VWL ASC';
      execute immediate str;
      commit;
      end;

      Comment


      • #4
        Originally posted by f_mal View Post
        ...vieleicht mal den code ausführen in pl/sql.
        ...
        Wer soll sich den die notwendigen Tabellen anlegen und mit Daten füllen, um dein Statement auzuprobieren?

        Viel einfacher wäre es, du würdest dazu schreiben WAS den nicht funktioniert und WELCHE (ORACLE)Fehlermeldung du ggfs. bekommst. Läßt sich die Procedure nicht compilieren oder enthält die Tabelle nicht die gewünschten Daten? Sollen wir das raten?

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          hallo,

          es war ein syntax fehler bei datum. jetzt funktioniert.

          vielen dank

          mfg. f_mal

          Comment


          • #6
            hallo an alle,

            kann mir bitte jemand sagen wie ich abfragen kann ob eine Tabelle schon existiert oder nicht?

            wenn ja, dann drop table ...
            und create table ...

            sonst ein create table asführen


            ich bin für jeden Vorschlag dankbar


            mfg. f_mal

            Comment


            • #7
              select * from user_tables where table_name = 'TABELLENNAME'

              Comment


              • #8
                guten morgen,

                vielen dank ... hat mir weiter geholfen.

                eine frage hätte ich noch:

                wie kann ich eine variable in einen select statement einbinden?

                z.B.

                Code:
                variablename number;
                test number;
                
                SELECT feld1 * variablename into test
                FROM meinetabelle
                WHERE feld1 = 0.7;
                würde so was funktionieren?

                Bitte um hilfe...

                mfg. f_mal

                Comment


                • #9
                  Hallo f_mal,

                  in PL/SQL würde dein Bsp. funktionieren. Allerdings würdest du dort immer NULL herausbekommen, da variablename unbelegt ist. Bei einem SELECT ... INTO Konstrukt mußt du außerdem sicherstellen, das immer ein und genau ein Datensatz zurückgeliefert wird, sonst gibts NO_DATA_FOUND bzw. TOO_MANY_ROWS als Exception!

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    hallo Falk Prüfer,

                    vielen dank für deine hilfe.

                    es funktioniert super...danke.

                    mfg. f_mal

                    Comment

                    Working...
                    X