Zum Inhalt springen

[Perl] Ausgelagertes Statement füllen - execute()


Empfohlene Beiträge

Hallo zusammen,

ich habe das erste Mal ein Perl-Programm geschrieben, in welchem ich ein SQL-Statement auslagere. Mit execute() habe ich die Möglichkeit Übergabeparameter zu übergeben, welche die "?" in meinem Statement ersetzen.

Nun habe ich allerdings ein Problem:

Bei "where bla IN (?)" werden für das Fragezeichen natürlich beliebig viele Eingaben getätigt, welche ich in dem Perl in eine Variable schreibe (z.B. werden 4 Zahlen eingegeben und ich schreibe die getrennet mit Komma in eine Variable "12, 34, 45, 67"). Nun führt er mir das Statement jedoch nicht aus und ich bekomme beim execute() einen Fehler.

"Data is not a numeric-literal."

Der Datentyp in der Datenbank ist Integer.

Hat irgendjemand eine Idee, wie ich das Problem umgehen kann?

Ich habe eben auch das Problem, dass ich mir das fehlerhafte Statement nicht anzeigen lassen kann - weder in der Datenbank noch über irgendeine Umleitung durch das execute().

Danke im voraus und viele Grüße.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem wird sein, dass numerische Werte erwartet werden, durch das Quoting allerdings ein String entsteht. Was durch das "execute" entsteht, kannst Du Dir über einen kleinen Umweg ausgeben lassen, denn "execute" quotet nicht anders als die "quote"-Methode:

my $foo = "12, 34, 45, 67";
print STDERR "where bla IN (" . $foo . ")";[/php]

Ich habe leider keine Idee, wie man dies sauber lösen könnte. Daher würde ich spontan dazu tendieren, das Statement auf Händen und Füßen zu basteln:

[php]my @foo = (12, 34, 45, 67);
print STDERR "WHERE bla IN (" . join(", ", map {int($_)} @foo) . ")";

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi habbeda,

danke erstmal für deine Denkanstöße - ich hab schon gar keine Antwort mehr erwartet.

Das Problem selbst war mir von Anfang an klar, aber ich hab mir gedacht, dass ein so weit verbreitetes Modul wie DBI eigentlich eine Möglichkeit bieten müsste, damit umzugehen. Denn es wird doch eventuell andere Entwickler geben, bei denen dieses Problem schon aufgestoßen ist.

Ich hab zuerst auch gedacht, dass mir vielleicht die trace()-Methode weiterhelfen könnte, aber die gibt mir auch nur das Statement mit den ? aus, wenn ich den Level auf 1 oder 2 erhöhe.

Das allgemeine Problem ist, dass ich das Test-Skript natürlich mit einem ausgelagertem Statement ausgeführt habe. Allerdings werde ich in Zukunft keinen Einfluss mehr auf das Statement haben, da das nur an meinen Teil übergeben wird. Deswegen wäre es eben schön gewesen, wenn es für das execute() eine Möglichkeit gegeben hätte. Nun durchlaufe ich das eingebundene Statement umständlich und suche nach den "?".

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe leider erfolglos gesucht und experimentiert, wie man DBI hier ggf. überreden könnte. Meine letzte Hoffnung war noch "bind_param", um die Übergabe einer Liste mit gewünschtem Effekt zu ermöglichen. Doch leider spricht die Doku eine eindeutige Sprache: ein Platzhalter, ein Wert. Leider muss ich noch ein paar Wochen von meinem Arbeitsplatz fernbleiben - wenn ich aber wieder dort bin (und mich hoffentlich noch an das Problem erinnere), werde ich mal unsere Spezialisten fragen. Erscheint mir ebenfalls etwas unwahrscheinlich, dass noch nie jemand mit diesem Problem zu kämpfen hatte. Für Google fehlen mir zumindest die passenden Stichworte...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Mühen.

Google haben wir in dieser Hinsicht auch schon "vergewaltigt", aber nichts passendes für das Problem gefunden. Auch unsere Entwickler konnten uns dabei nicht weiterhelfen - ich bin ja eigentlich mehr im Service angesiedelt.

Natürlich läuft das Skript nun, aber man macht sich über ungelöste Probleme eben doch immer seine Gedanken ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...