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

Andre Carneiro andregarciacarneiro at gmail.com
Tue Jun 16 11:47:31 PDT 2009


2009/6/16 Thiago Rondon <thiago at aware.com.br>

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

Eu entendi! Na verdade só quis deixar claro q não era o Oracle q tava me
retornando o erro... :)


>
> 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.



Eu achei essa função abaixo também. Mas basta declarar a sequence, como
demonstrado no link q vc mandou acima. Desse jeito:

<code>

__PACKAGE__->add_columns(
  "processo_id" => { sequence => 'some_sequence', auto_nextval => 1 },
  "fornecedor_id",
  { data_type => "INTEGER", is_nullable => 0, size => undef },);

__PACKAGE__->set_primary_key("processo_id");
__PACKAGE__->sequence('seq_processo');


</code>


A função abaixo foi  necessária.



Valeu!



>
>
> 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 . "'.");
> }
>
>
-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20090616/30c35fea/attachment.html>


More information about the SaoPaulo-pm mailing list