
dr.dimitri
Mitglieder-
Gesamte Inhalte
1276 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Alle Inhalte von dr.dimitri
-
Crystal Reports XI - zeichnen von Diagrammen mit kumulierten Werten
dr.dimitri antwortete auf Ofenrohr's Thema in Datenbanken
:uli Dim -
Hier sollte eigentlich alles zu finden sein, was für die Beantwortung nötig ist: SQL ? Wikipedia Dim
-
Unter Oracle ja, das SQL muss nur eingeklammert werden: select nvl(spalte,(select ....))as bezeichnung ... Die Abfrage darf nur eine Zeile zurückgeben, ansonsten geht's natürlich nicht. Du kannst z.B. auch sowas machen: SELECT CASE spalte WHEN 'ABC' THEN (select ...) WHEN 'XYZ' THEN (select ...) ELSE 'Nix geht mehr' END AS spaltenname FROM tabelle Dim
-
Da wär mir noch keiner Untergekommen. Einzig, dass man oft benutzte Daten cached um nicht mehr auf die DB zugreifen zu müssen (bedingt natürlich auch, dass es sich um statische Daten handelt). Wenn du das gemeint hast, hab ich das falsch verstanden, andernfalls liegt das Problem meistens in der Art und Weise wie der Join geschrieben ist, ob die Statistiken korrekt sind etc. Nein Du frägst im SQL selbst ab: SELECT ...NVL(evtl_null_spalte,'Wert der bei NULL zurückgegeben werden soll'),... Dim
-
So würde ich das machen. Damit bist Du auch flexibel, wenn es mal eine weitere Sprache geben soll. Ganz zu schweigen von Volltextindizierungen etc. die evtl noch benötigt werden. Allerdings solltest Du dann die Felder Artikelbezeichnung und Bezeichnung aus den entsprechenden Tabellen entfernen - dafür sind ja die _lang tabellen vorgesehen. Jaja die alte Legende, dass die Anwendung besser und schneller joint als die Datenbank :old In einem Inner Join würde dieser Artikel nicht geliefert werden, bei einem Outer Join kann man auf NULL abfragen und dann darauf reagieren. Warum sollte man hier mit einer SP arbeiten? Dim
-
Das wichtigste Argument wurde doch wohl vom OP schon selbst genannt: Wenn ich mich also sowieso mit dieser Sprache beschäftigen muss, dann wäre es doch schlau auch mit dieser zu arbeiten. Das kann man durchaus auch so schreiben: [...]wären sowohl C++, C##, was auch immer, geeignet gewesen, ich habe mich aber für Java entschieden, weil ich damit bereits Erfahrungen sammeln konnte und diese Sprache auch zukünftig von mir verwendet werden wird[...] So in etwa. Dim
-
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Diesr Update würde fehlschlagen, wenn das select mehr als eine Zeile liefert. Über die Joinbedingung: ON (src.PAWS_ARTIKEL_NR = dest.PAWS_ARTIKEL_NR) Hier werden die beiden Mengen gemachted - bedeutet implizit natürlich, dass artikel_nr ein passender Zugriffsschlüssel sein muss (=eindeutig). Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
SQL ist grundsätzlich immer mengenorientiert. In einem Statement können also 10 oder auch 10 Mrd Sätze geändert werden. Naja Du kannst ja mal die Oracle Entwickler fragen Grundsätzlich wäre das aber schlechter Stil, denn was passiert, wenn die beiden Tabellen plötzlich nicht mehr identisch sind? Was passiert wenn die Spalten unterschiedliche Reihenfolgen haben aber rein technisch zueinander passen würden? Man kann auch in einem Programm alle Variablen a1 a2 a3 etc. nennen aber man macht es nicht. Und der MERGE Befehl erlaubt es eben nicht einmal, sondern Du musst explizit angeben welche Spalte in welche geschrieben werden soll. Macht das ganze übersichtlicher und sicherer auch wenns erst mal ein bissl mehr Schreibarbeit ist. Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Na du kannst ja auch in Oracle mit C/C++ programmieren. Mach nur nicht den fatalen Fehler, Aufgaben die man besser mit reinem SQL erledigt mit PL/SQL oder C nachzuprogrammieren. Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Ach verd... ist ja dynamisches SQL. Alles was mit : beginnt, wird als Bindvariable angesehen, die mit einem Wert in der USING Klausel gefüllt werden muss. USING ist Teil von execute immediate und kann daher nicht generiert wird. Mein Rat: Hau den ganzen Schmarrn aus dem Trigger raus und logge statt dessen nur den PK in eine Zwischentabelle. Dann legst Du dir per dbms_scheduler einen Job an, der, sagen wir alle 5 Sekunden läuft und eine PL/SQL Prozedur aufruft. Diese Prodezur setzt die Session zuerst in den serializable mode und kopiert anschließend anhand der gespeicherten PKs die Werte aus der Originaltabelle in die anderen Tabellen. Danach löscht Du die Zwischentabelle und das Spiel beginnt von vorne. Das hat den Vorteil, dass es a) einfacher und für den User viel schneller ist, da das Kopieren asynchron läuft. Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
In PL/SQL kann ein VARCHAR2 32767 Byte lang sein (nicht nur 4000 wie in SQL). Selbst wenn deine 200 Spalten die maximal zulässige Länge hätten, würdest nicht mal in die Nähe dieser Obergrenze kommen. Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Stimmt, das ist noch ein Überbleibsel von meinem Test Hat den X (ihr habt Tabellennamen...) eine Spalte namens artikel_nr? Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Naja, dann generierst dir das Statement eben declare l_stmt varchar2(5000); l_columns varchar2(2400); l_insertColumns varchar2(2400); begin l_stmt:='MERGE INTO ###TAB### a USING(SELECT '; for i in(select column_name from user_tab_cols where table_name='X' order by column_id) loop l_columns:=l_columns||':new.'||i.column_name||','; l_insertColumns:=l_insertColumns||'b.'||i.column_name||','; end loop; l_columns:=substr(l_columns,1,length(l_columns)-1); --Letztes , abschneiden. l_insertColumns:=substr(l_insertColumns,1,length(l_insertColumns)-1); --Letztes , abschneiden. l_stmt:=l_stmt||l_columns||' FROM src) b ON(a.artikel_nr=b.artikel_nr) WHEN NOT MATCHED THEN INSERT VALUES('||l_insertColumns||')'; dbms_output.put_line(l_stmt); --Nur zu Testzwecken ausgeben execute immediate replace(l_stmt,'###TAB###','A'); execute immediate replace(l_stmt,'###TAB###','S'); execute immediate replace(l_stmt,'###TAB###','D'); end; / Allerdings wird das auf einem stark ausgelastetem System sicherlich nicht zu Geschwindgkeitsrekorden führen. Eine Möglichkeit wäre noch, dass man das SQL einmalig generiert und dann in einer Tabelle abspeichert. Bei Strukturänderungen muss das natürlich nachgezogen werden. Richtig. ORA-04091 table XY is mutating, trigger/function may not see it. Damit verhindert Oracle, dass Du in eine noch nicht fertige Transaktion hinsiehst. Oracle garantiert nämlich, dass eine Transaktion atomar ist, sie also ganz oder garnicht durchgeführt wird. Selektierst Du in einem Trigger auf die Tabelle die zu dem Trigger gehört, dann würdest Du quasi einen Zwischenstand sehen, der aber nicht sichtbar sein darf - daher dieser Fehler. Dim -
Oracle 10g: via Trigger elegant mehrere Insert auslösen
dr.dimitri antwortete auf dexit2k's Thema in Datenbanken
Hi, ich würde von dem Triggeransatz weggehen, denn es ist im allgemeinen schlechter Stil fachliche Logik in einem Trigger zu verstecken. Wenn es nicht anders geht, dann würde ich es (exemplarisch) so machen: MERGE INTO A USING (SELECT :new.spalte1,:new.spalte2,... FROM DUAL) sub ON(a.artikel_nr=sub.spalteX) WHEN NOT MATCHED THEN INSERT INTO A (spalte1,spalte2,...) VALUES(sub.spalte1,sub.spalte2,...) Eine Referenz und Cursur sind nicht identisch. Ein Cursor ist eine Ergebnismenge, eine gefüllte Datenstruktur. new und old sind Strukturen, die nur in Triggern verfügbar sind und den Zugriff auf die entsprechenden Datensatz ermöglichen. Damit bist Du jedoch in PL/SQL (die prozedurale Programmiersprache). Du kannst das nicht einfach so mit SQL (die mengenorientierte Abfragesprache) verbinden. Du programmierst in PL/SQL In SQL kann man ebensowenig programmieren wie in HTML Dim -
Das alleine ist aber nicht entscheidend. In einem ER-Modell hat jede Entität ob stark oder schwach einen eigenen PK - ansonsten wäre sie nicht eindeutig identifizierbar. Theoretisch ja, praktisch ist es natürlich so, dass Hotel A Zimmer von 1-100 hat und Hotel B evtl. auch Zimmer von 1-100. Daher der PK. Grundsätzlich ja - sofern ein Hotel mehreren Hotelketten angehören kann. In der Praxis wirst Du die Begriffe starke und schwache Relation jedoch kaum finden (außer ein hauptsächlich in der Theorie tätiger Professor hat das ER Modell entworfen und damit für diverse Probleme gesorgt...). In einem ER Modell wirst Du mit konkreten Beziehungen zu tun haben (eine Hotelkette hat ein oder mehrere Hotels, ein Hotel gehört zu einer Kette und hat mehrere Zimmer, ein Zimmer gehört zu einem Hotel). Dim
-
Also auf den Beweis bin ich jetzt mal gespannt aber Du darfst mich gern überraschen. Bevor Du anfängst, solltest Du jedoch wissen, dass Oracle das Datum als 7 Byte langen Binärwert speichert - man könnte also sagen, dass das einer Zahl gar nicht mal so unähnlich wäre:D Daher speichere ein Datum als Datum und eine Zahl als Zahl ab. Warum denkst Du gibts den Datentyp? Weil er langsamer ist? :cool: Genau falsch rum. Wenn das Feld ein DATE ist, dann suchst Du auch nach einem DATE. Etwa so: WHERE datum between to_date('01.01.2009','DD.MM.YYYY') and to_date('31.01.2009','DD.MM.YYYY') Damit hat der Optimizer eine viel genauere Vorstellung was Du denn eigentlich haben möchtest und kann dies in seine Berechnungen für den Zugriffsplan mit einbeziehen. Keinesfalls solltest Du das Datumsfeld mit to_char in einen String umwandeln! Dim
-
Hi, also mir ist da schon was aufgefallen: WHERE JAHR = %VAR1 AND MONAT = %VAR2 In Oracle gibt es den Datentyp DATE, den man dafür verwenden soll. Die Anzahl der Datensätze ist nicht unbedingt verantwortlich für die Laufzeit. Wichtig wäre zu sehen, welche Statements denn Probleme macht und natürlich auch den richtigen Datentyp verwenden. Wieviel Daten selektiert denn ein typisches SQL aus dieser Tabelle? Dim
-
Indem Du die Spalte eben noch ins GROUP BY aufnimmst. Alle Spalten, die nicht in einer Aggregatsfunktion sind, müssen ins GROUP BY. Dim
-
Die Spalte heißt nicht mehr Preis, sondern sum(l.preis) (siehst Du auch, wenn Du das SQL einfach mal so ausführst). Um das zu ändern, vergibst Du einfach einen Spaltenalias: SELECT k.vorname, sum(l.preis) [b]AS preis[/b] Dim
-
Hmm ich tipp mal auf Oracle, zumindest die Syntax würde passen. Was du machen möchtest nennt sich korrelierte Unterabfrage (oder correlated subquery). Dafür brauchst aber kein zusätzliches SELECT, das geht so: UPDATE tabelle1 t1 set t1.Spalte1 = (SELECT t2.spaltePK FROM tabelle2 t2 WHERE t2.Spalte1 =t1.spalte3); Damit werden alle zusammengehörigen Sätze upgedatet (vorausgesetzt t2.spalte2 und t1.spalte3 ergeben immer maximal einen Satz als Ergebnis). Nicht gefundene Sätze werden auf NULL gesetzt, da Du keine WHERE Bedingung im Update Statement selbst hast. Dim
-
Hi, du kannst BLOB Felder nicht in normalen SQL Abfragen verwenden. Dort kann ja neben den dir beschriebenen Textdateien auch ein Worddokument, ein Bild oder eine komplette DVD drinnen liegen - wie sollte das angezeigt werden? Um einen LOB zu lesen und zu schreiben werden Streams verwendet. Hier findest Du einige Beispiele dafür. Dim
-
Unterschied(e) einer XML-DB zu einem RDBMS ?
dr.dimitri antwortete auf wimpus's Thema in Datenbanken
Hi, also ich hab dieses pdf hier gefunden (der 2. Link in google mit dem Suchstring xmldb difference rdbms - der 1. Treffer ist dieser Thread hier ) Dim -
Also auf so eine unspezifische Frage hier mal eine unspezifische Antwort: www.javabuch.de - Das Handbuch der Java-Programmierung Galileo Computing :: Java ist auch eine Insel (8. Auflage) damit kann man im übrigen auch Steuerberatungsprogramme machen, Atombombenexplosionen berechnen oder was weiß ich noch. Dim
-
Berechnungs- Ausführung / Einbindung in einem Feld innerhalb von MyAdmin
dr.dimitri antwortete auf grünschnabel's Thema in Datenbanken
Nein, Berechnungen kannst Du ohne Probleme in Dein SELECT einbauen. Damit sind deine Daten immer aktuell und Du brauchst auch keine Kapriolen in php zu drehen. Dim PS: Lass die Backticks (`) um die Spaltennamen weg - die brauchst Du nicht. -
Berechnungs- Ausführung / Einbindung in einem Feld innerhalb von MyAdmin
dr.dimitri antwortete auf grünschnabel's Thema in Datenbanken
Hi, als Alternative könntest Du eine View anlegen, die die Berechnungen beinhaltet. Dim