Zum Inhalt springen

pel

Mitglieder
  • Gesamte Inhalte

    45
  • Benutzer seit

  • Letzter Besuch

Beiträge von pel

  1. Musterlösung von Lehrerin:

    create or replace PROCEDURE STUE14 AS
    
    BEGIN
    
      declare 
    
          cursor c_Bestellung is select * from BestellungenUe14  where Lfr_code not in (select Lfr_code from LieferantenUe14) for update;
    
    
          B_Satz BestellungenUe14 %ROWTYPE;
    
    
          fehlercode number;
    
          fehlernachricht varchar2(255);
    
    
          lfr_not_found exception;
    
          falscherLfr_code BestellungenUe14.Lfr_code%TYPE; -- B_Satz.Lfr_code in exception nicht 
    
      								-- bekannt!
    
      Begin
    
    
          dbms_output.enable;
    
          if SQL%NOTFOUND then dbms_output.put_line('keine fehlerhaften Tupel in B-Tab.');
    
          else
    
            for B_Satz in c_Bestellung
    
            loop
    
    
                insert into FalscheBestellungenUe14 values (B_Satz.Bestellnr, B_Satz.Lfr_code, B_Satz.B_Datum, B_Satz.Betrag);
    
                delete BestellungenUe14 where current of c_Bestellung;
    
                falscherLfr_code:= B_Satz.Lfr_code;
    
                raise lfr_not_found;
    
    
            end loop;
    
          end if;
    
       commit;
    
    
      exception
    
          when NO_DATA_FOUND then dbms_output.put_line('keine fehlerhaften Tupel in Bestell-Tab.');
    
          when lfr_not_found then dbms_output.put_line('Lieferant: '||falscherLfr_code||' ex. nicht'); 
    
          when others        then fehlercode:= SQLCODE;
    
         fehlernachricht:= SQLERRM;
    
    
      end;
    DDL code von Lehrerin:
      CREATE TABLE BESTELLUNGENUE14 
    
       (	"BESTELLNR" NUMBER(10,0), 
    
    	"LFR_CODE" CHAR(3), 
    
    	"B_DATUM" CHAR(8), 
    
    	"BETRAG" NUMBER(7,2)
    
       ) ;
    
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (175,'004','19880227',395.51);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (181,'009','19890306',577.22);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (190,'014','19850313',659.84);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (191,'013','19850313',1211.41);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (200,'004','20040314',72);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (201,'004','19850326',221.25);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (202,'014','19850326',530.43);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (203,'019','19850401',556.6);
    
    Insert into BESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (205,'013','20010225',300);
    
    
    
      CREATE TABLE FALSCHEBESTELLUNGENUE14 
    
       (	"BESTELLNR" NUMBER(10,0) NOT NULL ENABLE, 
    
    	"LFR_CODE" CHAR(3), 
    
    	"B_DATUM" CHAR(8), 
    
    	"BETRAG" NUMBER(7,2)
    
       ) ;
    
      ALTER TABLE FALSCHEBESTELLUNGENUE14 ADD CONSTRAINT "FALSCHEBESTELLUNGENUE18_PK" PRIMARY KEY ("BESTELLNR") ENABLE;
    
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (174,'003','20010225',117.5);
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (184,'022','19990306',240);
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (186,'020','19850311',414.05);
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (192,'035','20030313',317.52);
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (197,'035','19850314',928.27);
    
    Insert into FALSCHEBESTELLUNGENUE14 (BESTELLNR,LFR_CODE,B_DATUM,BETRAG) values (204,'034','19850401',492.53);
    
    
    
      CREATE TABLE LIEFERANTENUE14 
    
       (	"LFR_CODE" CHAR(3) NOT NULL ENABLE, 
    
    	"LFR_NAME" VARCHAR2(20), 
    
    	"ADRESSE" VARCHAR2(25), 
    
    	"WOHNORT" VARCHAR2(15)
    
       ) ;
    
      ALTER TABLE LIEFERANTENUE14 ADD CONSTRAINT "LIEFERANTENUE18_PK" PRIMARY KEY ("LFR_CODE") ENABLE;
    
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('004','HOVEN G.H.','SANDWEG 50','LINZ');
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('009','BAUMGARTEN R.','TANKSTRASSE 13','HANNOVER');
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('011','STRAUCH GMBH','BEERENWEG 1','LINZ');
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('013','SPITZMANN','HINTERGARTEN 9','AALEN');
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('014','DEZAIER L.J.','IM GRUND 101','LINZ');
    
    Insert into LIEFERANTENUE14 (LFR_CODE,LFR_NAME,ADRESSE,WOHNORT) values ('019','SCHOENE F.A.','SOMMERSTR. 24','AALEN');
    Compiliert OK, doch beim ausführen der Prozedur kommt dieser fehler:
    Source does not have a runnable target.

    Habe auch gegoogelt doch da steht was von Packages macht aber net wirklich sinn, vielleicht weißt du mehr mit deiner Masse ERahrung an pl/sql!? :uli

  2. CREATE OR REPLACE PROCEDURE COLLECTIONTEST AS
    
    
     TYPE MaTab is table of Mitarbeiter%ROWTYPE index by binary_integer;
    
     MaSatz MaTab;
    
     Begin 
    
       -- ///////// Spaltenwerte in eine Collections einlesen /////////////
    
       select * into MaSatz(1) from mitarbeiter where ma_nr = 1;
    
       dbms_output.put_line('Mitarbeiternummer: '||masatz(1).MA_NR||' Vorname: '||masatz(1).MA_Vorname||' Mitarbeitergehalt: '||masatz(1).MA_Gehalt); 
    
    
     End; 
    
    END COLLECTIONTEST;
    Fehler:
    Error(12,1): PLS-00103: Fand das Symbol "END" 

    ??

  3. Ein DECLARE ist weder in einer Prozedur noch in einer Funktion erlaubt. Das Schlüsselwort existitiert in Tiggern und anonymen PL/SQL Blöcken.

    Dim

    warum meckert der compiler aber, wenn untenstehends declare von mir entfernt wird? Es ist eine Prozedur sollte doch laut dir kein declare enthalten?

    CREATE OR REPLACE PROCEDURE COLLECTIONTEST AS
    
    BEGIN
    
    
     declare  
    
     TYPE MaTab is table of Mitarbeiter%ROWTYPE index by binary_integer;
    
     MaSatz MaTab;
    
     Begin
    
    
       -- ///////// Spaltenwerte in eine Collections einlesen /////////////
    
       select * into MaSatz(1) from mitarbeiter where ma_nr = 1;
    
       dbms_output.put_line('Mitarbeiternummer: '||masatz(1).MA_NR||' Vorname: '||masatz(1).MA_Vorname||' Mitarbeitergehalt: '||masatz(1).MA_Gehalt); 
    
    
     End; 
    
    END COLLECTIONTEST;
    Beende ich ein Case mit
     end case;
    kommt Fehler. nur mit
    end;

    kein fehler??

    In wikipedia steht aber end case; so beenden :confused: irgendwie scheint mir pl/sql noch in den Kinderschuhen zu stecken oder die leute blickens net...

    quelle: http://de.wikipedia.org/wiki/PL/SQL#Simple_CASE

    beides zu erlauben ist auch quark!

  4. Keine Ahnung was Du da drumherumprogrammiert hast. Auf jeden Fall ist dein Cursor unnötig und versaut dir dein Ergebnis. Du brauchst keine Schleife und keinen Cursor - dein UPDATE Befehl macht alles in einem Rutsch.
    so gehts: ok ich versuchte immer eine update auf einzelne Zeilen zu machen, wobei update ja beinhaltet, dass die ganze TAbelle betroffen ist :schlaf: :D
    create or replace
    
    PROCEDURE UPDATE_PRAEMIE AS
    
    BEGIN 
    
    
        BEGIN   
    
    
          update Mitarbeiter  set MA_Praemie =
    
             case
    
             when MA_Praemie > 9000 then MA_Praemie * 1.15
    
             when MA_Praemie > 5000 then MA_Praemie * 1.10
    
             when MA_Praemie > 1000 then MA_Praemie * 1.05
    
             else MA_Praemie
    
             end;
    
    
        END;
    
    COMMIT;
    
    END UPDATE_PRAEMIE; 
    meine Verwirrung insgesamt beruht auf diesen 2 Lösungen der Lehrerin...
    
    create or replace PROCEDURE I33UPDATE1_PRAEMIE AS
    
    BEGIN
    
      declare
    
      cursor cur_mitarbeiter is select * from i33mitarbeiter for update;
    
      MA_Daten i33mitarbeiter%ROWTYPE; 
    
    
      BEGIN
    
        for MA_Daten  in cur_mitarbeiter
    
        loop
    
          if MA_Daten.MA_Praemie > 9000 then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.15;
    
             --    Alternative:
    
             --    then update i33mitarbeiter set MA_Praemie = MA_praemie * 1.15  where current of cur_mitarbeiter
    
             elsif MA_Daten.MA_Praemie > 5000
    
                   then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.1;
    
                   --    s.o.
    
                   elsif MA_Daten.MA_Praemie > 1000
    
                         then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.05;
    
                         -- s.o.
    
        end if;
    
        -- für alternative Lösung nicht:
    
        update i33mitarbeiter set MA_Praemie = MA_Daten.MA_Praemie where 
    
               MA_Nr = MA_Daten.MA_Nr;
    
        end loop;
    
    
      end;
    
      commit;
    
    
    END I33UPDATE1_PRAEMIE;
    
    
    
    create or replace PROCEDURE I33UPDATE2_PRAEMIE AS
    
    BEGIN
    
      declare
    
      cursor cur_mitarbeiter is select * from i33mitarbeiter for update;
    
      MA_Daten i33mitarbeiter%ROWTYPE; 
    
    
      BEGIN
    
        open cur_mitarbeiter;
    
        loop
    
        fetch cur_mitarbeiter into MA_Daten;
    
          if MA_Daten.MA_Praemie > 9000  then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.15;
    
             --    Alternative:
    
             --    then update i33mitarbeiter set MA_Praemie = MA_praemie * 1.15 where current of cur_mitarbeiter
    
             elsif MA_Daten.MA_Praemie > 5000
    
                   then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.1;
    
                   --    s.o.
    
                   elsif MA_Daten.MA_Praemie > 1000
    
                         then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.05;
    
                         -- s.o.
    
        end if;
    
        -- für alternative Lösung nicht
    
        update i33mitarbeiter set MA_Praemie = MA_Daten.MA_Praemie where MA_Nr = MA_Daten.MA_Nr;
    
        exit when cur_mitarbeiter%NOTFOUND;
    
        end loop;
    
    
        close cur_mitarbeiter;
    
    
      end;
    
      commit;
    
    END I33UPDATE2_PRAEMIE;
    
    
    
    

  5. Zitat:

    Kannst du erkennen warum ich hier für eine Prämie von 8000 (+10%) einen wert von 22390.. bekomme ???

    Weil Du die Prozedure 8 mal ausgeführt hast.

    ja die prozedur habe ich nur 1x aufgerufen, doch was 8 mal passiert ist dies:

    das ist doch richtig so, dass für jedes element im cursor die Prämie geupdated wird, was ist daran falsch? laut meinem ergebnis müsste bei 8 tupel ja 8 durchläufe und dazu je 8 updates geschehen tuts doch aber nicht, sorry steh auf dem Schlauch :D

     FOR MA_Daten IN Mitarbeiter_Cursor -- Für jeden Datensatz MA_Daten der sich in dem Cursor(-Array) Mitarbeiter_Cursor befindet mache folgendes:
    
            LOOP -- **********************************************************************************************************
    
           -- FETCH Mitarbeiter_Cursor INTO ma_daten;
    
    
          update Mitarbeiter  set MA_Praemie =
    
             case
    
             when MA_Praemie > 9000 then MA_Praemie * 1.15
    
             when MA_Praemie > 5000 then MA_Praemie * 1.10
    
             when MA_Praemie > 1000 then MA_Praemie * 1.05
    
             else MA_Praemie
    
             end;
    
    
            EXIT WHEN Mitarbeiter_Cursor%NOTFOUND;        
    
            END LOOP; -- *****************************************************************************************************

  6. super man deine Antworten sind echt hilfreich!

    Syntax von Select:

    SELECT column_name(s) FROM table_name
    warum dann das?
    
    cursor cur_mitarbeiter is select * from i33mitarbeiter for update;
    warum das for update hinten? würde es nicht auch so ok sein?:
    cursor cur_mitarbeiter is select * from i33mitarbeiter ;
    
    

    warum brauche ich in einer Funktion kein declare(compiler meckert) aber in einer Prozedur schon? Wo ist da der Sinn?

  7. wie du gesagt hast keine fachliche logik in einen trigger.... kann ich dann ich einem trigger eine Funktion/Prozedur aufrufen, die dann z.B. Prämien updated oder wäre das doppelt gemoppelt?

    Was ist denn der praktische/alltäglich Anwendungsfall von Triggern, sprich Datensatz wird gelöscht/updated/inserted und dann?? was passiert dann hier meistens?

    Das habe ich noch vom oracle forum gefällt mir auch gut:

    update Mitarbeiter
    
       set MA_Praemie =
    
           case
    
           when MA_Praemie > 9000 then MA_Praemie * 1.15
    
           when MA_Praemie > 5000 then MA_Praemie * 1.10
    
           when MA_Praemie > 1000 then MA_Praemie * 1.05
    
           else MA_Praemie
    
           end
    also open cursor nur mit der for ...in... cursor schleife OK! Kannst du erkennen warum ich hier für eine Prämie von 8000 (+10%) einen wert von 22390.. bekomme ???
    create or replace
    
    PROCEDURE UPDATE_PRAEMIE AS
    
    BEGIN 
    
    
      DECLARE 
    
      CURSOR Mitarbeiter_Cursor is select * from Mitarbeiter for update;
    
      MA_Daten Mitarbeiter%ROWTYPE; -- Die Datensatzstruktur Spalten/Datentypen befinden sich nur im Datensatz MA_Daten
    
    
        BEGIN
    
    
        --OPEN Mitarbeiter_Cursor;
    
            FOR MA_Daten IN Mitarbeiter_Cursor -- Für jeden Datensatz MA_Daten der sich in dem Cursor(-Array) Mitarbeiter_Cursor befindet mache folgendes:
    
            LOOP -- **********************************************************************************************************
    
           -- FETCH Mitarbeiter_Cursor INTO ma_daten;
    
    
          update Mitarbeiter  set MA_Praemie =
    
             case
    
             when MA_Praemie > 9000 then MA_Praemie * 1.15
    
             when MA_Praemie > 5000 then MA_Praemie * 1.10
    
             when MA_Praemie > 1000 then MA_Praemie * 1.05
    
             else MA_Praemie
    
             end;
    
    
            EXIT WHEN Mitarbeiter_Cursor%NOTFOUND;        
    
            END LOOP; -- *****************************************************************************************************
    
        --CLOSE Mitarbeiter_Cursor;
    
        END;
    
    COMMIT;
    
    END UPDATE_PRAEMIE; 

  8. Wenn ich den cursor nicht öffne gehts sprich keine Fehlermeldung mehr doch die Prämien werden nicht geupdatet... ABER man muss doch einen Cursor öffnen das verstehe ich jetzt net...

    Weiterhin verwirrt mich und ich habe auf Wikipedia geschaut:

    MA_Daten Mitarbeiter_Cursor%ROWTYPE;
    Mitarbeiter_Cursor ist ein Cursor! Lehrerin schreibt in der Lösung die net funzt...:
    MA_Daten Mitarbeiter%ROWTYPE;
    Mitarbeiter ist eine Tabelle! Wie ist die Syntax jetzt richtig?
    MA_Daten <Tabellename>%ROWTYPE  
    oder
    MA_Daten <Cursorname>%ROWTYPE  

    ??

  9. ok ist jetzt nur noch 1 Fehler ^^

    Frage: Das unten ist Muster-Code-Lösung...

     declare
    
      cursor cur_mitarbeiter is select * from i33mitarbeiter for update;
    
      MA_Daten i33mitarbeiter%ROWTYPE; 
    müsste der hintere codeteil nicht so heißen:
    
    MA_Daten cur_mitarbeiter%ROWTYPE ??
    grrrr... EDIT: OK habe den Fehler gefunden es fehlte ein BEGIN UNd habe die Prozedur ausgeführt: bekomme diese Meldung im Log:
    Connecting to the database MyConnection.
    
    ORA-06511: PL/SQL: Cursor wurde bereits geöffnet
    
    ORA-06512: in "PEL.UPDATE_PRAEMIE", Zeile 5
    
    ORA-06512: in "PEL.UPDATE_PRAEMIE", Zeile 11
    
    ORA-06512: in Zeile 2
    
    Prozess beendet.
    
    Disconnecting from the database MyConnection.
    Beispiel error:
    ORA-06512 at string line string
    
    
        Cause: Backtrace message as the stack is unwound by unhandled exceptions.
    
    
        Action: Fix the problem causing the exception or write an exception handler for this condition. Or you may need to contact your application administrator or database administrator

    .

    Was kann das ein?

    Dazu muss ich sagen, dass manche Mitarbeiter eine Prämie von 0 haben. Spielt das ein Problem?

  10. Wenn Du mit dem Update Statement das Datumsfeld einer Rechnung auf das jetztige Datum setzen möchtest, dann ist das so richtig.

    Dim

    ok danke dir so wollte ich das auch!

    CREATE OR REPLACE PROCEDURE UPDATE_PRAEMIE AS
    eine mehr philosophische Frage... 1.) Warum steht nach jedem Methodennamen "AS" ??? Ich meine was bringt das oder Sinn? Erschaffe oder ersetze eine Prozedur soundso als ?? als was ? 2.) Ich bekomme hierbei Fehlermeldungen 2 Stück doch was ist an der Syntax falsch?
    CREATE OR REPLACE PROCEDURE UPDATE_PRAEMIE AS
    
    
      declare cursor Mitarbeiter_Cursor is select * from Mitarbeiter for update;
    
      MA_Daten Mitarbeiter%ROWTYPE; -- Die Datensatzstruktur Spalten/Datentypen befinden sich nur im Datensatz MA_Daten
    
    
      BEGIN
    
    
      OPEN Mitarbeiter_Cursor;
    
      FOR MA_Daten IN Mitarbeiter_Cursor -- Für jeden Datensatz MA_Daten der sich in dem Cursor(-Array) Mitarbeiter_Cursor befindet mache folgendes:
    
      LOOP -- ****************************
    
    
      if MA_Daten.MA_Praemie > 9000 then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.15; -- 15 % mehr Praemie
    
          elsif MA_Daten.MA_Praemie > 5000 then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.1; -- 10 % mehr Praemie
    
          elsif MA_Daten.MA_Praemie > 1000 then  MA_Daten.MA_Praemie:= MA_Daten.MA_Praemie * 1.05; -- 5 % mehr Praemie
    
      end if;
    
    
      END LOOP; -- ***************************
    
      CLOSE Mitarbeiter_Cursor;
    
    
      END UPDATE_PRAEMIE; 
    Fehler:
    Error(4,3): PLS-00103: Fand das Symbol "DECLARE" als eines der folgenden erwartet wurde:     begin function package pragma procedure subtype type use    <an identifier> <a double-quoted delimited-identifier> form    current cursor external language Das Symbol "begin" ersetzte "DECLARE", um fortzufahren. 
    Error(22,54): PLS-00103: Fand das Symbol "end-of-file" als eines der folgenden erwartet wurde:     begin case declare end exception exit for goto if loop mod    null pragma raise return select update while with    <an identifier> <a double-quoted delimited-identifier>    <a bind variable> << close current delete fetch lock insert    open rollback savepoint set sql execute commit forall merge    pipe 
    Alternative else if Lösung:
    update Mitarbeiter set MA_Praemie = MA_praemie * 1.15  where current of Mitarbeiter_Cursor

    Ich habe gegoogelt verstehe das where current of <cursorname> trotzdem nicht... kann mir das jemand kurz erklären? grob übersetzt: update Mitarbeiter Tabelle und dessen Spalte MA_Praemie mit 15 % wo der Cursor aktuell draufzeigt ?? Ist das so richtig gedünkt?

  11. Vielleicht wird es verständlicher mit einem Alias:

    UPDATE rechnung rech 
    
       SET rech.betrag=rech.betrag-(select :old.anzahl*preis from artikel art where art.art_code=:old.art_code)
    
     WHERE rech.rechnungsnr=:old.rechnungsnr

    Dim

    verständlicher net doch ich denke ich habs zu 70% ^^ kapiert jetzt:

    betrag - (wert wird ausgerechnet mit altem art_code) ABER nur da wo die alte rechnungsnr gleich der rechnungsnr in der Rechnung Tabelle ist wird upgedatet.

  12. Also eigentlich ist das die Art von Triggern, die man nie nie nie machen sollte. Logik in einem Trigger verstecken ist immer schlechtes Design und macht eine Anwendung schwer wartbar.

    Und sowas lernt ihr dann. Seufz.

    Was Du brauchst ist ein einfacher UPDATE:

    UPDATE rechnung SET betrag=betrag-(select :old.anzahl*preis from artikel where art_code=:old.art_code)
    
    WHERE rechnungsnr=:old.rechnungsnr
    So in etwa sollte das laufen (ungetestet). Aber wie gesagt: Solltest Du sowas mal im Beruf machen, hof ich, dass dir ein Kollege das ganze sofort um die Ohren haut. Dim
    ne ich wills ja so wie du machen ;-) ok danke dir geht! Frage: So müsste es doch auch gehen oder? mir gefällt die Syntax besser...
    UPDATE rechnung SET betrag = betrag - (select :old.anzahl*preis from artikel where art_code=:old.art_code AND rechnungsnr=:old.rechnungsnr);
    Ausgabe: DELETE FROM "PEL"."RECHNUNG" WHERE ROWID = 'AAADZEAAEAAAADdAAB' AND ORA_ROWSCN = '452495' and ( "RECHNUNGSNR" is null or "RECHNUNGSNR" is not null ) also gehts net weißt du warum? ...zu NULL nicht möglich... hm...
    One error saving changes to table "PEL"."RECHNUNG":
    
    Row 2: ORA-01407: Aktualisieren von ("PEL"."BESTELLPOS"."RECHNUNGSNR") zu NULL nicht möglich

  13. Das ist kein Triggerproblem, sondern eine Schutzmaßnahme, die von Oracle bewußt eingebaut wurde um dich davor zu bewahren aus einem Trigger heraus per SQL auf seine eigene Tabelle zuzugreifen.

    hehe das hat halt unsere Lehrerin behauptet die eh kein plan hat...

    Ich poste mal die gesamte aufgabe damit klarer wird was ich will:

    ayvd9zrokxfjyv842.png

    Teillösung in worten... :

    der temporäre Betrag ist = Rechnung.betrag * Bestellpos.anzahl Wo ART_Code = alter ART_Code ist ?

    danach: neuer Rechnung.betrag = alter Rechnung.betrag - temporärer Betrag

    In Worten und von der Logik dürfts hinkommen doch wie ich das in pl/sql ausdrücke komme ich net weiter, da die Unterlagen die ich hier habe unvollständig und verwirrend sind und so fühle ich mich auch...

    Frage: Wie greife ich auf das "old" einer andere Tabelle als Bestellpos zu ?

    Kennst du vielleicht einfach gehaltene trigger beispiele zum durchlesen etc?

  14. CREATE OR REPLACE TRIGGER TRIGGER1 After Insert or Delete ON BESTELLPOS
    
    FOR EACH ROW
    
    
    Declare
    
    my_anzahl number; 
    
    
    BEGIN
    
      SELECT :old.anzahl INTO my_anzahl FROM bestellpos; 
    
      dbms_output.put_line('anzahl: '||my_anzahl);  
    
    END;
    Fehler:
    DELETE FROM "PEL"."BESTELLPOS" WHERE ROWID = 'AAADZIAAEAAAAD9AAD' AND ORA_ROWSCN = '448030' and ( "POSNR" is null or "POSNR" is not null )
    
    
    One error saving changes to table "PEL"."BESTELLPOS":
    
    Row 4: ORA-04091: Tabelle PEL.BESTELLPOS wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht
    
    ORA-06512: in "PEL.TRIGGER1", Zeile 6
    
    ORA-04088: Fehler bei der Ausführung von Trigger 'PEL.TRIGGER1'
    Ich weiß das ist ein trigger Problem wegen mutating table bla und sollte mit new und old gelöst werden doch ich habe ja oben
    :old.anzahl 

    ??

  15. super danke dir ich suchte immer nach output nicht dbms_output :D

    kannst du mir sagen wie ich innerhalb dieses trigger nicht auf die tabelle Bestellpos sondern auf eine andere Tabelle bzw. deren Spalte Betrag in der DB zugreifen kann nennen wir sie: Rechnung z.B.

    Declare my_rechnung Rechnung%ROWTYPE
    
    
    Begin
    
    
    my_rechnung.Betrag 
    (würde das so stimmen) ?? obwohl ich nicht:
    REFERENCING OLD AS old  FOR EACH ROW

    ganz oben angab, funkioniert der Trigger vom 1.post, woher kommt das?

  16. Hallo,

    1.)Ich habe z.B. diesen Trigger:

    anzahl ist eine Tabellenspalte. BestellPos ist die TAbelle

    Aufgabenstellen: Nachdem Tupel gelöscht wird soll von diesem Tupel in der Spalte anzahl der Wert in die variable varanzahl geschrieben werden. Ist der code richtig so? bekomme keinen compile-error aber auch keine Ausgabe siehe unten...

    CREATE OR REPLACE
    
    TRIGGER TRIGGER1
    
    After DELETE ON BESTELLPOS
    
    
    declare varanzahl number;
    
    
    BEGIN
    
    dbms_output.enable;
    
    
    select anzahl into varAnzahl from bestellpos;
    
    dbms_output.put_line('anzahl: '|| varanzahl);
    
    
    END;

    2.)Ich suche das Ausgabefenster in dem sql developer oracle tool

    wo die Ausgabe "varanzahl" stehen müsste finde aber nichts?

    Handbuch, HIlfe , google halfen nicht weiter...

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...