Bekanntes Query Prob bei Oracle und (Borland) BDE - Lösung?
-
moin
EDIT: schaut einfach mal unten
-
ick hab da ma was gefunden... vielleicht kann mir das jemand mal erklären (Driver Flags?!)
Problem:
Live result set with Oracle Driver Flags = 1 fails on
open with "ORA-00942: table or view does not
exist" if the owner name and table name are not
quoted.Steps:
With the Oracle Driver Flags set to 1 open a live
result set using unquoted, lowercase
owner.tablename against an Oracle table whose
owner name is defined as uppercase.um nochmal genauer zu werden. Die Meldung kommt bei mir bei diesem Statement:
DataModule1->Query4->SQL->Add("SELECT * FROM zHaltestellen INNER JOIN zOrte ON (zHaltestellen.ort_id = zOrte.ort_id) WHERE zHaltestellen.name = "+dinohsname+" AND zOrte.name = "+dinohsort+"");
-
DataModule1->Query4->SQL->Add("SELECT * FROM 'zHaltestellen' INNER JOIN 'zOrte' ON (zHaltestellen.ort_id = zOrte.ort_id) WHERE zHaltestellen.name = '"+dinohsname+"' AND zOrte.name = '"+dinohsort+"'");
Versuche es mal so.
Bei MySQL muss bei einer Textspalte der Wert in Hochkommas.
-
jetzt meint er "ungültiger Tabellenname"
ich meine auch dass ' in SQL92 nicht valide sind - kann mich aber auch irren!
-
Oklino schrieb:
jetzt meint er "ungültiger Tabellenname"
ich meine auch dass ' in SQL92 nicht valide sind - kann mich aber auch irren!
Du irrst (zum Teil). Strings werden in Hochkommas angegeben (also Deine Variablen in der Where-Bed.). Tabellen- /Spaltennamen werden i.d.R. nicht in Hochkommas angegeben.
Da hat jedes SQL sein eigenes Verfahren, neben nichts (= Standard) z.B. auch eckige Klammern (SQL-Server-2000) um Namen von reservierten Wörtern unterscheiden zu können.
-
hmmm hast du denn eventuell einen Lösungsvorschlag? Wie erwähnt arbeite ich mit Oracle (10g) und dem BCB6. Welches SQL da nun im Oracle Kleidchen steckt, kann ich leider nicht beantworten ^^
EDIT:
ich hab da mal was mitgebracht:
Hallo Andreas,
Oracle hat eine eigene SQL-Syntax für Joins und kennt dort den ANSI Standard nicht.
Einen INNER JOIN definierst du einfach mit:
SELECT * FROM tab1 A, tab2 B WHERE A.joinfeld = B.joinfeld
Ein OUTER JOIN sieht dann so aus:
SELECT * FROM tab1 A, tab2 B WHERE A.joinfeld(+) = B.joinfeld
oder
SELECT * FROM tab1 A, tab2 B WHERE A.joinfeld = B.joinfeld(+)
je nachdem ob es ein RIGHT ODER LEFT OUTER JOIN ist.Gruß Falk
Jetzt fehlt mir zu meinem Glück nur noch das (2.) WHERE, hat jemand ne Idee wie das dann nach Oracle Syntax angehangen wird?
-
Versuch's mal mit AND:
SELECT * FROM tab1 A,tab2 B WHERE A.joinfeld=B.joinfeld AND A.name="whatever"
-
So wäre der Befehl von der Syntax her korrekt:
SELECT * FROM zhaltestellen zh INNER JOIN zorte zo ON zh.ort_id = zo.ort_id WHERE zh.NAME = 'test' AND zo.NAME = 'test';
Die ANSI Join-Syntax bzgl. INNER JOIN .. ON, FULL OUTER JOIN .. ON usw. werden afaik seit 9i unterstützt.
Wenn wie hier die Join-Spalten der beiden Tabellen den gleichen Namen besitzen könntest du auch einen Natural Join benutzen:SELECT * FROM zhaltestellen zh NATURAL JOIN zorte zo WHERE zh.NAME = 'test' AND zo.NAME = 'test';
Strings gehören in einfache Hochkommata.
MfG
-
jup habe ich - so scheints auch richtig zu sein!
Das Problem das ich jetzt habe ist wieder das alte... "Table or View does not exist. OBWOHL die TTable Objekte exakt so benannt sind, wie im Statement geschrieben. Richtig Verbunden mit den Tables der DB sind sie aus, der Builder zeigt mir im Pulldown im Objektinspektor ja die "realen" tables an...
Zwischendurch hatte ich Hoffnung als ich dann neue Fehlermeldungen bekommen habe, von wegen SQL-Befehl nicht korrekt beendet, oder "Ausdruck fehlt". Nachdem man mir dann ein Oracle Admin das Statement nochmal korrigiert hatte, fing der BCB mit seinem upper/lowercase Blödsinn (sorry aber ich bin jetzt schon 2 Tage an dieser Stelle und es k*** mich an) bzw. "Table or View does not exist" an.
-
rocksteady schrieb:
So wäre der Befehl von der Syntax her korrekt:
SELECT * FROM zhaltestellen zh INNER JOIN zorte zo ON zh.ort_id = zo.ort_id WHERE zh.NAME = 'test' AND zo.NAME = 'test';
Die ANSI Join-Syntax bzgl. INNER JOIN .. ON, FULL OUTER JOIN .. ON usw. werden afaik seit 9i unterstützt.
Wenn wie hier die Join-Spalten der beiden Tabellen den gleichen Namen besitzen könntest du auch einen Natural Join benutzen:SELECT * FROM zhaltestellen zh NATURAL JOIN zorte zo WHERE zh.NAME = 'test' AND zo.NAME = 'test';
Strings gehören in einfache Hochkommata.
MfG
Da hast du doch glatt schneller geschrieben als ich. mein beitrag ohne login war für die AW vor dir
ok ich teste das mal fix und mache gleich hier ein edit, falls es ein neues ergebnis bringtEDIT
Ok ich habs mal ausprobiert mit Möglichkeit eins... funzt leider wieder nicht.
-
TTable-Objekte haben doch damit gar nichts zu tun. Du mußt die Tabellennamen so angeben, wie sie in der Datenbank heißen.
-
Wenns immer noch nicht klappt und die Tabellen definitiv existieren, kann es imho an zwei Sachen liegen:
1. Berechtigungsproblem
2. die Tabellen wurden case-sensitive angelegt, dann musst du die Tabellennamen in doppelte Anführungszeichen setzen.
Bsp.:
-- case-insensitive
CREATE TABLE abc (ID NUMBER(3));Select * from abc
Select * from AbC
Select * from abC
...
=> geht alles-- case-sensitive
CREATE TABLE "abc" (ID NUMBER(3));Select * from abc
=> ORA-00942: table or view does not exist
Select * from "abc"
=> gehtMfG
-
Joe_M. schrieb:
TTable-Objekte haben doch damit gar nichts zu tun. Du mußt die Tabellennamen so angeben, wie sie in der Datenbank heißen.
... Wo ist der "Suizidgefährdete AE Azubis"-Thread?...
------------------------------------------------------
Ich dachte die ganze Zeit dass die Table Objekte die Schnittstelle zur ODBC Quelle bilden und dass BDE dann aus dem Statement die Tableobjekte rauspult und... WO ZUR HÖLLE IST DER KOTZENDE SMILIE?!??!?!?!?!?
EDIT: danke... ich hoffe der Thread wird bald ins Archiv verschoben *im Boden versink*