[SP-pm] DBIx::Class::Schema - Problemas com insert

Thiago Rondon thiago at aware.com.br
Tue Jun 16 09:21:09 PDT 2009


Eu não disse que foi o Oracle que retornou, eu disse que você esta 
usando Oracle pelo código.  (*nextval no resultset->create)  ;-)

Procurando pelo código do DBIx Class do Oracle, encontrei:
(http://cpansearch.perl.org/src/RIBASUSHI/DBIx-Class-0.08103/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm)

Veja se ler esta função do DBIx Class te ajuda, o problema ainda me 
parece em relação a sequencia, talvez como ela esta sendo invocada ou 
algo assim.

sub _dbh_get_autoinc_seq {
  my ($self, $dbh, $source, $col) = @_;

  # look up the correct sequence automatically
  my $sql = q{
    SELECT trigger_body FROM ALL_TRIGGERS t
    WHERE t.table_name = ?
    AND t.triggering_event = 'INSERT'
    AND t.status = 'ENABLED'
  };

  # trigger_body is a LONG
  $dbh->{LongReadLen} = 64 * 1024 if ($dbh->{LongReadLen} < 64 * 1024);

  my $sth;

  # check for fully-qualified name (eg. SCHEMA.TABLENAME)
  if ( my ( $schema, $table ) = $source->name =~ /(\w+)\.(\w+)/ ) {
    $sql = q{
      SELECT trigger_body FROM ALL_TRIGGERS t
      WHERE t.owner = ? AND t.table_name = ?
      AND t.triggering_event = 'INSERT'
      AND t.status = 'ENABLED'
    };
    $sth = $dbh->prepare($sql);
    $sth->execute( uc($schema), uc($table) );
  }
  else {
    $sth = $dbh->prepare($sql);
    $sth->execute( uc( $source->name ) );
  }
  while (my ($insert_trigger) = $sth->fetchrow_array) {
    return uc($1) if $insert_trigger =~ m!(\w+)\.nextval!i; # col name 
goes here???
  }
  $self->throw_exception("Unable to find a sequence INSERT trigger on 
table '" . $source->name . "'.");
}

Abs,
-Thiago Rondon

Andre Carneiro escreveu:
> Não é o Oracle q me retorna essa mensagem, é o DBIx::Class::ResultSet.
>
> Não tem nenhum ORAxxx erro da vida...
>
> Se eu comento a chamada para a sequence, o erro continua ocorrendo.
>
> Além disso, eu testei a mesma sequence diretamente no banco de dados e 
> funcionou perfeitamente, e com DBI puro e também funcionou.
>
> No momento eu to fuçando alguma coisa q talvez seja necessário definir 
> na classe que representa a minha tabela. Mas é um 'chute' apenas...
>
>
> Cheers!
>
>
>
> 2009/6/16 Thiago Rondon <thiago em aware.com.br <mailto:thiago em aware.com.br>>
>
>
>     Andre,
>
>     Isto parece Oracle (*nextval). :-) E tomando como base de que é
>     Oracle.
>
>     Parece que a sequencia/trigger não esta sendo encontrada na hora
>     de inserir, e ele não esta conseguindo acessar o teu
>     'some_sequence.nextval' para incrementar o número. Verifique como
>     esta a tua sequencia para auto-incremento do campo processo_id.
>
>     Abs,
>     -Thiago Rondon
>
>     Andre Carneiro escreveu:
>
>         Olá monges!
>
>
>         Estou com um pequeno problema para inserir dados com
>         DBIx::Class::Schema
>         Tenho uma classe q representa a seguinte tabela abaixo:
>
>         <code>
>
>         package DBIC::Schema::Processo;
>
>         use strict;
>         use warnings;
>
>         use base 'DBIx::Class';
>
>         __PACKAGE__->load_components("Core");
>         __PACKAGE__->table("processo");
>         __PACKAGE__->add_columns(
>          "processo_id",
>          { data_type => "INTEGER", is_nullable => 0, size => undef },
>          "fornecedor_id",
>          { data_type => "INTEGER", is_nullable => 0, size => undef },
>
>
>         );
>         __PACKAGE__->set_primary_key("processo_id");
>
>
>         1;
>         </code>
>
>
>         Para inserir estou usando o seguinte codigo:
>
>
>         <code>
>
>                    $schema->resultset('Processo')->create({
>                                processo_id        =>
>         \'some_sequence.nextval'
>                                fornecedor_id        => $self->spider_id
>                    });
>
>
>         </code>
>
>
>         Estou obtendo a seguinte mensagem de erro:
>
>         " DBIx::Class::ResultSet::create(): Unable to find a sequence
>         INSERT trigger on table 'processo' "
>
>
>         Não consigo encontrar o motivo disso. Isso nunca aconteceu
>         antes. Será que alguém poderia me ajudar?
>
>
>
>         Obrigado!
>
>
>
>
>
>
>
>
>         -- 
>         André Garcia Carneiro
>         Analista/Desenvolvedor Perl
>
>         ------------------------------------------------------------------------
>
>         _______________________________________________
>         SaoPaulo-pm mailing list
>         SaoPaulo-pm em pm.org <mailto:SaoPaulo-pm em pm.org>
>         http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
>
>     _______________________________________________
>     SaoPaulo-pm mailing list
>     SaoPaulo-pm em pm.org <mailto:SaoPaulo-pm em pm.org>
>     http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
>
>
>
> -- 
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm



More information about the SaoPaulo-pm mailing list