2011-06-24 20 views
6

Jest to standardowa wkładania przykład z DBI instrukcji:Perl DBI: jak wyświetlić nieudane zapytanie z powiązanymi wartościami?

 my $query = q{ 
     INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?) 
    }; 
    my $sth = $dbh->prepare($query) or die $dbh->errstr; 
    while (<>) { 
     chomp; 
     my ($product_code, $qty, $price) = split /,/; 
     $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr); 
    } 
    $dbh->commit or die $dbh->errstr; 

I zmodyfikowane go nieco, aby można było zobaczyć, na którym matryca zapytania nie powiodło się (die ($query . " " . $dbh->errstr)). Nadal chciałabym zobaczyć zapytanie z powiązanymi wartościami (gdy zostało wykonane). Jak to zdobyć?


Edit

Btw, znalazłem niezgrabny sposób, aby zobaczyć kwerendy z wartościami związanymi też: trzeba zrobić błąd składni w zapytaniu. Na przykład, jeśli zapytanie powyżej zmienić tak:

 my $query = q{ 
     xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?) 
    }; 

mam go z powrotem jak chciałam:

DBD :: mysql :: st execute nie powiodło się: masz błąd w składni SQL ; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu: "próbka xINSERT INTO (kod_produktu, ilość, cena) WARTOŚCI (" 1 "," 2 "," 3 ")" w linii 1

Czasami to naprawdę pomaga. Przynajmniej mi to zrobił.

Odpowiedz

3

Możesz użyć DBI ParamValues, aby uzyskać wartości parametrów, ale jest mało prawdopodobne, aby znaleźć jakieś metody w DBD, aby uzyskać parametry faktycznie w SQL, ponieważ są one najczęściej wysyłane do bazy danych po parsowaniu SQL. Możesz spojrzeć na DBIx::Log4perl, aby zobaczyć, w jaki sposób ParamValues ​​jest używane w procedurze obsługi błędów. Możesz także znaleźć przydatne części DBIx :: Log4perl.

+0

Dziękuję za wskazanie dobrego kierunku. Wciąż chciałbym wskazać na mój dodatek w OP. –

0

Nie ma ogólnie obsługiwanej metody DBI, ale indywidualne sterowniki bazy danych mogą na to pozwolić. Jakiej bazy danych używasz?

1

Nie ma standardowego sposobu na zrobienie tego. Najbliższym przybliżeniem byłoby zastąpienie każdego elementu zastępczego wartością (prawdopodobnie cytowaną). Ogólnie rzecz biorąc, dość trudno jest niezawodnie przeanalizować instrukcję SQL, aby znaleźć znaki zapytania, które są symbolami zastępczymi, a nie częściami rozdzielonych identyfikatorów lub ciągów lub komentarzy. W tym przykładzie możesz po prostu szukać znaków zapytania; że nie zawsze będzie działać, choć:

INSERT /* ? */ INTO "??".Sales VALUES('?', ?, ?, ?); 

Należy zauważyć, że z większości, ale niekoniecznie wszystkie, DBMS (a więc większość kierowców DBD), rachunek jest wysyłany do DBMS, gdy jest przygotowane; tylko wartości są wysyłane podczas wykonywania instrukcji. Nigdy nie ma instrukcji utworzonej ze wszystkimi wartościami podstawionymi na liście VALUES, więc ani DBI, ani DBMS nie powinny go utworzyć.

Powiązane problemy