Here is something for a very similar case:

I am reading in lines from a file, and writing them into a database.
Before I do, I do these two lines:

        $_ =~ s/\'/\''/g;  #Replace any single quotes with a pair of single
quotes.
        $_ =~ s/\"/\'/g;  #Replace any double quotes with single quotes
(SQL likes them better that way).

In practice (full working script, no substitutions or snips):

#!/usr/bin/perl

use DBI;

$data_source = "dbi:ODBC:rtsales";
$driver_name = "ODBC";

@driver_names = DBI->available_drivers;
@data_sources = DBI->data_sources($driver_name, \%attr);


$dbh = DBI->connect($data_source, $username, $auth, \%attr);


#The following lines decide what to use
#as a log file.  If one was supplied as an
#argument at the command line, we'll use
#it.  If not, default to "db_log.log"
$log = "db_log.log";
if (@ARGV[0] ne ""){
    $log = @ARGV[0];
}
open (LOG, ">>$log");


print LOG "Database write script launched.\n";

@inFile = ("rtstr", "rtslsd", "rtsal", "rtsales", "rtweek", "rtwhist",
"rtrates");

foreach $inFile (@inFile){

    open (IN, "<$inFile" . ".csv") || die "Could not open $inFile.\n";


    $count = 0;
    $errors = 0;

    print LOG "\nBeginning insert into table $inFile...   \n";

    while (<IN>){
        $_ =~ s/\'/\''/g;
        $_ =~ s/\"/\'/g;

        #Note:  The following 'insert' sytax works ONLY if you are trying
to
        #insert the same number of fields that exists in the table.
        $statement = "insert into $inFile values ($_)";
        $result  = $dbh->do($statement);
        if ($result != 1){
            print LOG "Result of $statement is: $result.\n";
            $errors++;
        }
        $count++;
        break;
    }

    print LOG "Completed insert of $count records into table $inFile,
$errors errors.\n";

    close IN;

}

    #This statement populates two fields of the table RTSAL with the values
of two fields in RTSALES.  In the application I replaced, a fat client
    #(Rumba software) downloaded the RTSAL data file with the two fields
using a 'JOIN' from the DB2 tables RTSAL and RTSALES.  Since
    #I use FTP to get this data, I don't have that option.
    $statement = "UPDATE RTSAL INNER JOIN RTSALES ON (RTSAL.STORE =
RTSALES.STORE) AND (RTSAL.FISMM = RTSALES.FISMM) AND (RTSAL.FISYY =
RTSALES.FISYY) SET RTSAL.SALESTY = [rtsales].[salesty], RTSAL.SALESBUDTY
= [rtsales].[salesbudty]";
    $result  = $dbh->do($statement);
    print LOG "Result of $statement is: $result.\n";







$dbh->disconnect;

    #The rest of this stuff is part of the rest of the application, which
is a series of scripts which each do their
    #part, then call the next part.  The first script of the lot opens LOG
with a single '>', the rest with a '>>', so that
    #each time the application is started, I create a new log file, but
each segment of the app appends to the same.
    print LOG "Writing rttime.html now.\n";
    $result = `rttime.pl`;
    print LOG "Launching Epix & AS/400 FTPs now.\n";
    $result = `epix_ftp.pl $log`;

#end of code

Hope this is helpful to someone.  I'm looking forward to all the "here's a
better way to do such-and-such" e-mails I know I'll get.  :o)  I really
appreciate those things.

Shawn




                                                                                       
                                
                    felix_geerinckx@h                                                  
                                
                    otmail.com               To:     [EMAIL PROTECTED]                
                                
                                             cc:                                       
                                
                    10/18/2002 02:24         bcc:                                      
                                
                    PM                       Subject:     Re: Single Quote marks in a 
string                           
                                                                                       
                                
                                                                                       
                                




on do, 17 okt 2002 08:01:07 GMT, Andrew Hubbard wrote:

>      I'm having problems with a text file I'm working on. I need to
>      get
> the descriptions in from the text file and into a
> string for use in an SQL statement however some of the descriptions
> use a single quote mark in the description.
> This of course stops the sql statement from working.
>
> How can I get around this? I don't want to remove the quote.

Use placeholders, like so:

    my $sth = $dbh->prepare("INSERT INTO atable VALUES(?,?)");
    my $value1 = "Looks like 'single' quotes";
    my $value2 = "No single quotes here";
    $sth->execute($value1, $value2);

    my $rset = $dbh->selectall_arrayref( qq{
        SELECT
            atable.afield,
            atable.anotherfield
        FROM atable
        WHERE
            atable.anotherfield = ?
    }, undef, $avalue);


--
felix

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]







**********************************************************************
This e-mail and any files transmitted with it may contain 
confidential information and is intended solely for use by 
the individual to whom it is addressed.  If you received
this e-mail in error, please notify the sender, do not 
disclose its contents to others and delete it from your 
system.

**********************************************************************


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to