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

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.

Hallo,

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.

Bei einem Fragezeichen erwartet die Datenbank einen Integer, bekommt aber einen String mit Komma-separatieren Integern – kein Wunder, dass das nicht klappt.

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

Indem du das SQL-Statements dynamisch mit der richtigen Anzahl an Fragezeichen baust.

my @list = (1, 2, 42, 23);
my $q = join ‚, ‚, (‘?‘) x @list;

my $sth = $dbh->prepare(„SELECT t.a FROM t WHERE t.b IN ($q)“);
$sth->execute(@list);

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

Das statement selbst ist ja nicht fehlerhaft, es tut nur nicht das, was du willst.

Im allgemeinen hilft dir vielleicht DBI->trace(1) weiter.

Grüße,
Moritz

Hallo,

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.

Bei einem Fragezeichen erwartet die Datenbank einen Integer,
bekommt aber einen String mit Komma-separatieren Integern –
kein Wunder, dass das nicht klappt.

Warum es nicht klappt ist mir schon bewusst. Aber danke dafür :smile:

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

Indem du das SQL-Statements dynamisch mit der richtigen Anzahl
an Fragezeichen baust.

my @list = (1, 2, 42, 23);
my $q = join ‚, ‚, (‘?‘) x @list;

my $sth = $dbh->prepare(„SELECT t.a FROM t WHERE t.b IN
($q)“);
$sth->execute(@list);

Das Problem ist, dass das Statement als eigenständiges Perl ausgelagert ist und mit require eingebunden wird. Ich hab das Statement leider nicht in meinem Perl, sondern bekomme es nur geliefert.

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

Das statement selbst ist ja nicht fehlerhaft, es tut nur nicht
das, was du willst.

Ist mir an sich auch klar :smile:

Im allgemeinen hilft dir vielleicht DBI->trace(1) weiter.

Danke werd ich mir mal zu Gemüte führen.

Grüße,
Moritz

Gruß zurück.