2011-09-22 14 views
5

L'accesso alla lettura dal db mi è stato dato tramite procedure memorizzate mssql che restituiscono serie di risultati anziché tabelle o viste. Ma voglio essere in grado di leggere i dati usando ORM.È possibile utilizzare DBIx :: Class con stored procedure anziché con tabelle?

Ho provato a utilizzare DBIx::Class::ResultSource::View per eseguire la chiamata di procedura (ad esempio EXEC my_stored_proc ?) come una query personalizzata ma questo non ha funzionato perché ha tentato di convertire la chiamata di procedura in un'istruzione select.

Qualcuno ha un altro suggerimento?

risposta

5

No, non c'è modo ragionevole per eseguire una stored procedure nel contesto di DBIx :: Class.

Per quanto posso dire, la cosa più vicina ad una soluzione sta "utilizzando l'ORM" per ottenere un handle di database, che è zuppa debole:

my @results = $schema->storage->dbh_do(sub{ 
     my ($storage, $dbh, @args) = @_; 
     my $sth = $dbh->prepare('call storedProcNameFooBar()'); 
     my @data; 
     $sth->execute(); 
     while(my $row = $sth->fetchrow_hashref){ 
      push @data, $row; 
     } 
     return @data; 
    },()); 

[vedi dettagli a http://metacpan.org/pod/DBIx::Class::Storage::DBI#dbh_do]

... in quanto non ottieni nessuno dei vantaggi di un ORM per il tuo problema.

+0

La sezione 'DBIx :: Classe :: Manuale :: Libro di cucina' 'Utilizzo delle funzioni del database o delle stored procedure', sebbene @stevenl abbia sottolineato che non sarà di aiuto con MS SQL Server, poiché apparentemente non può accedere ad una stored procedure tramite una dichiarazione SELECT. – LeeGee

+1

né Mysql, e la mia ipotesi non è nemmeno Oracle. Mi chiedo se la DBIx: l'autore del manuale di classe si stia inventando. – djsadinoff

+0

Infatti - e quale sarebbe il comportamento previsto? In che modo DBIC sa con quale ResultSet associare i dati restituiti dalla stored procedure o dalla funzione? Penso che l'autore abbia significato "funzione" come nella funzione SQL, poiché "lunghezza" è l'esempio. Questo non spiega come è stata aggiunta la "stored procedure". – LeeGee

-2

È possibile utilizzare register_source

package My::Schema::User; 

    use base qw/DBIx::Class/; 

    # ->load_components, ->table, ->add_columns, etc. 

    # Make a new ResultSource based on the User class 
    my $source = __PACKAGE__->result_source_instance(); 
    my $new_source = $source->new($source); 
    $new_source->source_name('UserFriendsComplex'); 

    # Hand in your query as a scalar reference 
    # It will be added as a sub-select after FROM, 
    # so pay attention to the surrounding brackets! 
    $new_source->name(\<<SQL); 
    (SELECT u.* FROM user u 
    INNER JOIN user_friends f ON u.id = f.user_id 
    WHERE f.friend_user_id = ? 
    UNION 
    SELECT u.* FROM user u 
    INNER JOIN user_friends f ON u.id = f.friend_user_id 
    WHERE f.user_id = ?) 
    SQL 

    # Finally, register your new ResultSource with your Schema 
    My::Schema->register_source('UserFriendsComplex' => $new_source); 

Per chiamare con i parametri procedere nel modo seguente

my $friends = [ $schema->resultset('UserFriendsComplex')->search({ 
+}, 
    { 
     bind => [ 12345, 12345 ] 
    } 
) ]; 
+0

Questa soluzione sembra molto simile a ciò che ho fatto utilizzando ResultSource :: View. Il problema con questo approccio è la parte in cui aggiunge la mia chiamata sproc come sottoselezione. La query generata sarà simile a questa: 'SELECT me.x FROM (EXEC my_stored_proc?) Me' che causa un errore di sintassi e l'istruzione non può essere preparata. Suppongo che questo problema non sia specifico per mssql dato che non vedo altre piattaforme con una sintassi compatibile. – stevenl

+1

Questo non risponde alla domanda. Non c'è nessuna procedura memorizzata qui. – djsadinoff

Problemi correlati