dr.dimitri
-
Gesamte Inhalte
1.276 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Beiträge von dr.dimitri
-
-
Die OR Bedingung ist nicht richtig. Je nach DB wird nach einem Leerstring gesucht oder nach NULL. Da NULL nie gleich einem bestimmten Wert ist, hilft das hier nicht weiter.
Die einfachste Möglichkeit ist, die WHERE Bedingung wegzulassen. Sprich bei einem fehlenden Parameter ein zweites, passendes SQL aufzurufen.
Dim
-
Hi,
Wissen, sofern es korrekt ist, schadet nie.
Insofern würde ich dir empfehlen, installier dir auf deinem PC die Oracle 11 XE Datenbank
Oracle Database Express Edition 11g Release 2
bezüglich ADF findest Du hier einen guten Einstieg:
Oracle Application Development Framework - Oracle ADF
Bezüglich der Oracledatenbank selbst sind die Bücher von Tom Kyte sehr lesenswert.
Da zu sitzen und auf die Schulung zu warten ist eine Möglichkeit, selbst Wissen anzusammeln (besonders wenn es sich um so ein Interessantes Thema handelt) ist besser.
Dim
-
Hi,
so eine Ausgabe würde ich in zwei Schritten realisieren.
Zum einen die betreffenden Bandnamen sotiert selektieren und anschließend pro Bandname die zugehörigen Alben ebenfalls sortiert selektieren.
D.h. du hast zwei Schleifen: Eine äußere über die Bandnamen und die innere über die zugehörigen Alben.
Dim
-
Dein SQL liefert sicherlich nicht die Ausgabe, die Du gepostet hast. Du selektierts eine ID und Edition_ID postest aber mit Semikolon getrennte Bandnamen?
Aber wenn man sich das oft genug durchließt, kommt man irgendwie drauf, was Du haben möchtest und was du momentan machst.
Du möchtest nicht nur Sortieren, sondern auch Pivotieren (und nicht gruppieren) und zwar innerhalb einer Sammlung alle Alben in einer Zeile alphabetisch. Ich weiß nicht, ob das in mysql per Befehl möglich ist, dazu kenne ich die DB zu wenig.
Dim
-
Was genau passt dann nicht? Wie soll die Sortierung aussehen (Beispiel) und wie sieht das SQL momentan aus?
-
Hi,
typisch mysql. Die GROUP BY Klausel ist falsch, mysql meldet das aber nicht. Jedes Feld, dass im SELECT nicht in einer Aggregatsfunktion (COUNT,MAX,MIN,SUM etc)hinterlegt wird, muss in die GROUP BY Klausel. Jede andere DB würde dein Statement nicht ausführen.
Dim
-
Das stimmt, ich meine mich z.B. bei Postgres daran erinnern zu können, dass man aus einer Prozedure auch mit anderen aktuell laufenden Sessions Daten austauschen kann, also so etwas wie ein Semaphor. Wenn man das nimmt, dann könnte man eben prüfen, ob eine andere Session kollidieren würde. Aber das nur so am Rande
Vermutlich so etwas ähnliches wie DBMS_PIPE in Oracle. Aber da ist mir der Unique Constraint doch lieber
-
Bei Postgres sind Prozedure automatisch atomar und wenn man sie nochmals in eine Transaktion packt, dann laufen sie im Kontext der Transaktion
Mir ging es hier insbesondere um Multiuserzugriffe. Sprich Session A fügt die Zahl 100 ein, hat aber noch nicht comittet, Session B prüft, ob die Zahl 100 schon vorhanden ist und bekommt eine leere Menge zurück, fügt sie also auch ein. Nachdem beide Sessions comittet haben steht zweimal die Zahl 100 drinnen.
Daher der "Lösungsansatz" mit dem exklusiven Sperren der Tabelle, dann kann nur eine Session in der Tabelle ändern, die anderen müssen warten. Ist natürlich nicht praktikabel aber zumindest eine (rein) theoretische Lösung.
Dim
-
Das geht nur, wenn der Datensatz eindeutig ist und ist dann auch die erste Wahl, wenn aber eine Teilmenge betrachtet werden soll, dann bietet sich ein Trigger an.
Vgl: Der Trigger soll gucken, ob der Integerwert den die Prozedur übergeben bekommen hat, bereits vorhanden ist.
Wo ist da eine Teilmenge? Und nachsehen, ob eine Zahl schon vorhanden ist, hört sich ganz verdächtig nach "Eindeutigkeit" an.
Des weiteren sieht ein Trigger keine offenen Transaktionen und kann daher nicht prüfen, ob die Zahl wirklich nicht schon eingefügt wurde, aber der Commit noch nicht durch ist. Verwendet man einen Dirty read (ist per Definition aber schon ein Bug in jeder DB Anwendung und daher auch nicht in allen Datenbanken verfügbar), dann kann man nicht sicher sein, ob die Zahl vielleicht nicht per Rollback wieder verschwindet und man aber einen schon vorhandenen Wert ermittelt hat, der jetzt aber nicht mehr da ist.
Die einzigen, sauberen (=fehlerfreien) Möglichkeiten sind:
* Serialisieren des Zugriffs, sprich exclusives sperren der Tabelle, dann in der Prozedur per SQL nachsehen, ob der Wert schon vorhanden ist. Warum hier überhaupt ein Trigger verwendet werden soll ist mir eh nicht klar, ebensowenig, ob man den Zugriff serialisieren möchte. Vermutlich eher nicht
* Verwenden eines Unique Constraints und die DB ihren Job machen lassen.
Andere "Methoden" führen, auch bei Teilmengen, dazu, dass der Datenstand bei bestimmten Konstellationen fachlich inkonsistent werden kann und vermutlich auch wird.
Dim
-
Hi,
leg einen Unique Constraint auf die Spalte und die DB erledigt das für dich. Das in einem Trigger zu erledigen ist ein klarer Bug im Anwendungsdesign und kann doppelten Einträgen führen.
Den Fehler, den die DB bei einem doppelten Wert erzeugt kannst Du dann in der Prozedur abfangen.
Dim
-
Hi,
ist auch die Ländereinstellung auf dem Client korrekt gesetzt? Also NLS_LANG=German_Germany.AL32UTF8
Dim
-
Da nur Oracle weiß, wieviele Duplikate es auf einem Block gibt, wirst Du dieses Package verwenden müssen.
Bei kleinen Tabellen bringt das eh nicht viel, und bei großen gibt mit dem Package kein Problem.
Dim
-
Hi,
was hat sich seit damals geändert? http://www.fachinformatiker.de/datenbanken/152977-dbms_compression-get_compression_ratio.html
Dim
-
Hi,
ich kann nur sagen, dass es aus meiner Sicht mehrere Punkte gibt:
(1) Etwas Glück. Man muss zur richtigen Zeit am richtigen Ort mit den richtigen Chefs sein.
(2) Positiv Auffallen. Wer in der Masse untergeht, nur Anweisungen umsetzt und brav seinen Job macht, wird nichts riskieren aber auch nicht viel gewinnen.
(3) Eigeninitiative. Wenn man etwas verbessern kann, dann soll man es auch tun. Absprechen, klären, umsetzen. Nicht drauf warten, dass es ein anderer macht. Siehe auch den vorhergehenden Punkt.
(4) Verantwortung übernehmen. Wenn man für eine bestimmte Anwendung bzw. Anwendungsteil ein kompetenter Ansprechpartner ist, werden auch die Punkte 2 und 3 leichter.
(5) Besser sein als die anderen. Such dir ein bestimmtes Gebiert, dass sich interessiert und idealerweise mit (4) zusammenhängt und werde darin besser als andere - wirklich besser, nicht nur schlau reden. Der 10. Java Entwickler im Team ist schön und gut, aber der Kollege, der sich perfekt mit security, Datenbanken etc. auskennt wird sich auch mit Punkt (2) leichter tun.
(6) Eigeninitiative und Verlässlichkeit. Die richtige Mischung aus Teamfähigkeit und Eigeninitiative ist Gold wert. Jeder Chef, der bereit ist gute Leistung entsprechend zu honorieren, ist um jeden Mitarbeiter froh, den man nicht alles vorkauen muss, sondern der macht und zwar so, dass es passt.
Wenn das alles nichts hilft, muss man über geeignete Maßnahmen dem Punkt (1) etwas auf die Sprünge helfen.
Dim
-
:upps Recht viel eindeutiger kann eine Meldung aber nicht sein oder? Die Ersparniss bei 109 Zeilen kann ich dir auch so sagen: Nix.
Weißt Du denn, wie die Kompression in Oracle funktioniert? OLTP Compression ist übrigens lizenzpflichtig falls Du die verwenden möchtest.
Dim
-
Desweiteren wär ich auch jedem dankbar, der mir einen Tipp geben kann, was ich beruflich machen könnte, ohne sich jetzt mit einem Hungerlohn rumärgern zu müssen. Dazu muss ich sagen, dass ich nicht handwerklich begabt, oder ein Verkäufertyp bin.
Was kannst Du denn? Mal von handwerklichen Dingen und Verkäufertätigkeiten abgesehen?
Dim
-
Richtig. Wenn Du keinen Zieltablespace angiebst, wird Tabelle innerhalb des momentanen Tablesapce verschoben und evtl. freier Platz in diesem Zuge wieder freigegeben.
Dim
-
Hi,
vermutlich liegt die Tabelle auf einem Tablespace mit manuellem Spacemanagement (=mittelalterlich).
alter table xyz move sollte funktionieren.
Dim
PS: analyze sollte nicht mehr verwendet werden. Als Ersatz gibt es das DBMS_STATS Packages
-
Von der Normalisierung abgesehen fällt sofort auf, dass die Tabellen Kunde und Bücher (man sollte sich durchgängig für Singular oder Plural entscheiden) einen fachlichen Wert als PrimaryKey verwenden. das mag vielleicht theoretisch ok sein, in der Praxis ist das häufig eine fatale Fehlentscheidung, da sich fachliche Werte im Laufe der Zeit auch ändern können. Daher niemals einen fachlichen Wert als PK verwenden.
-
Schon klar, aber bisher nimmt man anscheinen noch gar nichts Zumindest steht davon nichts im Projektantrag.
-
Hi,
vielleicht per Oracle Application Express und einer Oracle XE Datenbank.
Oracle Database Express Edition 11g Release 2
und
Damit kannst Du dir die Oberfläche relativ einfach erstellen, fachliche Logik wird dann als PL/SQL in der Datenbank abgelegt.
Mit welchen Programmiersprachen hast Du denn schon intensiver gearbeitet?
Dim
-
Die Emailadresse hat damit gar nichts zu tun. Die DB Software die du runtergeladen hast, ist 1:1 die, die Du auch bekommst, wenn Du sie kaufst.
Die Standarduser sind system und sys. Mit denen kannst Du dich via sqldeveloper anmelden und mittels create user (vgl. auch die Oracle Doku) dann deine benötigten User anlegen.
-
Was genau hast Du denn gemacht, nachdem Du die Software runtergeladen hast?
-
Aber wenn du sagst, dass es Oracle zum Download gibt (hoffe doch kostenfrei, da ich momentan kein Geld für Sonderausgaben habe), dann werde ich das einfach mal in Angriff nehmen und es direkt über Oracle bauen und dann einfach nur noch importieren... :D;)
otn.oracle.com Lediglich eine Registrierung ist nötig.
Dim
SQL: Wenn WHERE-Klausel kein Ergebnis liefert alle Daten ausgeben
in Datenbanken
Geschrieben
Dim