Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Extracting only required length in a column in perl DBI

by Thomas Kennll (Acolyte)
on Jan 15, 2013 at 12:30 UTC ( [id://1013380]=perlquestion: print w/replies, xml ) Need Help??

Thomas Kennll has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, I'm trying to connect to an oracle DB and extract 3 columns from, I need to extract only 1st 3 characters in each column. I used unpack. But, its not working.. Can someone help.. My code is as below..
#!/usr/bin/perl #use strict; use DBI; my $user = "qwer"; my $passwd = "qwer"; my $server = "asdf"; my $database='rd_db'; my $dbd='Sybase'; my $an_dt_file = "an_dt_file"; # Connect to the database my $dbh = DBI->connect($server,$user,$passwd,$dbd, {RaiseError => 1,Au +toCommit => 1 }); # Prepare the SQL query for execution my $sql = "SELECT $ans_rid, $ans_qcn, $ans_loc FROM ft_int_tbl WHERE $ +ans_rid is not null"; my $sth = $dbh->prepare($sql) or die "Couldn't prepare statement:$DBI: +:errstr; stopped"; # Execute the query $sth->execute() or die "Couldn't execute statement: $DBI::errstr; stop +ped"; #open JKLL, ">$an_dt_file" or die "can't open file $ansb_detail_file f +or write,\n"; # Fetch each row and print it while ( my ($ans_rid, $ans_qcn, $ans_loc) = $sth->fetchrow_array() ) { my ($ansb_cktid, $ansb_mcn, $ansb_soc) = unpack("A3 A3 A3", $_); #print JKLL"Field 1: $ansb_cktid Field 2:$ansb_mcn Field 3: $ansb_soc +\n"; print "Field 1: $ansb_cktid Field 2:$ansb_mcn Field 3: $ansb_soc \n"; } # Disconnect from the database $dbh->disconnect();

Replies are listed 'Best First'.
Re: Extracting only required length in a column in perl DBI
by marto (Cardinal) on Jan 15, 2013 at 12:37 UTC

    If you only need the first three characters of each column, why not simply ask for that when doing your query? For example:

    SELECT SUBSTR(COL1, 0, 3) FROM TABLENAME;

    Consider using place holders where possible, See DBI and Bobby Tables.

      That will work.. But, I actually wanted to extract 6 characters for the 3 column... How do I achieve that??

        Replace the 3 in my example with a 6, you should consider learning basic SQL.

      Nitpick: even though substr() is implemented in most sql dialects, the standards-compliant function is substring(col1 from 1 for 3)

        OP stated they're using Oracle, substring(col1 from 1 for 3) doesn't work (ORA-00907). substr.

Re: Extracting only required length in a column in perl DBI
by Tux (Canon) on Jan 15, 2013 at 13:37 UTC

    I'm not sure you pasted actual code, as that would warn a lot. Why did you comment 'use strict;'? And why is 'use warnings;' missing? I am absolutely sure it will give you all the hints you need …

    my $dbh = DBI->connect($server,$user,$passwd,$dbd, {RaiseError => 1,Au +toCommit => 1 }); ^? read the docs again # Prepare the SQL query for execution my $sql = "SELECT $ans_rid, $ans_qcn, $ans_loc FROM ft_int_tbl WHERE $ +ans_rid is not null"; ^? ^? ^? ^ +? my $sth = $dbh->prepare($sql) or die "Couldn't prepare statement:$DBI: +:errstr; stopped"; ^? you set RaiseError, so you'll never g +et that # Execute the query $sth->execute() or die "Couldn't execute statement: $DBI::errstr; stop +ped"; ^? same here #open JKLL, ">$an_dt_file" or die "can't open file $ansb_detail_file f +or write,\n"; # Fetch each row and print it while ( my ($ans_rid, $ans_qcn, $ans_loc) = $sth->fetchrow_array() ) { my ($ansb_cktid, $ansb_mcn, $ansb_soc) = unpack("A3 A3 A3", $_); ^? what do + you expect to be in $_ #print JKLL"Field 1: $ansb_cktid Field 2:$ansb_mcn Field 3: $ansb_soc +\n"; print "Field 1: $ansb_cktid Field 2:$ansb_mcn Field 3: $ansb_soc \n"; } ==> corrected based on guesses, as I have no idea my $dbh = DBI->connect ($server, $user, $passwd, { RaiseError => 1, PrintError => 1, # Comes in very handy when you are runni +ng into trouble ShowErrorStatement => 1, # this too AutoCommit => 1, }); # Prepare the SQL query for execution my $sql = "SELECT ans_rid, ans_qcn, ans_loc FROM ft_int_tbl WHERE ans_ +rid is not null"; my $sth = $dbh->prepare ($sql); # Execute the query $sth->execute (); #open JKLL, ">$an_dt_file" or die "can't open file $ansb_detail_file f +or write,\n"; # Fetch each row and print it while (my ($ans_rid, $ans_qcn, $ans_loc) = $sth->fetchrow_array ()) { my ($ansb_cktid, $ansb_mcn, $ansb_soc) = unpack "A3 A3 A3", $ans_l +oc; print "Field 1: $ansb_cktid Field 2:$ansb_mcn Field 3: $ansb_soc \ +n"; }

    Enjoy, Have FUN! H.Merijn
      Tux,
      while (my ($ans_rid, $ans_qcn, $ans_loc) = $sth->fetchrow_array ()) { my ($ansb_cktid, $ansb_mcn, $ansb_soc) = unpack "A3 A3 A3", $ans_l +oc;
      This unpacks only the 3rd column ie, $ans_loc... I wanted to unpack all the 3 columns..ie, $ans_rid, $ans_qcn, $ans_loc and have the values stored in $ansb_cktid, $ansb_mcn, $ansb_soc..
        Then you need to unpack all 3, you can't unpack three variables at once AFAIK. The "A3 A3 A6" is a format for unpacking one variable, as Tux showed in the example. You could just used substrings,
        $ans_rid = substr($ans_rid, 0, 3); $ans_qcn = substr($ans_qcn, 0, 3); $ans_loc = substr($ans_loc, 0, 6);
        ..or make new variables for each substr() leaving the original variable intact.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1013380]
Front-paged by Arunbear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2024-04-25 15:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found