Huwy Geschrieben 31. August 2012 Geschrieben 31. August 2012 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. Zitieren
habbeda Geschrieben 5. September 2012 Geschrieben 5. September 2012 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) . ")"; Zitieren
Huwy Geschrieben 5. September 2012 Autor Geschrieben 5. September 2012 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 "?". Zitieren
habbeda Geschrieben 5. September 2012 Geschrieben 5. September 2012 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... Zitieren
Huwy Geschrieben 6. September 2012 Autor Geschrieben 6. September 2012 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 Zitieren
Empfohlene Beiträge
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.