Fehler mit einem Anweisungshandle vom DBI
Knopf
- perl
0 Klaus Mock0 Knopf
Hallo!
Ich schreibe momentan eine Anwendung in Perl.
Mit Hilfe des DBI greife ich auf eine Oracle-Datenbank zu.
Leider komme ich mit einem Fehler ganz und gar nicht zurecht.
Nachfolgend ein kleiner Ausschnitt (die Verbindung zur Datenbank ist in einem anderen Programmteil hergestellt worden!
sub lab_phase
{
my ($clone_name) = @_;
$query = "select id, TO_char(started_at, 'dd.mm.yy hh24.mi.ss') ";
$query .= "from t_esdoc_eseries, t_esdoc_eseries_link ";
$query .= "where subject_id = '$clone_name' ";
$query .= "and id = eseries_id and name = 'LAB-PHASE' ";
$query .= "order by started_at ";
$sth = $dbh ->prepare($query);
$sth ->execute();
#nach diesem select erhält man die eseries_ids nach dem Datum aufsteigend sortiert
# Bsp: ID TO_CHAR(STARTED_A
#-------------------------------- -----------------
#808080808080808080808080808086D0 24.07.01 14.18.43
#80808080808080808080808080908A34 09.11.01 08.12.53
while ($data = $sth ->fetchrow_hashref())
{
$eseries_id = $data -> {"id"};
&agro_transfer($eseries_id) #jetzt wird eine bestimmte eseries_id verwendet, sie wird in agro_transfer und agro_transfer_check übergeben
}
}
sub agro_transfer
{
my ($eseries_id) = @_;
@recs = ();
$query = "select t_esdoc_watched.id, result, name, TO_char (created_at, 'dd.mm.yy hh24.mi.ss') ";
$query .= "from t_esdoc_estep, t_esdoc_watched ";
$query .= " where eseries_id = '$eseries_id' and owner_id = t_esdoc_estep.id ";
$query .= "and name = 'AGRO-TRANSFER' ";
$query .= "order by created_at ";
$sth = $dbh->prepare($query);
$sth -> execute();
....
so, nun mein Problem. Also ich bekomme immer eine Fehlermeldung an der Stelle, wo die Schleife aufgerufen wird und ich ins hashref schreiben möchte:
</head><body>DBD::Oracle::st fetchrow_hashref failed: ERROR no statement executing (perhaps you need to call execute first) [for statement ``select t_esdoc_watched.id, result, name, TO_char (created_at, 'dd.mm.yy hh24.mi.ss') from t_esdoc_estep, t_esdoc_watched where eseries_id = '' and owner_id = t_esdoc_estep.id and name = 'AGRO-TRANSFER' order by created_at '' with params: ]) at tratest line 164.
Ich habe festgestellt, dass der untere Query-Befehl ausgeführt wird (oder vielmehr es wird versucht!!!)
Hätte jemand eine Idee, warum das so ist?
Hallo,
$query = "select id, TO_char(started_at, 'dd.mm.yy hh24.mi.ss') ";
....
Das ist irgendwie nicht wirklich perlish. Perl kennt auch mehrzeilige String-Konstanten und sog. HERE-Documents.
z.B:
$query = <<EOT;
select id, TO_char(started_at, 'dd.mm.yy hh24.mi.ss')
from t_esdoc_eseries, t_esdoc_eseries_link
where subject_id = '$clone_name'
and id = eseries_id and name = 'LAB-PHASE'
order by started_at
EOT
Und ausserdem überschreibst Du hier...
$sth = $dbh ->prepare($query);
... und hier ...
$query = "select t_esdoc_watched.id, result, name, TO_char (created_at, 'dd.mm.yy hh24.mi.ss') ";
... ausserdem auch hier
$sth = $dbh->prepare($query);
... und hier auhc noch einmal globale Variablen.
Hätte jemand eine Idee, warum das so ist?
Du überschreibst Dir in der aufgerufenen Funktion den Statement-Handle der aufrufenden Funktion. Das mag keine Programiersprache, auch Perl nicht. Mit "use strict;" wäre das nicht passiert.
Abhilfe: Setze "use strict;" ein und behebe die dadurch zu Tage tretenden Fehler.
Grüße
Klaus
Hey, danke sehr, ich habe deinen Rat befolgt und use strict verwendet.
Hab den Fehler nun weg!
Gruss, Barbara