SQL Loginsystem Datenstruktur

Mit Sybase hast du schon einen rießen Vorteil. MS hatte mal vor vielen Jahren das RDBMS von Sybase gekauft und kurzer Hand in MS SqlServer umbenannt. Um das Beispiel etwas näher zu bringen, habe ich sowohl die SQLServer als auch Oracle Codes gepostet und im 2. Post nochmal den Ablauf genauer beschrieben. Folgende Dinge müsste ich wissen, dann schreib ich dir das auch in MySql Syntax:

1. Definition eines Codeblocks
2. Deklaration einer Variablen als VARCHAR
3. Abfrage eines Wertes in die o.a. Variable
4. Funktion und deren Syntax um Null-Werte durch einen beliebigen anderen Wert zu ersetzen
5. Concat von 2 VARCHAR Spalten/Variablen
6. Ausgabe des Inhalts der Variable

Ich bin da zu faul zu suchen, falls ihr die 6 Dinge beantworten könnt, dann versuche ich das in ein Script zu packen...

Grüße Rossibaer
 
Wofür brauchst du das denn? Und sorry, Prozeduren in MySQL habe ich auch noch nie geschrieben. Gibt es glaube ich auch erst seit MySQL 5.0. Mit deinem Beispiel in Oracle hatte ich aber kein Problem, denn da sind sich Postgres und Oracle sehr ähnlich.

Ich glaube in MySQL kannst du nicht per "||" verketten, dafür gibt es die concat()-Funktion.
 
Also bezogen auf dein zweites Beispiel und so, wie ich schätze, wie es in Postgres aussehen würde:

sText ist nach der Deklaration NULL. In NVL() verkettest du das Ding mit einer Zeichenkette und übergibst das Ergebnis als ersten Parameter. NULL || 'irgendwas' ist immer NULL. Also liefert NVL() den letzten Parameter, in dem Fall eine leere Zeichenkette. Die leere Zeichenkette verkettest du dann mit NAME und das ergibt wiederum NAME. NAME wird dann in sText geschrieben und ausgegeben. Ergebnis ist also immer NAME. Darauf tippe ich jetzt mal so.
 
Zuletzt bearbeitet:
Da unterscheiden sich die RDBMS:

SQLServer verhält sich so, das er das Resultset fetcht und eine Liste der Angestellten der Firma Sonnenschein AG erstellt. Vorausgesetzt die Liste ist kleiner als 8000 Zeichen.

Oracle gibt nur einen einzigen Namen aus, scheint also nicht das Resultset zu fetchen.

Jetzt hätte mich interessiert, wie MySQL darauf reagiert.
 
Interessant. Eigentlich weiß ich gar nicht wie überhaupt irgendein DBMS darauf reagiert, wenn die Abfrage mehr als ein Tupel liefert und du das in eine einzige Variable speichern willst. Das muss ich mal mit Postgres probieren. Entweder er nimmt das letzte Tupel (weil die vorherigen werden durchgehend überschrieben) oder er schmeißt einen Error. Ich persönlich würde letzteres logisch finden.
 
Von der Logik her darf eigentlich nicht das Tupel überschrieben werden, weil es mit der Variablen concatiert wird. Auf die Art kann ich bei SQLServer Listen bilden ohne müßelig einen Cursor zu verwenden. Macht sich gut bei Stored Procedures. Oracle scheint den Leerstring als alternativen Wert (das NVL), wie ein NULL zu interpretieren und überschreibt somit das Tupel. Weil bei SQLServer und Oracle gilt: NULL || 'xyz' = NULL. Deswegen auch das ISNULL (SQLServer) bzw. NVL (Oracle).

Probiers mal bei Postgres aus, mal sehen was dabei rauskommt. Ich werde mal bei Oracle statt des Leerstrings einfach ein Space Zeichen verwenden. Dann wird sich zeigen ob Oracle immer noch eine - in meinen Augen - Fehlinterpretation des SELECTS macht.

Grüße Rossibaer

PS: Warum sollte das DBMS einen Error raisen? Es ist ein gültiges SELECT Statement. Eben nur das der Inhalt in eine Variable geschrieben wird. Sowohl Oracle als auch SQLServer haben kein Problem damit und führen es ohne Fehler aus. Es ist nur das Resultat, wo die beiden sich unterscheiden. In T-SQL (SQLServer) bzw. PL/SQL (Oracle) sind SELECT INTO erlaubt und auch notwendig. Sonst wirst du keine gescheite StoredFunction bzw. StoredProcedure schreiben können...
 
Zuletzt bearbeitet:
Naja, wir haben eine Variable, die einen Wert aufnehmen kann. Die Abfrage liefert aber eine Menge. Ich kann spontan nicht vorhersagen, was da passiert. Aber ich prüfe das mal.

Nachtrag: Wir lagen beide falsch: Postgres nimmt das erste Tupel. Beispiel:

Code:
DECLARE
	lala character varying;
BEGIN
	SELECT COALESCE(lala, '') || doof INTO lala FROM testtabelle ORDER BY doof;
	RETURN lala;
END;

Tabelle hat nur eine Spalte "doof" vom Typ character varying (varchar). Drei Datensätze 'a', 'b' und 'c'. Ausgabe der Funktion (in Postgres gibt es nur Funktionen) ist 'a'.


Nachtrag 2:

Das steht auch so in der PostgreSQL-Doku: "If STRICT is not specified in the INTO clause, then target will be set to the first row returned by the query".

Mit "STRICT" hatte ich mit meiner vorherigen Annahme recht, dass ein Error geschmissen wird:
Code:
DECLARE
	lala character varying;
BEGIN
	SELECT COALESCE(lala, '') || doof INTO STRICT lala FROM testtabelle ORDER BY doof;
	RETURN lala;
END;

Ausgabe: "FEHLER: Anfrage gab mehr als eine Zeile zurück"
 
Zuletzt bearbeitet:
Dann werde ich mir das mit Oracle mal schenken. Mich hätte zwar noch das Pendant in MySQL interessiert, aber es ist auch so ausreichend. Fakt ist das sich da die DBMS unterschiedlich verhalten, Oracle ähnelt da Postgres. Meine Vermutung, aufgrund der engen Verwandschaft von Sybase zu SqlServer, wäre, das Sybase wie SqlServer handelt. Danke trotzdem und nen schöner Sonntagabend.
 
Übrigens, hab's jetzt hinbekommen. Hier ein Beispiel
Code:
SELECT
 CON.*,
 CAT.cat_title AS content_cat_title,
 USER.user_name,
 (SELECT scat.cat_title FROM oa_category AS scat WHERE scat.cat_id = CON.content_scat_id) AS content_scat_title 
FROM 
 `oa_content` AS CON,
 `oa_category` AS CAT,
 `oa_user` AS USER
 WHERE CAT.cat_title = 'Online Arts' AND CON.content_scat_id = '3' 
 AND 
 CON.`content_visibility` = '1' AND
 CON.`content_author` = USER.user_id AND
 CON.`content_cat_id` = CAT.cat_id 
ORDER BY 
 content_time DESC, 
 content_id DESC LIMIT 1

Für die Unordnung entschuldige ich mich, ist ein PHP-generierte Query.

PS: Somit steht der "Kern" meines CMS (Verion 6 jetzt) fast stabil fertig dar :D
 
Zurück
Oben