Zum Inhalt springen

dr.dimitri

Mitglieder
  • Gesamte Inhalte

    1276
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von dr.dimitri

  1. Hier sollte eigentlich alles zu finden sein, was für die Beantwortung nötig ist: SQL ? Wikipedia Dim
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. Stimmt, das ist noch ein Überbleibsel von meinem Test Hat den X (ihr habt Tabellennamen...) eine Spalte namens artikel_nr? Dim
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Indem Du die Spalte eben noch ins GROUP BY aufnimmst. Alle Spalten, die nicht in einer Aggregatsfunktion sind, müssen ins GROUP BY. Dim
  18. 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
  19. 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
  20. 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
  21. 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
  22. dr.dimitri

    eFa

    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
  23. 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.
  24. Hi, als Alternative könntest Du eine View anlegen, die die Berechnungen beinhaltet. Dim

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...