2011-09-22 18 views
5

डीबी से पढ़ने की पहुंच मुझे mssql संग्रहीत प्रक्रियाओं के माध्यम से दी गई है जो टेबल या दृश्यों के बजाय परिणाम सेट लौटाती है। लेकिन मैं ओआरएम का उपयोग कर डेटा को पढ़ने में सक्षम होना चाहता हूं।क्या डीबीआईएक्स :: कक्षाओं के बजाय संग्रहित प्रक्रियाओं के साथ कक्षा का उपयोग किया जा सकता है?

मैंने कस्टम कॉल के रूप में प्रक्रिया कॉल (उदा। EXEC my_stored_proc ?) करने के लिए DBIx::Class::ResultSource::View का उपयोग करने का प्रयास किया लेकिन यह काम नहीं किया क्योंकि यह प्रक्रिया कॉल को एक चयनित कथन में बदलने की कोशिश की गई।

क्या किसी के पास कोई और सुझाव है?

उत्तर

5

आप उपयोग कर सकते हैं 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); 

मानकों के साथ कॉल करने के लिए नहीं, DBIx :: कक्षा के संदर्भ में एक संग्रहीत प्रक्रिया निष्पादित करने के लिए कोई उचित तरीका है।

जहां तक ​​मेरा बताओ, एक समाधान के निकटतम बात एक डेटाबेस संभाल, जो कमजोर सूप है पाने के लिए "ORM का उपयोग कर" है कर सकते हैं:

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; 
    },()); 

[पर http://metacpan.org/pod/DBIx::Class::Storage::DBI#dbh_do विवरण देखने]

... क्योंकि आपको अपनी परेशानी के लिए ओआरएम के लाभों में से कोई भी लाभ नहीं मिलता है।

+0

'डीबीआईएक्स :: कक्षा :: मैनुअल :: कुकबुक' दस्तावेज़ अनुभाग 'डेटाबेस फ़ंक्शंस या संग्रहीत प्रक्रियाओं का उपयोग करना', हालांकि @stevenl ने इंगित किया है कि यह एमएस एसक्यूएल सर्वर के साथ मदद नहीं करेगा, क्योंकि यह स्पष्ट रूप से संग्रहीत प्रक्रिया तक नहीं पहुंच सकता है एक चयन कथन के माध्यम से। – LeeGee

+1

न ही MySQL, और मेरा अनुमान ओरेकल नहीं है। मुझे आश्चर्य है कि क्या डीबीआईएक्स: क्लास मैनुअल लेखक बस इसे बना रहा है। – djsadinoff

+0

दरअसल - और अपेक्षित व्यवहार क्या होगा? डीबीआईसी कैसे पता लगाएगा जिसके परिणामस्वरूप संग्रहीत प्रक्रिया या कार्य द्वारा लौटाए गए डेटा को संबद्ध करना है? मुझे लगता है कि लेखक का अर्थ 'फंक्शन' एसक्यूएल-फ़ंक्शन में है, क्योंकि 'लंबाई' उदाहरण है। यह समझा नहीं जाता कि 'संग्रहीत प्रक्रिया' कैसे जोड़ा गया। – LeeGee

-2

निम्न उपाय अपनाते हैं

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

यह समाधान परिणाम स्रोत :: व्यू का उपयोग करके किए गए कार्यों के समान ही दिखता है। इस दृष्टिकोण के साथ समस्या वह हिस्सा है जहां यह मेरे स्पोक कॉल को उप-चयन के रूप में जोड़ती है। जेनरेट की गई क्वेरी इस तरह दिखेगी: 'मुझे चुनें। एक्सईसी (EXEC my_stored_proc?) Me' जो वाक्यविन्यास त्रुटि का कारण बनता है और कथन तैयार नहीं किया जा सकता है। मुझे लगता है कि यह समस्या mssql के लिए विशिष्ट नहीं होगी क्योंकि मुझे अन्य प्लेटफार्मों को संगत वाक्यविन्यास नहीं दिख रहा है। – stevenl

+1

यह सवाल का जवाब नहीं देता है। यहां कोई संग्रहित प्रक्रिया नहीं है। – djsadinoff