Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Ansi-Join provoziert Fehler (https://www.delphipraxis.net/178995-ansi-join-provoziert-fehler.html)

p80286 7. Feb 2014 11:31

Datenbank: oracle • Version: 11 • Zugriff über: egal(?)

Ansi-Join provoziert Fehler
 
Hallo zusammen

hier ist ja schon öfter mal über ANSI-Joins Ja oder Nein diskutiert worden, mit folgender Abfrage habe ich dann folgenden Fehler provozieren können:
Code:
select tab1.Feld1,tab2.Feld2,Tab3.*
from tab1 join tab2 using (idkey)
          join tab3 on (tab2.seckey=tab3.objectkey)
where ....
Zitat:

Im Projekt XXX ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 4440F60B in Modul 'OraOLEDBrst11.dll'. Lesen von Adresse ABABABAB' aufgetreten.
Wohlgemerkt, es kommt keine ORACLE-Fehlermeldung, das ein Qualifier nicht genutzt werden darf.

denn
Code:
select tab1.Feld1,tab2.Feld2,Tab3.Felda
from tab1 join tab2 using (idkey)
          join tab3 on (tab2.seckey=tab3.objectkey)
where ....
funktioniert dann wieder.

Joint man nach "alter Väter Sitte"
Code:
select tab1.Feld1,tab2.Feld2,Tab3.*
from tab1,tab2,tab3
where tab1.idkey=tab2.idkey
  and tab2.seckey=tab3.objectkey
  and ....
gibt es keine Probleme und Fehlermeldungen.

Gruß
K-H

mkinzler 7. Feb 2014 11:36

AW: Ansi-Join provoziert Fehler
 
Sieht nach einem Fehler im OleDB-Treiber aus.

Medium 7. Feb 2014 11:47

AW: Ansi-Join provoziert Fehler
 
Die Adresse ABABABAB klingt mir auch stark nach einer "Magic" Adresse, die einen (als unmöglich auftretend gedachten) Fehler leichter auffindbar machen soll. Hat man früher zumindest gerne mal gemacht so. Da scheint wirklich was in der DLL struppig zu sein.

p80286 7. Feb 2014 12:12

AW: Ansi-Join provoziert Fehler
 
Vergiss die Adresse, bei drei Aufrufen war sie dreimal anders.
Wo zum .. kommt die DLL her? Tante G hat da nichts erhellendes gebracht, nur die üblichen Besserwisserseiten.

Gruß
K-H

jobo 7. Feb 2014 15:07

AW: Ansi-Join provoziert Fehler
 
Meine Theorie ist:
- offensichtlich kein "ORA-" Fehler, also ein Treiberproblem (OLEDB)
- Die Joinvarianten, die Du produzierst, sind nur der Auslöser, da sie
- vermutlich durch andere Ausführungspläne bzw. in einem Fall anderes Select Statement
-> andere Daten ausspucken
Da liegt dann der Hase im Pfeffer.
Der Treiber hat ein Problem mit den Daten.

Typischerweise sind das Date Werte vor Christi Geburt usw.

Vielleicht kannst Du das durch eingrenzen des selects nachvollziehen. Es müsste demzufolge ein Single Table Select reichen (ohne Join) um das Problem zu reproduzieren. (wenn man die fehlerhaften Daten erwischt)

Seit ich auf Oracle OLEDB umgestiegen bin (glaub aktuell Version 11.2 bei mir) hab ich sowas (Treiberprobleme mit Dateninhalten) allerdings nicht mehr erlebt.

P.S.: Hab grad erst die "OraOLEDBrst11.dll" im Post endeckt. Also 11er Oracle OLEDB Client?
Ist schon etwas her, aber ich erinner mich, dass ich "damals" den Instant Client 11.2 vorinstalliert habe und den OLEDB Teil aus den älteren "ODAC" Komponenten nachinstalliert. Um eben halt so aktuell wie möglich zu sein. Mittlerweile dürfte es ja wesentlich aktuellere Treiber geben.

mikhal 7. Feb 2014 15:14

AW: Ansi-Join provoziert Fehler
 
Vielleicht hilft dir das weiter:

http://www.pcmaxutilities.com/wikidl...fix-guide.html

Grüße
Mikhal

p80286 7. Feb 2014 15:17

AW: Ansi-Join provoziert Fehler
 
Nee die Datenwerte aus der Steinzeit hab ich auch schon mal gehabt, das ist es nicht.
Es liegt einzig an dem "select Tab3.*" be dem ein Feld aus Using mit ausgegeben wird (werden sollte)
bloß gibts dann normalerweise einen richtigen ORA.Fehler.

Gruß
K-H

Jumpy 7. Feb 2014 15:51

AW: Ansi-Join provoziert Fehler
 
Und was ist wenn "using(idkey)" durch "on tab1.idkey=tab2.idkey" ersetzt wird?

jobo 7. Feb 2014 15:58

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1247095)
Nee die Datenwerte aus der Steinzeit hab ich auch schon mal gehabt, das ist es nicht.
Es liegt einzig an dem "select Tab3.*" be dem ein Feld aus Using mit ausgegeben wird (werden sollte)
bloß gibts dann normalerweise einen richtigen ORA.Fehler.

