• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Can't call method "prepare"

Holzpuppe

Newbie
Wer kann mir weiterhelfen?

Wer kann mir bei meinem Perl-Problem weiterhelfen?
Ich habe mir die ähnlichen Beiträge schon angeschaut - aber keiner passt

Ich will mysql-select in einem "Untermodul" aufrufen.
Rufe ich den select im Hauptmodul auf klappt alles prima
Verwende ich das Umtermodul "sql_sub" bekomme ich folgenden Fehler:

Can't call method "prepare" on an undefined value at SQL_sub.pm
----------------------------------------------------------------
Es hängt an der DBI-Connect-Variablen (hier $dbh).
Ich kann diese Variable anscheinend nicht in meinem Untermodul erreichen.
Übergebe ich $dbh über Parameter, läuft alles perfekt aber es soll ohne Parameterübergabe laufen.

Haupt-Modul:
...
$dbh = DBI->connect("........
...
($idx, $valx) = sql_call();

------------------
package SQL_sub;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(sql_call);
$VERSION = 1.0;

sub sql_call {
$sth = $dbh->prepare(select * from table1 where idx = 100);
$rv = $sth->execute;
@arr = $sth->fetchrow_array;
$rc = $sth->finish;
return @arr; }

Gruss Holzpuppe
 

ginka

Member
In Perl sind Variablen immer im aktuellen Package global. Deine Funktion sql_call() befindet sich im Package 'SQL_sub', der Aufruf erfolgt jedoch aus einem anderen Package, vermutlich 'main' (zumindest bezeichnest du in deinem Posting den entsprechenden Code-Schnipsel als 'Haupt-Modul').

Du kannst das Ganze ohne Variablen-Übergabe lösen, indem du der Variable $dbh das Package mitgibst, in dem sie existiert. Im Falle von 'main' also:

Code:
$sth = $main::dbh->prepare(select * from table1 where idx = 100);

oder allgemein ausgedrückt:

Code:
$packagename::variablenname

Gruß
ginka
 
Oben