On Jun 6, 8:46 pm, listm...@triad.rr.com (listmail) wrote:
> Lethal Possum wrote:
> > On Jun 5, 6:52 pm, listm...@triad.rr.com (listmail) wrote:
>
> >> Lethal Possum wrote:
>
> >>> Hello,
>
> >>> I am trying to create a prepared statement for the following query in
> >>> MySQL:
>
> >>> INSERT IGNORE INTO foo (group, value) (SELECT 101, value FROM bar
> >>> WHERE value LIKE '%something%');
>
> >>> So far my Perl code looks something like this:
>
> >>> my $group = 101;
> >>> my $pattern = '%something%';
> >>> my $query = 'INSERT IGNORE INTO foo (group, value) (SELECT ?, value
> >>> FROM bar WHERE value LIKE ?);';
> >>> my $sth = $dbh->prepare($query);
> >>> $sth->execute($id, $pattern) or die($sth->errstr);
>
> >>> It does not insert anything into the table foo even though there are
> >>> values in table bar that match the pattern. So my question is: what am
> >>> I doing wrong. I have other, simpler prepared queries in my program
> >>> that work just fine but this one does not do anything and does not
> >>> trigger any error as far as I can see.
>
> >>> Are ? parameters allowed in a nested SELECT?
> >>> Are they allowed not in the WHERE clause?
> >>> Are they allowed with the LIKE operator?
>
> >>> Thanks in advance for your help.
>
> >>> Tom
>
> >> I haven't ever tried binding column names so I am not sure about that
> >> piece.  I don't have access to a db at the moment but for the LIKE
> >> portion maybe try something such as this output indicates.  I believe it
> >> is what I've done in the past.  It implies excluding % in $pattern and
> >> moving it to the select statement.
>
> >> perl -e "print q{INSERT IGNORE INTO foo (group, value) (SELECT ?, value
> >> FROM bar WHERE value LIKE '%'||?||'%'};"
>
> > Hi again,
>
> > OK this is embarrassing: I found the bug that prevented my query to be
> > executed at all. I am very sorry for waisting your time. If it is any
> > consolation, I learn quite a bit from reading the DBI doc over and
> > over again.
>
> > Thanks you very much for your help and enjoy the rest of your week-
> > end,
>
> > Tom
>
> I wouldn't worry to much about any embarrassment :)  Besides your
> excerpt from the docs show I that I
> probably didn't need to work around LIKE the way that I did.  I'll be
> looking into my own code
> next week to see what was going on there as a result of this
> discussion.  Anyway I'm curious
> about the bug or problem that you found if you want to expose it.  If
> not, no worries.

I certainly don't mind telling you my mistake but it was not DBI or
SQL related. Let me add a little context to the code I posted
previously:

my $query = 'INSERT IGNORE INTO foo (group, value) (SELECT ?, value
FROM bar WHERE value LIKE ?);';
my $sth = $dbh->prepare($query);

sub function($$) {
   my $value = shift();
   my $group = shift();
   if ($value !~ m/(\w*)/) {
      my $pattern = '%' . $value . '%';
      $sth->execute($group, $pattern) or die($sth->errstr);
   }
}

I don't want to run the query if the value starts and ends by
parenthesis but I forgot the I needed to escape them in my regular
expression or else they are considered grouping operators :(

Thanks again,

Tom

Reply via email to