Announcement

Collapse
No announcement yet.

Variable

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

  • Variable

    hallo zusammen,

    ich habe eine procedure in dem eine variable nicht funktioniert.
    kann bitte jemand helfen? es ist bestimmt eine syntax fehler, ich finde es aber leider nicht.

    Code:
    procedure bg (in_md in number) AS
    
    -- Tabelle ZWERG3 erstelen ****************************
    
    bgstr:= 'CREATE TABLE ZWERG3 AS
    SELECT DISTINCT Z.MDT,
    Z.ABRGR,
    Z.PNR,
    Z.NACHNAME,
    Z.VORNAME,
    Z.GESAMTBRUTTO,
    Z.RESTURLAUB,
    Z.ANTEIL_VWL,
    Z.LA_NR, Z."SONSTIGE_ABZÜGE",
    Z.BRUTTO_VWL_SONSTABZ,
    Z.INSOLVENZGELD,
    Z.AUSGLEICHSLAST, Z."SV_AG_Anteil",
    Z.BRUTTO_VWL_SONSTABZ * &var *
    0.26/100 + INSOLVENZGELD +
    AUSGLEICHSLAST BG
    FROM ZWERG2 Z
    WHERE MDT = &in_md'
    
    execute immediate bgstr;
    commit;
    end;
    die variable in_md in WHERE klausel wird nicht übergeben.

    mfg. f_mal!

  • #2
    Was du hier nagedacht hast ist mit einer Bind Variable zu lösen und nicht einfach mit einem Variablentext im sql.

    Siehe:

    http://download-uk.oracle.com/docs/c...htm#sthref1557

    Ich nehme einfach das Beispiel von Oracle:

    sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '
    || v_column || ' = :2';
    EXECUTE IMMEDIATE sql_stmt USING amount, column_value;

    eh klar: es gibt 2 Variable die mit einem doppelpunkt und einen Namen enden. Beim Using mußt Du einfach die Werte in der Reihenfolge der Variablen zuordnen.

    lg Dietmar

    ps: versuchs doch generell zuerst mit der Doku! Die von Oracle ist meiner Meinung echt gut und es gibt auch viele Beispiele!

    Comment


    • #3
      guten morgen,

      irgendwie komme ich damit nicht zu recht.
      konntest du mir bitte erklären wie ich mein Code abändern muss dass es funktioniert?


      danke

      mfg.f_mal

      Comment


      • #4
        Hallo,

        Dietmar hat dir ja schon die Antwort auf deine Frage gegeben. Was mich interessieren würde, wäre, was du eigentlich mit dieser Procedure erreichen willst ? Das ganze sieht etwas seltsam aus ...


        Gruss

        Comment


        • #5
          hallo,


          das soll eine temporäre Tabelle sein wo ich meine Zwischenergebnisse speichern will.

          ich werde aber anders erledigen und zwar:

          erst mal eine Tabelle erstellen und dann mit insert into die Daten rein schreiben.

          Ich habe festgestellt dass in DDL keine Bindevariable erlaubt sind.

          danke für eure Antworten.

          mfg. f_mal

          Comment


          • #6
            das soll eine temporäre Tabelle sein wo ich meine Zwischenergebnisse speichern will.
            -- Das ist eine ausgesprochen schlechte Idee. Denk mal nach, was passiert, wenn sich eine 2. Benutzer einloggt und diese Funktion verwendet

            erst mal eine Tabelle erstellen und dann mit insert into die Daten rein schreiben.
            - Es gibt in ORACLE Global Temporary Tables, diese wären besser geeignet dafür

            Gruss,

            Comment


            • #7
              Hallo f_mal,

              das mit der temp. tabelle habe ich Dir auch schon in deinem vorigen Thread vorgeschlagen! Das ist wirklich die Lösung.

              create global temporary table test (text varchar2 not null) on commit delete rows;

              also: eine temp. Tabelle welche automatisch beim commit den eingefügten Inhalt löscht.

              http://download-uk.oracle.com/docs/c...htm#sthref2213

              Das mit dem exec immed kann inetwa so aussehen:

              procedure bg (in_md in number) AS

              bgstr:= 'CREATE TABLE ZWERG3 AS
              SELECT DISTINCT Z.MDT,
              Z.ABRGR,
              Z.PNR,
              Z.NACHNAME,
              Z.VORNAME,
              Z.GESAMTBRUTTO,
              Z.RESTURLAUB,
              Z.ANTEIL_VWL,
              Z.LA_NR, Z."SONSTIGE_ABZÜGE",
              Z.BRUTTO_VWL_SONSTABZ,
              Z.INSOLVENZGELD,
              Z.AUSGLEICHSLAST, Z."SV_AG_Anteil",
              Z.BRUTTO_VWL_SONSTABZ * :1 *
              0.26/100 + INSOLVENZGELD +
              AUSGLEICHSLAST BG
              FROM ZWERG2 Z
              WHERE MDT = :2'

              execute immediate bgstr using var, in_md
              commit;
              end;

              habs natürlich nicht getestet!!!

              Wenn es nicht geht, dann lies bitte die Doku (link schon gepostet) und wenn immer noch nicht klar, dann Fehlernummer, was Du gemacht hast,....

              lg Dietmar

              Comment


              • #8
                Guten morgen Dietmar Müller,

                danke für deine Vorschläge. Die Temp Tabelle wäre vielleicht nicht schlecht, aber ich will meine Daten nicht sofort löschen.

                Das mit execuete immediate geht natürlich so wie Du es gemacht hast, aber ich habe keine Konstante sondern eine Variable. Es geht hier um eine Mandanten Nr. die sich ändern kann.


                Code:
                Das mit dem exec immed kann in etwa so aussehen:
                procedure bg (in_md in number) AS bgstr:= 'CREATE TABLE ZWERG3 AS SELECT DISTINCT Z.MDT, Z.ABRGR, Z.PNR, Z.NACHNAME, Z.VORNAME, Z.GESAMTBRUTTO, Z.RESTURLAUB, Z.ANTEIL_VWL, Z.LA_NR, Z."SONSTIGE_ABZÜGE", Z.BRUTTO_VWL_SONSTABZ, Z.INSOLVENZGELD, Z.AUSGLEICHSLAST, Z."SV_AG_Anteil", Z.BRUTTO_VWL_SONSTABZ * :1 * 0.26/100 + INSOLVENZGELD + AUSGLEICHSLAST BG FROM ZWERG2 Z WHERE MDT = :2' execute immediate bgstr using var, in_md commit; end;
                also hier WHERE MDT = :2' soll staat 2 meine Variable stehen (in_md)
                und wird in mehrere Abfragen verwendet die in denselben Procedure sind.

                z.B.

                Code:
                --  Abfragen ob p_abr_gr = 2 -- *******************************
                    begin
                        select P_ABR_GR into P_ABR_GR
                        from lpstxxl
                        where P_ABR_GR = 2
                        and MANDANT = in_md
                        group by P_ABR_GR;
                        exception when others then null;
                    end;
                
                --  Abfragen ob p_abr_gr = 1 -- **********************************
                    begin
                        select P_ABR_GR into P_ABR_GR
                        from lpstxxl
                        where P_ABR_GR = 1
                        and MANDANT = in_md
                        group by P_ABR_GR;
                        exception when others then null;
                    end;
                P_ABR_GR sind Variable die ich weiter oben declariert gabe.

                Oracle sagt dass in DLL keine Bindewariable zulässt.

                also ich denke dass meine Lösung wäre vielleicht
                erstmal eine Tabelle mit create table zu erstellen und dann mit INSERT INTO SELECT meine Daten rein zu schreiben. Ich weiß es noch nicht genau.

                Hast du eine bessere Idee. Vielen Dank


                mfg. f_mal

                Comment


                • #9
                  Die Limitierung mit bind und ddl war mir nicht bekannt :-(

                  Generell ok, aber leg dir die Tabelle nur einmal an! und lösch dann nur die Daten und nicht die komplette Tabelle!

                  und das Insert sollte so aussehen:

                  insert into zieltabelle select col1, col2 from quelltabelle where col1 = var1 and col2 = var2;

                  Und somit brauchst Du keine exec imm mehr und das mit den Variablen ist auch kein Problem mehr.

                  lg Dietmar

                  Comment


                  • #10
                    hallo,

                    genau so habe gemacht und es funktioniert super.
                    ich danke euch für eure hilfe.

                    mfg. f_mal

                    Comment

                    Working...
                    X