Forum: PC-Programmierung PL/SQL mit oracle 10g: Trigger erstellen, tabelle bei gleichheit eines Strings füllen


von Jan (Gast)


Lesenswert?

Hallo,

fange grad an PL/SQL zu Programmieren und versuche mich an folgendem 
Beispiel:

Ich will einen Rechnerkonfigurator "bauen".
Es gibt zunächst ne Tabelle Mainboard und eine Tabelle CPU, beide haben 
ein Feld Sockel.
beim einfügen eines neuen CPUs soll ein Trigger ausgelöst werden, der 
prüft ob der CPU sozusagen auf irgendwelche Boards passt. wenn dem so 
ist, soll ein Eintrag in die Koppeltabelle cpu_mainboard geschrieben 
werden.
Der Datentyp des Feldes Sockel ist varchar2. Und ich denke auch dass da 
der Fehler liegt.(siehe Fehlerbeschreibung unten)

Ich habe versucht einen Beispielcode abzuwandeln, mein Ergebnis seht ihr 
hier:

Ich bedanke mich schon jetzt für eure Hilfe!
1
create or replace trigger new_cpu
2
after insert on cpu 
3
for each row
4
5
declare 
6
  socketneu varchar2(5):= 0;
7
  ma_bez:=0;    
8
  cursor cs is select * from mainboard where socket = :new.socket;
9
  cs_rec cs%rowtype;
10
begin
11
  socketneu:= :new.socket;
12
  open cs;
13
  loop 
14
  fetch cs into cs_rec;
15
    exit when cs%notfound;
16
    ma_bez:=cs_rec.bezeichner_ma;
17
      insert into cpu_mainboard VALUES(:new.bezeichnung_cpu,ma_bez);
18
  end loop;  
19
  close cs;
20
end new_cpu;
21
.
22
run;

dabei bekomme ich folgende Fehlermeldung:
1
Fehler bei TRIGGER NEW_CPU:
2
3
LINE/COL ERROR
4
-------- -----------------------------------------------------------------
5
3/8      PLS-00103: Encountered the symbol "=" when expecting one of the
6
         following:
7
         constant exception <an identifier>
8
         <a double-quoted delimited-identifier> table LONG_ double ref
9
         char time timestamp interval date binary national character
10
         nchar
11
         The symbol "<an identifier>" was substituted for "=" to continue.

von flk (Gast)


Lesenswert?

Hallo,

der Fehler liegt hier:
1
declare 
2
  socketneu varchar2(5):= 0;
3
  ma_bez:=0;

zumindestens socketneu ist eine Character-Variable und sollte entweder 
mit NULL oder mit "0" initialisiert werden.

Gruß
flk

von Jan (Gast)


Lesenswert?

Hallo,
erstmal vielen Dank für die Schnelle Antwort,
klingt ja auch alles plausibel, bei meinem Beispiel wars halt ne number, 
deswegen die 0...

Habs jetzt mal sowohl mit NULL als auch mit "0" versucht, aber die 
Fehlermeldung bleibt exakt die gleiche...

gruß, Jan!

von Jan (Gast)


Lesenswert?

Hallo,

hab nochmal weiter herumexperimentiert und versucht die Strings zu 
eliminieren.
DIe Tabellen CPU und mainboard sind nun über eine fortlaufende, 
automatisch generierte Nummer gekoppelt.(seq_cpu,seq_mainboard)
Der Datentyp des Feldes Sockel ist varchar2.

Neue Fehlermeldung steht unten. Vielleicht kann mir jetzt jemand helfen.

Gruß, Jan
1
CREATE OR REPLACE TRIGGER new_cpu
2
BEFORE INSERT ON cpu
3
FOR EACH ROW
4
DECLARE
5
  cursor cs is select sequenz_mainboard from mainboard where socket = :NEW.SOCKET;
6
        cs_rec cs%rowtype;
7
begin
8
  open cs;
9
  loop fetch cs into cs_rec; 
10
  exit when cs%notfound; 
11
  insert into cpu_mainboard VALUES(:new.sequenz_cpu,cs_rec);
12
  end loop;  
13
  close cs;
14
end new_cpu;
15
.
16
run;
Als Fehlermeldung bekomme ich folgendes:
1
Fehler bei TRIGGER NEW_CPU:
2
3
LINE/COL ERROR
4
-------- ---------------------------------------
5
6/102    PLS-00382: expression is of wrong type

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.