2011-06-24 15 views
6

Este es un estándar de inserción de ejemplo de DBI Manual:Perl DBI: ¿cómo ver la consulta fallida con valores encuadernados?

 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; 

he modificado un poco, por lo que se puede ver en troquel que consulta falló (die ($query . " " . $dbh->errstr)). Aún así, me gustaría ver la consulta con los valores límite (tal como se ejecutó). ¿Cómo conseguirlo?


Editar

Por cierto, he encontrado una manera incómoda para ver la consulta con los valores ligados también: usted tiene que hacer error de sintaxis en consulta. Por ejemplo, si cambio consulta anterior así:

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

me devolvieron como quería:

DBD :: mysql :: st fallado ejecutar: Usted tiene un error en su sintaxis SQL ; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'xINSERT INTO sample (product_code, qty, price) VALUES (' 1 ',' 2 ',' 3 ')' en la línea 1

A veces, realmente ayuda. Al menos me lo hizo a mí.

Respuesta

3

Puede usar DBI ParamValues para obtener los valores de los parámetros, pero es poco probable que encuentre ningún método en un DBD para obtener los parámetros realmente en el SQL porque se envían principalmente a la base de datos después de analizar el SQL. Puede consultar DBIx::Log4perl para ver cómo se usa ParamValues ​​en el controlador de errores. También puede encontrar algunas partes de DBIx :: Log4perl útiles.

+0

Gracias por señalar la buena dirección. Todavía me gustaría señalar mi adición en OP. –

0

No existe una forma de DBI genéricamente compatible para hacer esto, creo, pero los controladores de bases de datos individuales pueden permitirlo. ¿Qué base de datos estas usando?

1

No hay una forma estándar de hacerlo. La aproximación más cercana sería sustituir cada marcador por el valor (probablemente citado). En general, es bastante difícil analizar con precisión una instrucción SQL para encontrar los signos de interrogación que son marcadores de posición en lugar de partes de identificadores delimitados o cadenas o comentarios. En el ejemplo, simplemente puede buscar signos de interrogación; que no siempre va a funcionar, sin embargo:

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

Tenga en cuenta que con la mayoría, pero no necesariamente todos, DBMS (y por lo tanto la mayoría de los conductores DBD), la declaración sea enviada a los DBMS cuando se prepara; solo los valores se envían cuando se ejecuta la declaración. Nunca se crea una declaración con todos los valores sustituidos en la lista VALUES, por lo que no se espera que ni DBI ni DBMS creen una.

Cuestiones relacionadas