[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