2011-09-22 33 views
5

Quyền truy cập để đọc từ db đã được trao cho tôi qua các thủ tục được lưu trữ mssql trả về các tập hợp kết quả thay vì các bảng hoặc các khung nhìn. Nhưng tôi muốn có thể đọc dữ liệu bằng cách sử dụng ORM.Có thể DBIx :: Lớp được sử dụng với các thủ tục được lưu trữ thay vì các bảng không?

Tôi đã cố gắng sử dụng DBIx::Class::ResultSource::View để thực hiện cuộc gọi thủ tục (ví dụ: EXEC my_stored_proc ?) làm truy vấn tùy chỉnh nhưng điều này không hiệu quả vì nó cố chuyển đổi cuộc gọi thủ tục thành câu lệnh chọn.

Có ai có đề xuất nào khác không?

Trả lời

5

Không, không có cách nào hợp lý để thực hiện một thủ tục lưu trữ trong bối cảnh DBIx :: Class.

Theo như tôi có thể nói, điều gần gũi nhất với một workaround được "sử dụng ORM" để có được một xử lý cơ sở dữ liệu, đó là súp yếu:

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

[xem chi tiết tại http://metacpan.org/pod/DBIx::Class::Storage::DBI#dbh_do]

... vì bạn không nhận được lợi ích nào của ORM vì sự cố của bạn.

+0

Phần 'DBIx :: Class :: Manual :: Cookbook' docs' Sử dụng chức năng cơ sở dữ liệu hoặc thủ tục lưu sẵn ', mặc dù @stevenl đã chỉ ra rằng nó sẽ không hỗ trợ MS SQL Server, vì nó dường như không thể truy cập một thủ tục lưu sẵn thông qua câu lệnh SELECT. – LeeGee

+1

cũng không phải Mysql, và dự đoán của tôi cũng không phải là Oracle. Tôi tự hỏi liệu DBIx: Class author tác giả chỉ là làm cho nó lên. – djsadinoff

+0

Thật vậy - và hành vi mong đợi là gì? Làm cách nào DBIC biết được ResultSet nào kết hợp dữ liệu được trả về bởi thủ tục hoặc hàm được lưu trữ? Tôi nghĩ rằng tác giả có nghĩa là 'chức năng' như trong hàm SQL, như 'chiều dài' là ví dụ. Điều đó không giải thích cách 'thủ tục lưu trữ' được thêm vào. – LeeGee

-2

Bạn có thể sử dụng 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); 

Để gọi với các thông số thực hiện như sau

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

Giải pháp này trông rất giống với những gì tôi đã làm bằng cách sử dụng ResultSource :: View. Vấn đề với cách tiếp cận này là một phần mà nó thêm cuộc gọi sproc của tôi như là một lựa chọn phụ. Truy vấn được tạo sẽ trông giống như sau: 'SELECT me.x FROM (EXEC my_stored_proc?) Me' gây ra lỗi cú pháp và câu lệnh không thể được chuẩn bị. Tôi đoán vấn đề này sẽ không được cụ thể cho mssql vì tôi không thấy các nền tảng khác có cú pháp tương thích. – stevenl

+1

Điều này không trả lời được câu hỏi. Không có thủ tục được lưu trữ ở đây. – djsadinoff

Các vấn đề liên quan