2009-11-13 23 views
5

SQL*Plus kullanarak bir tabloya bağlanmaya çalışıyorum ve Perl komut dosyasındaki verileri getirip bu çıkışı bir Perl değişkeninde saklıyorum.SQL * Artı içinde Perl betiği

SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF 
    ${SQLPLUS_SETTINGS} 
    select foo||'|'||bar ||'|'|| xyz from temp where dfg='some'; 
    exit; 
    EOF` 

Ama nasıl Perl yapabilirsiniz: Bunu yapacağını bir kabuk komut dosyası olarak

?

cevap

10

DBI modülüne bakın. Aslında, ona adanmış bir web sitesi var: dbi.perl.org. Ayrıca, the CPAN module reference for DBI'a bakın. İşte

the first DBI tutorial on google düz bir kod örnek:

use DBI; 

    my $dbh = DBI->connect('DBI:Oracle:payroll') 
     or die "Couldn't connect to database: " . DBI->errstr; 
    my $sth = $dbh->prepare('SELECT * FROM people WHERE lastname = ?') 
     or die "Couldn't prepare statement: " . $dbh->errstr; 

    $sth->execute($lastname)    # Execute the query 
     or die "Couldn't execute statement: " . $sth->errstr; 

    # Read the matching records and print them out   
    while (@data = $sth->fetchrow_array()) { 
     my $firstname = $data[1]; 
     my $id = $data[2]; 
     print "\t$id: $firstname $lastname\n"; 
    } 
    if ($sth->rows == 0) { 
     print "No names matched `$lastname'.\n\n"; 
    } 
    $sth->finish; 
    print "\n"; 
    print "Enter name> "; 

    $dbh->disconnect; 

Perl Ayrıca EOF tarzı satırlı yorumu var;

my $query = <<'END_QUERY'; 
${SQLPLUS_SETTINGS} 
select foo||'|'||bar ||'|'|| xyz from temp where dfg='some'; 
exit; 
END_QUERY 
4

tavsiye DBII iyidir kullanmak ve veritabanları karşı Perl komut dosyalarını programlamak isteyen konum kesinlikle sağ yolu şeyler yapmak: Böyle uzun bir sorgu yapabilirsiniz. Özellikle komut SQL * Plus istiyorsanız

Ancak, tam soruyu cevaplamak için, bir Perl script ile bunu yapmak için sözdizimi kabuk sürümü

my $connect_string = 'scott/[email protected]'; 
my $sqlplus_settings = ''; 
my $result = qx { sqlplus $connect_string <<EOF 
$sqlplus_settings 
select 1 from dual; 
exit; 
EOF 
}; 
print $result; 

kullandığım qx operatör oldukça benzerdir Orada, sadece bir backtick formunun şeklidir, brace sınırlı blok içindeki her şey bir subshell tarafından çalıştırılır ve çıktı ödeve geri döndü. Değişkenler genellikle Perl'de üst kılıf değildir.

+0

Ayrıca bir kabuk komut dosyası yazmayı ve quesry çıktı sonucunu döndürmeyi düşünüyorum ve ayrıca bu kabuk betiğine perl script.html içinde de aramak istiyorum. – Vijay

+2

emin - backticks veya qx() içindeki herhangi bir şey alt kabuk olarak çalıştırılacak ve çıktı benzer şekilde yakalanacaktır. Bir kez daha, bunun perl programını yapılandırmak için çok iyi bir yol olduğunu düşünmüyorum. – cms

+0

Bu, qx alıntı mekanizmasının harika bir kullanımıdır ve tek seferlik senaryo senaryolarında, bu gitmek için iyi bir yol olabilir. –

1

birkaç şey:

  • DBII kesinlikle gitmek için en iyi yoldur. Ancak, "hala" ile ilgili bir Oracle sorusuna verdiğim bir önceki cevaba dikkat edin: How can I use a database server from a Perl CGI script?

  • SQL * çok uzunsa SQL * Plus bir hata atar. Sabit bir çizgi uzunluğu arabelleğe sahip (Ne olduğunu hatırlayamıyorum ama Oracle 8 ile 2000 karakterinin altında olduğunu düşünüyorum). Belki de bir geçici çözüm (satırları bölme? Yapılandırma ayarları?) Olabilir ama DBI'ye bu ve diğer nedenlerden dolayı en iyi çözümü buldum.

Uyarı: Yukarıda Bütün bilgiler Oracle 8. dayanmaktadır

/I3az/

bu tip Herhangi bir soru çünkü DBI kullanamaz" ile başında edilmelidir
1

... "Çünkü mümkünse DBI'yi gerçekten kullanmak istiyorsun. Kullanmamak için iyi sebepleriniz olabilir, ama belki, nedeninizin neden çok iyi olmadığını ve bununla ilgili ne yapacağınızı söyleyebiliriz. Bu, çatal ve dosya eleklerini kullanarak ve bir seferde bir satır çıktı almanızı istediklerinizi yapmanın bir yoludur (uyarı: bu gibi bir işleme çok fazla yazdırırsanız, arabellek sorunları nedeniyle engellenebilir):

use strict; 
use warnings; 

pipe(my($p_rdr, $c_wtr)) or die "Err: $!"; 
pipe(my($c_rdr, $p_wtr)) or die "Err: $!"; 
my $pid = fork; 
die "Could not fork: $!" unless defined $pid; 
unless ($pid) { 
    close $p_rdr; 
    close $p_wtr; 
    open(STDOUT, ">&=", $c_wtr) or die "dup: $!"; 
    open(STDIN, "<&=", $c_rdr) or die "dup: $!"; 
    print "Exec sqlplus\n"; 
    exec qw(sqlplus user/[email protected]); 
    die "Could not exec: $!"; 
} 
close $c_wtr; 
close $c_rdr; 
print "Print sql\n"; 
print $p_wtr "select * from table_name where col1 = 'something';\n"; 
print "Close fh\n"; 
close $p_wtr; 

print "Read results\n"; 
while (<$p_rdr>) { 
    print "O: $_"; 
} 
close $p_rdr;