Gruß
K-H

Wenn Du das schon weißt, was ist dann die Frage?
Das Tab3.* hat mit dem using eigentlich nichts zu tun, denn das using bezieht sich auf den Join von tab1 und tab2, während tab3 einen expliziten "on " Join hat (und das Asterisks gemurkse vom using nicht relevant sein dürfte). Daher dürften die komischen Feld Selektor Alias Automatismen (ich find sowas furchtbar) nicht greifen. Hat aber vielleicht irgendjemand bei Oracle selbst nicht verstanden und falsch programmiert. :)
Aber vielleicht hab ich es auch nicht verstanden :)

@Mikal: Ist das etwa Humor hier in der DP?!

Bernhard Geyer 7. Feb 2014 18:18

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1247095)
Nee die Datenwerte aus der Steinzeit hab ich auch schon mal gehabt, das ist es nicht.
Es liegt einzig an dem "select Tab3.*" be dem ein Feld aus Using mit ausgegeben wird (werden sollte)
bloß gibts dann normalerweise einen richtigen ORA.Fehler.

Bei Oracle sollte man mit allem rechnen!
Während meiner Studienzeit hat es ein Mitkommilitone geschafft durch eine Select-Anweisung das ganz Uni-Netz lahm zu legen (ok, der Server auf dem die Oracle-DB lag war nicht nur DB-Server).

jobo 7. Feb 2014 18:58

AW: Ansi-Join provoziert Fehler
 
@Bernhard: Hast Du eigentlich irgendeinen Schwur gegen Oracle geleistet? Waren "sie" böse zu Dir?
Wie lang ist das her mit dem Studienkollegen?

Man braucht nur einen Join zu vergessen und die Datenbank permutiert durch die Gegend, da muss jede Datenbank ackern.

Bernhard Geyer 7. Feb 2014 19:44

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von jobo (Beitrag 1247127)
@Bernhard: Hast Du eigentlich irgendeinen Schwur gegen Oracle geleistet? Waren "sie" böse zu Dir?
Wie lang ist das her mit dem Studienkollegen?

Dieser Fehler: ca. 20 Jahre
Zitat:

Zitat von jobo (Beitrag 1247127)
Man braucht nur einen Join zu vergessen und die Datenbank permutiert durch die Gegend, da muss jede Datenbank ackern.

Bei jeder verfünftigen DB killt man einfach den Prozess der das Problem verursacht und gut ist. Nicht so hier bei Oracle.

Und einen "schwur" braucht man bei Oracle nicht. So oft wie man schon bei Oracle unnachvollziehbare Performanceprobleme hat. Ab und zu bringt es wenn der Server eh durch eine neuere Version aktualsiert werden. Ab und zu muss man praktisch den DB-Inhalt rauspumpen und die DB platt machen bis es wieder geht. Das erschreckende ist auch öfter das die Oracle-Admin (die sich oft als die Elite der DB-Admins ansieht) absolut kein Fachwissen von DB-Interne und gerade noch ihre Standardreports abrufen können die sie bei ihren nicht gerade billigen Oracle-DB-Schulungen durchgenommen haben.

jobo 8. Feb 2014 08:18

AW: Ansi-Join provoziert Fehler
 
20 Jahre! Da erübrigt sich eigentlich jeder Kommentar.
Dennoch, rechne ca. 10 Jahre drauf, zu der Zeit haben MS SQL Anwendung noch Probleme mit Rowlevel Locking gehabt.

