[SP-pm] DBI Metodo Connect

André Garcia Carneiro andre.garcia.carneir em terra.com.br
Quinta Abril 24 05:20:38 PDT 2008


---------- Cabeçalho original -----------

De: saopaulo-pm-bounces+andre.garcia.carneir=terra.com.br em pm.org
Para: saopaulo-pm em mail.pm.org
Cópia: 
Data: Wed, 23 Apr 2008 17:52:08 -0300
Assunto: [SP-pm] DBI Metodo Connect

> Boas Monges!
> 
> Estou tentando fazer uma conexão Perl->Oracle e estou quaaaaaaase
> conseguindo... se não fose pelo "quase" =]
> 
> Consegui instalar o DBI, DBD::Oracle sem maiores "problemas" graças a outras
> mensagens da lista.
> 
> Seguindo informações que coletei também na lista, montei um arquivo simples
> para testar a conexão, no entanto um erro persiste: Can't locate object
> method "connect" via package "DBI" (perhaps you forgot to load "DBI"?) at
> test.pl line 8.
> 
> Está ali o comentário da linha: (# Esta linha REQUER que você tenha
> instalado com sucesso o módulo DBD::Oracle.) E sim, eu consegui instalar,
> inclusive antes de eu instalar tudo dava erro na linha use DBI.
> 
> Abaixo o código que estou utilizando:
> 
> <code>
> #!/usr/bin/perl
> use warnings;     # IMPORTANTE: ajuda para novatos.
> use strict;       # MAIS IMPORTANTE: sanidade mental para todas as idades.
> use Data::Dumper; # Para imprimir os dados sem muito trabalho
> use DBI;          # Indispensável para acessar bases de dados ;-)
> 
> # Esta linha REQUER que você tenha instalado com sucesso o módulo
> DBD::Oracle.
> my $dbh = DBI->connect( 'dbi:Oracle:database', 'usuario', 'senha' );

Humm... se não me engando tá faltando o nome do banco de dados, o SID .. Talvez devesse tentar algo do tipo:


my $dbh    =
DBI->connect('DBI:Oracle:database='.$dbname;host=$dbhost;sid='$sid,$user,$password,{RaiseError=>1,AutoCommit=>0});




> die $dbh->errstr unless $dbh; # isto é tratamento de erro, do mais simples.

die não é uma boa opção. Tente tratar o seu erro de uma forma melhor ok? Leia sobre eval, e sobre o módulo
Error(CPAN).


> 
> my $statement;
> eval {
>    my $query = q{SELECT * FROM USER_TABLES};
>    $statement = $dbh->prepare( $query );
>    $statement->execute;
> };
> die if $@; # isto é tratamento de erro, dos mais simples, de novo.

Evite o die! Die para o seu programa! A não ser que seja isso mesmo que você quer...
Tente isso:

if($@){
       print "\nERRO: Não foi possível executar a query: $@";
       $self->log('error',$@); #método fictício para escrever log
}

.
.
.



> 
> eval { # Use eval() aqui para prevenir falhas durante a leitura dos dados.
>     # usa um Oracle Cursor, percorre o DataSet devolvido pela query.
>     while( my $row = $statement->fetchrow_hashref ) {
>         # Aqui você pode fazer alguma coisa com os seus dados.
>         # imprimir, por exemplo:
>         print Dumper( $row ), $;
>     }
> };
> die if $@; # tratamento de erros
> 
> eval {
>     $statement->finish; # Desaloque os recursos usados.
>     $dbh->disconnect;   # Seja explícito, ou o Oracle te morde!
> };
> die if $@; # tratamento de erros, não esquece!
> __END__
> </code>
> 
> Durante o processo de instalação do DBI e DBD::Oracle tive problemas na
> instalação sempre na linha do DBI que declarava "DBI 1.52". Entendi que
> referia-se a versão e fui no cpan verficar com o comando $DBI::VERSION que
> sempre me retorna vazio.

Isso não parece nada bom. Verifique suas variáveis de ambiente, e certifique-se que elas são incializadas com o
usuário do oracle, ou com o usuário que irá utilizá-lo. Variáveis de ambiente:

ORACLE_HOME
ORACLE_BIN
LD_LIBRARY_PATH
ORACLE_SID
ORACLE_BASE
ORACLE_OWNER

etc..

Depois cheque as permissões nos diretórios de instalação do Oracle. 



Espero ter ajudado:


Cheers!
 
> Estou utilizando Debian e meu client Oracle já está instalado e funcionando
> (faço conexão com o PHP e tudo ok).
> 
> Grato,
> 
> -- 
> Marcos Carmello
> mcarmello em gmail.com
> 

--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org



Mais detalhes sobre a lista de discussão SaoPaulo-pm