Announcement

Collapse
No announcement yet.

Counter - Gelöschte Anzahl an Reihen im Log

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

  • Counter - Gelöschte Anzahl an Reihen im Log

    Guten Tag,

    wie könnte ich meine Anzahl an gelöschten reihen in einer Log Tabelle wiedergeben?

    Input:
    -3 Prozeduren (Log; Statement; Aufruf )

    in der Statement Prozedur ist mein Delete Statement...
    create procedure
    AS
    begin
    delete from (schema) (table)
    where id = (select id from xxx...);
    commit;

    IF DEBUG
    dbms.outputline(sqlstatement);
    END IF;

    execute immediate sqlstatement;

    exception
    when others
    then

    Delete_Log(" || (counter) ||gelöschte reihen in Schema: || Country ||");

    End ;


    Wie kann ich am einfachsten einen counter einbauen...
    habe bereits versucht:

    Deleter from ....
    where.... ;
    sql%rowcount; oder: d_counter := d_counter + sql%rowcount; aber auch schon d_counter := sql%rowcount;
    commit;

    Vielen Dank im Voraus


  • #2
    Die Antwort wurde dir schon in deinem ersten Beitrag gegeben mit 2 Lösungsmöglichkeiten
    Code:
    delete from Tabelle;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    Christian

    Comment


    • #3
      danke und ja weis ich.
      jedoch funktioniert es ja nicht so ganz wie ich es brauch...SQL%ROWCOUNT gibt mir unten im Compiler Log sowie in meiner
      LOG Tabelle jeweils immer 0 aus, Datensätze werden aber bei jedem durchlauf gelöscht

      Comment


      • #4
        Kann ich hier nicht nachvollziehen. Obiges Beispiel funktioniert

        Code:
        Verbindung mit der Datenbank xx.
        3
        Prozess beendet.
        Kompletter Code:

        Code:
        CREATE OR REPLACE PROCEDURE PROCEDURE1
            AS
        ZEILEN number;    
        BEGIN
             DELETE FROM AAA;
             ZEILEN:=SQL%ROWCOUNT;
             DBMS_OUTPUT.PUT_LINE(ZEILEN);
        END PROCEDURE1;

        Des Weiteren hast du die Möglichkeit den delete vorher als select abzusetzen
        Zuletzt editiert von Christian Marquardt; 11.12.2018, 15:19.
        Christian

        Comment


        • #5
          Hättest du evtl. ein Code beispiel bzw. eine deutsche Dokumentation ?

          viele grüße

          Comment


          • #6
            Codebeispiel siehe oben, geänderter Beitrag
            Christian

            Comment


            • #7
              ok vielen dank !

              eine weitere frage bevor ichs gleich ausprobiere.

              delete from (schema) (table)
              where id = (select id from xxx...);
              // [hier hatte ich es schon und es lief nicht]
              commit;

              IF DEBUG
              dbms.outputline(sqlstatement);
              END IF;

              execute immediate sqlstatement;

              Wo genau muss ich bei meiner Prozedur des einbauen ?

              Comment


              • #8
                Nun, ich würde es da einbauen, wo es nicht ging und debuggen
                Christian

                Comment


                • ak_hacker_666
                  ak_hacker_666 commented
                  Editing a comment
                  hab mal nun dein code als bsp. genommen und nach dem selben Prinzip hab Ichs aufgebaut
                  ....nun hab ich folgendes Problem dass in dem Schema in dem etwas gelöscht wird leer gelassen wird
                  alle weiteren Schemas in denen nichts geschieht steht "0"

                  sprich für AT: Delete rows in table.xy
                  und für IE: Delete 0 rows in table.xy

                  hab es wie oben geschrieben und deklariert...bin so langsam ratlos
                  meine zweite Prozedur im Leben, hoffe du hast etwas Verständnis
                  und schonmal ein ganz großes Danke für die mühe.

                  VG

              • #9
                Da ich deine DB nicht kenne und deine Tabellen (xy), Code nicht habe, kann ich dazu nix mehr sagen
                Christian

                Comment


                • #10
                  hier wären die 2 Prozeduren, die 3. DELETE LOG Prozedur ist für die Einträge da
                  die fehlen jetzt hier aber auch noch in der Proc, aber selbst im Compiler krieg ich ja
                  das selbe problem wie in den Log Einträgen, dass bei den Ländern wo nichts gelöscht
                  wird 0 steht und bei den Ländern in denen die Prozedur Datensätze löscht einfach
                  leer ist bsp. der Eintrage: ' Delete " 0 " rows from TDATA US '
                  ' Delete " " rows from TDATA AT '



                  create or replace PROCEDURE DELETE_EMPLOYEES_LAND (pMandant VARCHAR2, debug boolean)
                  IS
                  vcsqlerror VARCHAR (200) := '';
                  vcslog VARCHAR (1000) := '';
                  sqlStatement VARCHAR2 (2000) := '';
                  BEGIN

                  sqlStatement :=
                  'DELETE FROM AZV' || pMandant || '.TDATA '
                  || 'WHERE userid IN (SELECT USERID '
                  || 'FROM AZV' || pMandant || '.HR_DATA where STAMM_NR in '
                  || '(select PERNR from v_deleted_employees_temp )) ';

                  IF DEBUG
                  THEN
                  DBMS_OUTPUT.PUT_LINE (sqlstatement)
                  END IF;
                  COMMIT;

                  EXECUTE IMMEDIATE sqlStatement;
                  COMMIT;


                  sqlStatement :=
                  'Delete from AZV' || pMandant || '.HR_DATA where STAMM_NR in '
                  || '(select pernr from v_deleted_employees_temp)';

                  IF DEBUG
                  THEN
                  DBMS_OUTPUT.PUT_LINE (sqlstatement)
                  END IF;
                  COMMIT;

                  EXECUTE IMMEDIATE sqlStatement;
                  COMMIT;

                  END DELETE_EMPLOYEES_LAND;


                  create or replace PROCEDURE DELETE_EMPLOYEES_ALL_LANDS (pMandant varchar2 , debug boolean)
                  IS

                  BEGIN

                  DELETE_EMPLOYEES_LAND ( 'US', true );
                  DELETE_EMPLOYEES_LAND ( 'AT' true );
                  ....
                  END DELETE_EMPLOYEES_ALL_LANDS

                  Comment


                  • #11
                    Mir ist unklar wie du das compilieren kannst. Der SQL-Developer müsste erstmal in Zeile 16 und 30 die fehlenden Semikolon anmeckern.
                    Habe das Beispiel nochmal um EXECUTE IMMEDIATE erweitert, funktioniert immer noch. Kann deine Procedur hier wegen der fehlenden Tabellen nicht ausführen.

                    Code:
                    CREATE OR REPLACE PROCEDURE PROCEDURE1 AS
                        zeilen         NUMBER;
                        sqlStatement   VARCHAR2(2000) := '';
                    BEGIN
                        sqlStatement := 'DELETE FROM AAA';
                        EXECUTE IMMEDIATE sqlStatement;
                        ZEILEN := SQL%ROWCOUNT;
                        DBMS_OUTPUT.PUT_LINE(zeilen);
                    END PROCEDURE1;
                    Ausgabe:
                    Verbindung mit der Datenbank 02 xxx.
                    1
                    Prozess beendet.
                    Abmeldung von der Datenbank 02 xxx.
                    Ggf. nutze

                    Code:
                    anzahl number;
                    
                    .
                    .
                    
                         sqlStatement := 'SELECT COUNT(*) INTO
                                anzahl
                            FROM AZV' || pMandant || '.TDATA '
                    || 'WHERE userid IN (SELECT USERID '
                    || 'FROM AZV' || pMandant || '.HR_DATA where STAMM_NR in '
                    || '(select PERNR from v_deleted_employees_temp )) ';
                    um erstmal abzufragen, wieviele Datensätze bei deinem Statement gelöscht werden
                    Christian

                    Comment


                    • #12
                      Kompilliert ist es richtig, es ist nur für die Arbeit aus dem grund wollt ich auch ungern auch den Code hier reinstellen.
                      Select count funktioniert.

                      Prozedur, klappt leider nicht ganz

                      Comment


                      • #13
                        sqlrowcount liefert die Zeilen der letzten SQL Anweisung.
                        execute immediate ist selbst eine solche Anweisung und "verwischt" das Ergebnis, das Du bekämst, wenn Du das Statement ohne execute immediate ausführen würdest.

                        Entweder Du verzichtest also auf execute immediate, wenn es unnötig ist.
                        Oder Du nimmst sqlrowcount innerhalb execute immediate mit rein und holst das Ergebnis von rowcoutn dort raus.

                        Der Vorschlag von Christian ist nur gangbar, wenn sichergestellt(!) ist, dass ein Select Count(*) mit identischer Where Clause ohne wenn und aber immer(!) dem Delete Count() entspricht. Das ist nicht selbstverständlich. Ein Datensatz kann zählbar sein, aber nicht löschbar usw.

                        Comment

                        Working...
                        X