Man braucht da auch gar nicht über verschiedene Anbieter die Nase zu rümpfen. Es reicht falsche Transaktionsverwaltung in der Anwendung und keine DB hat ne Chance, das ist mit Sicherheit kein Admin Problem.
Die Art und Weise, wie sich Schulungsinhalte oder-vorgehen entwickelt haben, reicht auch keinem Anbieter zur Ehre, es geht nur ums Geld verdienen.

Oracle Datenbanken hatten und haben nach meiner Meinung technologisch die Nase vorne. Nicht mehr und nicht weniger. Wahrscheinlich sind sie auch deswegen am komplexesten in der Administration. Ich hatte bereits das "Vergnügen" Terrabyte Systeme zu verwalten- ohne Admin Titel. Die von Dir genannte "Tuning" Technik ist da einfach aus Platzgründen nicht ohne weiteres möglich, ganz abgesehen von der Tatsache, dass sich sowas bei einem 24x7 System von allein verbietet.

Ganz anders sieht die Sache schon bei anderen Oracle Produkten aus. Und bei Oracle-Produkten in der Microsoftwelt merkt man immer wieder, dass es nicht ihre ist. Im übrigen ist es so, dass jedes Software-System eine Geschichte hat, die es idR nicht verleugnen kann. "Best practise" ist hierzu ein schönes (Microsoft- glaub ich) Stichwort. Wenn man ein System so nutzt, wie es gedacht ist, fährt man am besten. (Hier wäre man vermutlich irgendwie wieder beim Thema des Threads angelangt, ANSI Joins sind bei Oracle erst spät(er) angeflanscht worden und ich verwende sie nur, wenn der Oracle Style zu umständlich wäre)

Bernhard Geyer 8. Feb 2014 10:18

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von jobo (Beitrag 1247157)
20 Jahre! Da erübrigt sich eigentlich jeder Kommentar.

Dieser Fehler war 20 Jahre her. Viele andere Fehler bei denen wir viel zeit investieren mussten un auch inkompetente Oracle-Admins belehren musste waren aus 2013!

Zitat:

Zitat von jobo (Beitrag 1247157)
Dennoch, rechne ca. 10 Jahre drauf, zu der Zeit haben MS SQL Anwendung noch Probleme mit Rowlevel Locking gehabt.

Also der MS SQL Server ist seit 2000 ganz gut. Davor war er ja primär ein umgelabeltes Zukaufprodukt.

Und nach den Erfahrungen die wir in den Jahren habe sind mir 10 MS SQL-Server-Installationen lieber als eine Oracle-Installation.

Zitat:

Zitat von jobo (Beitrag 1247157)
Man braucht da auch gar nicht über verschiedene Anbieter die Nase zu rümpfen. Es reicht falsche Transaktionsverwaltung in der Anwendung und keine DB hat ne Chance, das ist mit Sicherheit kein Admin Problem.

Die Probleme die wir hatten war keine Fehlerhafte Transaktionsverwaltung sondern 1a eine Oracle-Problem. Die gleiche DB auf unseren Oracle-Server - Kein Problem. Auf Kundenserver: Schnarchlangsam und selbst in den Statistiken war das Problem nicht ersichtlich. Die Oracle-DB hat sehr oft Full-Table-Scans gefahren obwohl problemlos ein Index/der Primärindex verwendbar wäre. Ein paar Fehler konnten wir "lösen" indem der Kunde einfach (im Rahmen seiner Serveraktualisierung) einfach eine neuen Server mit neuer Installation aufgesetzt hat.

Zitat:

Zitat von jobo (Beitrag 1247157)
Oracle Datenbanken hatten und haben nach meiner Meinung technologisch die Nase vorne. Nicht mehr und nicht weniger. Wahrscheinlich sind sie auch deswegen am komplexesten in der Administration. Ich hatte bereits das "Vergnügen" Terrabyte Systeme zu verwalten- ohne Admin Titel. Die von Dir genannte "Tuning" Technik ist da einfach aus Platzgründen nicht ohne weiteres möglich, ganz abgesehen von der Tatsache, dass sich sowas bei einem 24x7 System von allein verbietet.

