AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Incompatilbe column/host variable data type
Thema durchsuchen
Ansicht
Themen-Optionen

Incompatilbe column/host variable data type

Ein Thema von ZOD · begonnen am 9. Nov 2017 · letzter Beitrag vom 9. Nov 2017
Antwort Antwort
Seite 2 von 3     12 3      
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#11

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 10:45
wenn ich die Abfrage im IBExpertstarte, wird sie vorbereitet

Code:
Plan:
PLAN (RDB$DATABASE NATURAL)

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 74.771.328
Max memory = 146.467.576
Memory buffers = 2.048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 8
dann gebe ich den Parameter-Wert ein:
Code:
Parameter INTEGER Wert = 1
und führe die Anfrage aus. Als Resultat erhalte ich eine Zeile mit

Code:
CAST
1
Wenn das nicht geht, warum bekomme ich dann ein Ergebnis?
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#12

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 10:48
Noch ein Nachsatz:

ich kann nicht erkennen, wo ich hier einen Tabellenname parametrisiere.

In unserer Applikation gibt es einige Statements, die ähnlich aufgebaut sind und funktionieren.
Vielleicht nur aus Zufall - aber ich würde wirklich gerne verstehen, was ich da falsch mache.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#13

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 11:04
SQL-Code:
select
cast(:parameter as integer)
from rdb$database
where
:parameter = 1
Die Frage ist ja, was man da als arameter eingibt: Wenn das die Zahl 1 ist steht da:

SQL-Code:
select
cast(1 as integer)
from rdb$database
where
1 = 1
Herzlichen Glückwünsch.

Das ist aber immer noch kein Feldname. Gib mal als Parameter an: RDB$RELATION_ID und schau was passiert.
Ralph
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#14

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 11:09
letzten Beitrag gelesen - weitergemacht:

weitere Tests haben ergeben, dass das Problem entsteht, wenn der Wert ein char bzw. varchar ist.

Wird in der where-Klausel der Vergleichswert per
Code:
cast()
übergeben, klappt es.

Also das
Code:
select
'Test'
from rdb$database
where
:parameter = cast('*' as varchar(8191))
Liefert als Ergebnis
'Test'

Während das
Code:
select
'Test'
from rdb$database
where
:parameter = '*'
Bei einem Parameterwert mit Länge größer 1 (z.B. 'axf') den Fehler

Code:
Incompatilbe column/host variable data type.
Dynamic SQL Error.
SQL error code = -303
arithmetic exception, numeric overflow or string truncation.
string right truncation.
liefert. Offenbar wird der Datentyp des Parameters anhand der Bedingung in der where-Klausel definiert.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#15

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 11:19
OK. So langsam dämmert es mir, worauf die hinaus willst.
Hast du als Paramter '*' sollen z.B. alle Tabellen angezeigt werden,
hast du dagegen als Parameter einen konkreten Tabellennamen, soll nur diese angezeigt werden?

Bringt es was, die Bedingung umzudrehen:
'*' = :parameter

oder liegt es speziell am * dann mal probeweise ein anderes Dummy-Zeichen nehmen?


Edit:
Alternativ könnte man natürlich im Programm-Code diese unterscheidung treffen...
Ralph
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#16

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 11:26
@Jumpy
genau das ist die Intention. Ich verwende eine Stored procedure, da werden Parameter übergeben.
Werden diese mit NULL übergeben, so wird in eine Variable ein '*' eingetragen, ansonsten schreibe ich den übergebenen Wert in die Variable.
Die Variablen werden in einer Abfrage in der Stored Procedure verwendet - die Beispiele oben waren für den Thread hier
stark vereinfacht.

Wie geschildert: das geht mit numerischen Datentypen im Parameter (z.B. Integer), bei Char-Datentypen muss offenbar in der where Klausel mindestens der Vergleichs-String gecastet werden, damit es funktioniert.
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#17

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 12:42
Nachtrag:

der Vorschlag, die Bedingung umzudrehen führt leider auch zum Fehler,
das also funktioniert nicht:

Code:
select
'Test'
from rdb$database
where
'*' = :parameter
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#18

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 14:09
Nehmen wir nochmal dashier:
SQL-Code:
select
'Test'
from rdb$database
where
:parameter = '*'
wenn nun Parameter asdf ist, dann wird daraus
SQL-Code:
select
'Test'
from rdb$database
where
asdf = '*'
Das ist kein gültiges SQL-Statement.
Bei der Angabe einer Zeichenfolge müssen um den Parameter ''.

Da rdb$database nur einen Datensatz enthält, kommt als Ergebnis immer eine Zeile heraus, sofern die Where-Bedingung 1. ein gültiges Statement ergibt und 2. das Abfrageergebnis wahr ist.

Machst Du sowas für eine Tabelle mit 10 Mio. Datensätzen, so kommen als Ergebnis bei einer wahren Wehrebedingung 10 Mio. Datensätze heraus. Der Inhalt der Wherebedingung ist dabei für den Tabelleninhalt absolut irrelevant.

Du solltest bitte erstmal verbal beschreiben, was Du genau möchtest, dann kann man nach 'ner Lösung suchen. So erscheint mir das erstmal (überspitzt formuliert) absolut sinnfrei.

Mit den Wherebedingungen
SQL-Code:
where 1 = 1
-- bzw.
where 1 = 2
könntest Du die gleichen Ergebnisse erhalten.
Bei der Nutzung von Zeichenfolgen ginge auch
SQL-Code:
where 'asdf' = 'asdf
-- bzw.
where 'asdf' = '*'
Als Ergebnis gibt es immer alle Sätze der Tabelle oder keinen Satz.

Sollte anstelle von asdf hier jedoch der Spaltenname gewünscht sein? Das geht nicht. Spaltennamen kann man nicht per Parameter übergeben, sondern nur Werte.

dashier geht: where Spaltenname = :Parameter
dashier geht nicht: where :Spaltenname = 'Wert'
dashier geht auch nicht: where :Spaltenname = :ParameterFuerDenWert
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#19

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 16:06
@nahpets

Zur einfacheren Diskussion ein konretes Beispiel. Ich verwende

Code:
    select
    lt.id,
    lt.date_time,
    lt.operation,
    lt.user_name
    from ibe$log_tables lt
    where
    (
      (:tmp_tabellen_name = cast('*' as varchar(201)))
      or
      ((not (:tabellen_name = cast('*' as varchar(201)))) and (lt.table_name = f_lrtrim8(f_upper(:tmp_tabellen_name))))
    )
    and
    (
      (:tmp_db_operation = cast('*' as varchar(1)))
      or
      ((not (:tmp_db_operation = cast('*' as varchar(1)))) and (lt.operation = f_lrtrim8(f_upper(:tmp_db_operation))))
    )
    order by
    lt.date_time desc
    rows 1
Und das funktioniert wie gewünscht.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Incompatilbe column/host variable data type

  Alt 9. Nov 2017, 16:11
Hallo,
laut dem hier ist es 8190, nicht 8191
http://freeadhocudf.org/documentatio...ng_string.html


Funktioniert es denn jetzt mit * oder mit einem Tabellen-Namen.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz