update anweisung, wie geht es richtig???
Sam
- datenbank
Hallo community,
ich arbeite gerade an einer Datenbank für eine Schulaufgabe.
Ich will in einer stored Procedure den Versuch der Person mit der pid=20175 für die Pruefung mit der pruefungID=8 um einen erhöhen.
Soll natürlich für alle gehen. Aber erstmal würde mir einer reichen.
UPDATE dba.Anmeldung
SET versuch = versuch+1
WHERE pid = 20175
AND modulID = (SELECT modulID FROM Pruefung WHERE PruefungID=8);
Diese Updateanweisung funktioniert nicht mit der Fehlermeldung 'Spalte versuch nicht gefunden'
das Komische ist aber dieses Select-Statement auf der gleichen Datenbank funktioniert~~~sql
select versuch from anmeldung
WHERE pid = 20175
AND modulID = (SELECT modulID FROM Pruefung WHERE PruefungID=8);
Ich kann mir dieses Phänomen nicht erklären, einer von euch vielleicht?
Die Tabelle sieht so aus
~~~sql
/*==============================================================*/
/* Table: Anmeldung */
/*==============================================================*/
create table Anmeldung
(
modulID char(8) not null,
pid integer not null,
anmeldestatus smallint,
Versuch int,
constraint PK_ANMELDUNG primary key clustered (modulID, pid)
);
Ich arbeite mit einer Sybase SqlAnywhere11 Datenbank, und habe als dba und/oder dbuser das gleiche Resultat.
Wäre cool, wenn einer von euch ne Antwort weiß.
mfg Sam
Hi,
UPDATE dba.Anmeldung
select versuch from anmeldung
Sprichst du damit auch wirklich beide Male die gleiche Tabelle an?
(K.A., wie das bei deinem DBMS hinsichtlich case sensitivity von Bezeichnern aussieht.)
MfG ChrisB
Vielleicht müsste es ja dbo statt dba heißen? Das kenn ich als "database owner".
(Übrigens, warum krieg ich bei nur obigem Satz die Meldung: Der Text enthält drei oder mehr gleiche Zeichen hintereinander oder enthält keine Satzzeichen (-2.00 Punkte).)
Hi Encoder!
(Übrigens, warum krieg ich bei nur obigem Satz die Meldung: Der Text enthält drei oder mehr gleiche Zeichen hintereinander oder enthält keine Satzzeichen (-2.00 Punkte).)
Weil du den Titel des Vorgängerpostings blind übernommen hast.
MfG H☼psel
ups, der Titel zählt ja auch dazu :-)
Vielleicht müsste es ja dbo statt dba heißen? Das kenn ich als "database owner".
Ok ich werde mal DBO probieren in der stored prozudure.
Schauen wir mal ob es was bringt
Ok ich werde mal DBO probieren in der stored prozudure.
Schauen wir mal ob es was bringt
Das heißt also du weißt selber nicht warum da dba davor steht, bzw. was du mit diesem Namen bezwecken wolltest? Vielleicht solltest du das erst mal rausfinden.
Ok ich werde mal DBO probieren in der stored prozudure.
Schauen wir mal ob es was bringt
Das heißt also du weißt selber nicht warum da dba davor steht, bzw. was du mit diesem Namen bezwecken wolltest? Vielleicht solltest du das erst mal rausfinden.
Ich weiß das ich dba.tabellennamen benutze um die Tabelle zu klassifizieren.
"Eigentümer"."Tabellenname" sollte eigentlich immer die Form sein, wie man eine Tabelle anspricht.
Eigentümer = dba
=> db Administatrator => weil ich mit diesem User die Tabelle erstellt habe
Tabellenname = Anmeldung
Besitzer der stored Prozedure ist auch dba, aber das sollte nicht storen wenn die dba.sp
Ich glaube schon zu wissen was ich tuhe und warum.
Ich weiß nur nicht warum es nicht funktioniert
Übrigens dbo.Anmeldung funktioniert leider auch nicht
Hier nochmal die gesamte stored Procedure
ALTER PROCEDURE "DBA"."sp_note_eintragen"(
IN a_pruefungID integer,
IN a_matrikelnummer integer,
IN a_note decimal(2,1))
BEGIN ATOMIC
DECLARE StudentNotFound EXCEPTION FOR SQLSTATE VALUE '99901';
DECLARE PruefungNotFound EXCEPTION FOR SQLSTATE VALUE '99902';
declare v integer;
if a_matrikelnummer not in (SELECT pid FROM dba.Student)
then
SIGNAL StudentNotFound;
end if;
if a_pruefungID not in (SELECT pruefungID FROM dba.Pruefung)
then
SIGNAL PruefungNotFound;
end if;
if a_note>4.0
then
/*--set v = (select Versuch from dba.Anmeldung WHERE pid = a_Matrikelnummer
--AND modulID = (SELECT modulID FROM dba.Pruefung WHERE PruefungID=a_pruefungID));
--message v to client; */
UPDATE dba.Anmeldung
SET versuch = versuch+1
WHERE pid = a_Matrikelnummer
AND modulID = (SELECT modulID FROM Pruefung WHERE PruefungID=a_pruefungID);
else
UPDATE dba.Anmeldung
SET AnmeldeStatus = 0
WHERE pid = a_matrikelnummer
AND modulID = (SELECT modulID FROM Pruefung WHERE PruefungID=a_pruefungID) ;
end if;
INSERT INTO dba.Note(note, pid, pruefungID)
VALUES (a_note, a_matrikelnummer, a_pruefungID);
END
Sybase ist NICHT case sensitiv!
Und wir haben auch nur eine Tabelle anmeldung in der Datenbank.
Also ist es unwahrscheinlich, das man zwei verschiedene Tabellen anspricht.