Terrabyte-System dürften wir auch haben (jedoch noch nicht in der DB sondern wenn man die Daten außerhalb der DB mitzählt).
Leider denken manche Firmen: Wir haben Oracle, die Admins sind geschult. Wenn es Probleme gibt muss es die Kauf-Software sein.
Dann ist es immer sehr zeitaufwändig die Entscheidungsträger zu überzeugen das das Problem auf Ihrer Seite gibt. Vor allem wenn die Admins irgendwelche Statistiken ins Feld führen die gar nix mit dem Problem zu tun haben.

Zitat:

Zitat von jobo (Beitrag 1247157)
Ganz anders sieht die Sache schon bei anderen Oracle Produkten aus. Und bei Oracle-Produkten in der Microsoftwelt merkt man immer wieder, dass es nicht ihre ist.

Das fängt schon bei den Admin/SQL-Tools zur DB an. Glücklicherweise hat Oracle mit den Instant-Client eine Lösung wo man sein Client-System nicht mit irgendwelche GB-Großen Clientinstallern verseuchen muss.

Zitat:

Zitat von jobo (Beitrag 1247157)
Wenn man ein System so nutzt, wie es gedacht ist, fährt man am besten. (Hier wäre man vermutlich irgendwie wieder beim Thema des Threads angelangt, ANSI Joins sind bei Oracle erst spät(er) angeflanscht worden und ich verwende sie nur, wenn der Oracle Style zu umständlich wäre)

Schlechtes Beispiel. Oracle unterstütz seit 9i ANSI/ISO-Join-Syntax. Und wenn sie das unterstützen sollen sie das gefälligst auch Fehlerfrei machen!
ANSI-Join sind auch besser verständlich wenn man Einschränkungen dort definieren kann wo sie hin gehören: An den JOIN!

Bernhard Geyer 8. Feb 2014 10:53

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1247069)
Hallo zusammen

hier ist ja schon öfter mal über ANSI-Joins Ja oder Nein diskutiert worden, mit folgender Abfrage habe ich dann folgenden Fehler provozieren können:
Code:
select tab1.Feld1,tab2.Feld2,Tab3.*
from tab1 join tab2 using (idkey)
          join tab3 on (tab2.seckey=tab3.objectkey)
where ....
Zitat:

Im Projekt XXX ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 4440F60B in Modul 'OraOLEDBrst11.dll'. Lesen von Adresse ABABABAB' aufgetreten.
Wohlgemerkt, es kommt keine ORACLE-Fehlermeldung, das ein Qualifier nicht genutzt werden darf.

Hast du mal probiert dieses SQL-Statement direkt mit dem SQL+ oder den Oracle-Developer abzuschicken?
Was passiert wenn du das über eine ODBC-Verbindung abschicken würdest?

jobo 8. Feb 2014 15:57

AW: Ansi-Join provoziert Fehler
 
@Bernhard
Für mich ist das nicht nachvollziehbar, was Du da schreibst. Ich habe in 15 Jahren Oracle nur einen echten Fehler in der DB gehabt. Performanceprobleme natürlich ab und an, die sich aber immer mit vertretbarem Aufwand lösen ließen.
Dagegen viel häufiger Voodoo Fehler wie ich sie nenne, Kollegen die sich über sch.. Oracle aufregen. IdR. reicht dann RTFM, um das "Phänomen" zu klären.

Was tatsächlich nicht gut gelungen ist bzw. war: Der neue CBO unter Oracle 9, der hat sehr viel nicht nachvollziehbare Ausführungspläne erzeugt. Das konnte man immer durch Rulebased Optimzer grade biegen.
Seit spätestens 10.2 alles unproblematisch nach meiner Erfahrung.

Zuletzt gibt es ja noch Support und Patches. Die habe ich aber nie bei Oracle DB gebraucht, dafür leider bei anderen Oracle Produkten.

Zu den ANSI Joins noch kurz. Ich weiß nicht, wann das eingeführt wurde. 9i würde ich auch als spät-aus Oracle Perspektive- bezeichnen. Fakt ist, es gibt noch Horden von Oracle Entwicklern und Gurus, die immernoch keine ANSI Joins verwenden. Ich habe mich auch noch nicht dran gewöhnt.
Natürlich sollte das funktionieren, da gebe ich Dir Recht. Wird aber scheinbar zu selten benutzt.
Der 11er OLEDB Treiber um den es hier geht, dürfte auch schon was älter sein.
Ich würde in jedem Fall versuchen, einen aktuelleren Treiber einzusetzen oder aber im Support mal nach Patches/Bugs schauen.

