Knopf: Fehler mit einem Anweisungshandle vom DBI

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?

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

    1. Hey, danke sehr, ich habe deinen Rat befolgt und use strict verwendet.
      Hab den Fehler nun weg!

      Gruss, Barbara