Horst: (Perl DBI) Where-Klausel global setzen

Hallo,

gestern abend, Problem: In einem Script gibt es einige SQL-Statements in welche eine zusätzliche WHERE-Klausel eingebaut werden sollten. Auch Statements, in denen es bereits eine Where-Kls gibt.

Gute Programmierer haben ja _alle_ Statements weiter oben als $sth_x, $sth_y usw. vordefiniert und müssen bei Änderungen nicht erst alle zusammensuchen... seufz.

Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
SELECT name, vname FROM adressen

automatisch ein
SELECT name, vname FROM adressen WHERE visible=1

wird?

Und die auch:
SELECT name, vname FROM adressen WHERE lfdnr=33
SELECT name, vname FROM adressen WHERE lfdnr=33 AND visible=1

Viele Grüße,
Hotte

  1. Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
    SELECT name, vname FROM adressen

    automatisch ein
    SELECT name, vname FROM adressen WHERE visible=1

    wird?

    Nein.

    Struppi.

  2. Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
    SELECT name, vname FROM adressen

    automatisch ein
    SELECT name, vname FROM adressen WHERE visible=1

    wird?

    Ich löse das über eine eigene Subroutine, evtl. wäre das ein Denkanstoß:

    # Syntax: getResults([spaltennamen], [Where], {And}, Sortierspalte)  
    sub getDBResults(@$@$%$$) {  
      my $fields = join ',', @{$_[0]};  
      my $stm = 'SELECT '.$fields.' FROM tabelle';  
      my (@p,$i);  
      $stm .= ' WHERE ' . $_[1]->[0] . '=?' if( defined $_[1] );  
      if( defined $_[2] ) {  
        while( my($k,$v) = each %{$_[2]} ) {  
          $stm .= ' AND ' . $k . '=?';  
          push @p, $v;  
        }  
      }  
      $stm .= ' ORDER BY '.$_[3].' DESC' if defined $_[3];  
      my $dbh = DBI->connect(...) || error('Connecting to database failed', $DBI::errstr);  
      my $sth = $dbh->prepare($stm)|| error('Preparing statement ' . uc($stm).' failed: ', $DBI::errstr);  
      $sth->bind_param(1, $_[1]->[0]) if defined $_[1];  
      $i = 2;  
      foreach my $p(@p) {  
        $sth->bind_param($i, $p);  
      }  
      $sth->execute || error('Executing statement failed: '.$stm, $DBI::errstr);  
      my $rows = $sth->rows;  
    }
    

    Damit bekomme ich so ziemlich jede SELECT-Abfrage hin, die ich in meinem Anwendungsfall brauche. Ansonsten gilt das, was Struppi sagte.

    Siechfred

    --
    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
    1. Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
      SELECT name, vname FROM adressen

      automatisch ein
      SELECT name, vname FROM adressen WHERE visible=1

      wird?

      Ich löse das über eine eigene Subroutine, evtl. wäre das ein Denkanstoß:

      Isses! Cool!

      Vielen Dank und Grüße,
      Hotte