mkinzler 8. Feb 2014 17:36

AW: Ansi-Join provoziert Fehler
 
Ist es eigentlich möglich eine Frage zu stellen, welche auch nur im Entferntesten etwas mit Oracel zu tun hat, ohne das ein Glaubenkrieg um Oracle entfacht wird? :gruebel:

Bernhard Geyer 8. Feb 2014 22:26

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von mkinzler (Beitrag 1247199)
Ist es eigentlich möglich eine Frage zu stellen, welche auch nur im Entferntesten etwas mit Oracel zu tun hat, ohne das ein Glaubenkrieg um Oracle entfacht wird? :gruebel:

Wenn der Threadersteller keine konkrete Frage stellt darf man wohl philosophieren :stupid:
Hätte der Threadersteller das nicht gewollt, hätte er ja wohl eine Frage gestellt.

Und mein letzter Post waren ja Hinweise was er entsprechend seinem Erstellerpost "Zugriff: egal" mal ausprobieren könnte.

jobo 9. Feb 2014 11:04

AW: Ansi-Join provoziert Fehler
 
Zitat:

Zitat von mkinzler (Beitrag 1247199)
Ist es eigentlich möglich eine Frage zu stellen, welche auch nur im Entferntesten etwas mit Oracel zu tun hat, ohne das ein Glaubenkrieg um Oracle entfacht wird? :gruebel:

Glaubenskriege sehen m.E. anders aus.

Mir ist klar, dass es Forenmitglieder gibt, die meine oder Bernhards oder andere Beiträge größtenteils als "Gelaber" betrachten. Das teilen sie mit einem entsprechenden Beitrag ja dann auch mal mit. Genau wie ich das mache, wenn ich irgendeinen Beitrag auf die ein oder andere Art "unterirdisch" finde. So wie hier z.B. in diesem Thread.
Was ist daran verkehrt? Gehört das nicht zu einem Forum dazu?
Wer sachliche und trockene Information braucht, kann doch z.B. Handbücher lesen.
Wer auch mal gern über den Tellerrand schaut und "apropos" Gedanken mitnehmen mag, schaut vielleicht lieber in ein Forum wie dieses.
In einer idealen Welt sähe ein Forum wahrscheinlich anders aus. Klare Frage, klare Antwort, fertig...

Bei der Gelegenheit, auch wenn es jetzt nach Deinem Anpfiff vielleicht blöd klingt, ein Dank an die Moderatoren.

Furtbichler 9. Feb 2014 19:00

AW: Ansi-Join provoziert Fehler
 
<Senf>
Leute, ich habe einmal mit Oracle gearbeitet. Öfter muss nicht sein. Von einem RDBMS erwarte ich, das es seine Arbeit gut macht. Das ist bei Oracle nicht immer der Fall. Klar, man kann immer irgendwo drehen, rumschrauben, obskure Einstellungen ändern, aber ... wieso sollte ich das tun? Warum soll ich im 21. Jahrhundert ein System wie eine experimentelle Dampfmaschine behandeln, nur damit sie irgendwann vielleicht doch den Turbo rauslässt.

Nee. Solange ich das nicht muss, lass ich es sein
</Senf>

p80286 11. Feb 2014 13:31

AW: Ansi-Join provoziert Fehler
 
Hallo Leute, meine Erfahrungen mit xxx und yyy verkneif ich mir mal, das wurde hier teilweise schon angesprochen.

Ich hab nochmal getestet und ausprobiert
Code:
on(feld1=feld2)
ist kein Problem, SQL+ gibt es bei 11 nicht mehr, da nennt das Teil sich "SQLDEVELOPER" und bestätigt alle Oracle-Vorurteile.

Ich bin einen kleinen Schritt weiter gekommen, der Fehler wird wohl durch eine ganz bestimmte ?????Konstellation??? ausgelöst.
Bei anderen Tabellen mit der gleichen Join Syntax war er nicht zu provozieren.
Nehmen wir es hin, da ist irgendwas, man weiß nur nicht genau was.

Vielen Dank an alle

Gruß
K-H

P.S.
jetzt hab ich es auch mal mit dem SQLDeveloper versucht, kein Problem.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz