package SQL::Query::Limit::Oracle; use warnings; use strict; use vars qw($VERSION); $VERSION = '0.01'; use Abstract::Meta::Class ':all'; use SQL::Entity::Column ':all'; use SQL::Entity::Condition ':all'; use base 'SQL::Entity'; =head1 NAME SQL::Query::Limit::Oracle - LIMIT emulation for Oracle database. =head1 SYNOPSIS use SQL::Query::Limit::Oracle; =head1 DESCRIPTION SQL navigation wrapper for Oracle. =head2 EXPORT None. =head2 ATTRIBUTES =over =item the_rownum =cut has '$.the_rownum'; =back =head2 METHODS =over =item query =cut sub query { my ($self, $offset, $limit, $requested_columns, $condition) = @_; $condition = $self->limit_clause($offset, $limit, $condition); my ($sql, $bind_variables) = $self->SUPER::query($requested_columns, $condition); $sql = "SELECT " . $self->alias . ".*" . "\nFROM (\n" . $sql . ") " . $self->alias . "\nWHERE the_rownum >= ?"; push @$bind_variables, $offset; ($sql, $bind_variables); } =item limit_clause =cut sub limit_clause { my ($self, $offset, $limit, $condition) = @_; my $result; my $to_rownum = $offset + $limit; if($condition) { $result = sql_cond('the_rownum', '<', $to_rownum)->and($condition); } else { $result = sql_cond('the_rownum', '<', $to_rownum); } $result; } =item selectable_columns =cut sub selectable_columns { my ($self, $requested_columns) = @_; ($self->the_rownum_column, $self->SUPER::selectable_columns($requested_columns)) } =item the_rownum_column =cut sub the_rownum_column { my ($self) = @_; my $the_rownum = $self->the_rownum; $the_rownum ||= $self->the_rownum(SQL::Entity::Column->new(name => 'ROWNUM', id => 'the_rownum')); } =item query_columns Returns query column for the object. =cut sub query_columns { my ($self) = @_; (the_rownum => $self->the_rownum_column, $self->SUPER::query_columns); } =item query_setup =cut sub query_setup {} =item order_by_clause Returns " ORDER BY ..." SQL fragment =cut sub order_by_clause { my ($self) = @_; my $index = $self->index or return ""; return "" if $index->hint; " ORDER BY " . $index->order_by_operand($self); } =item select_hint_clause Return hinst cluase that will be placed as SELECT operand =cut sub select_hint_clause { my ($self) = @_; my $index = $self->index or return ""; return "" unless $index->hint; "/*+ " . $index->hint . " */ "; } 1; __END__ =back =head1 SEE ALSO L. =head1 COPYRIGHT AND LICENSE The SQL::Query::Limit::Oracle module is free software. You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file. =head1 AUTHOR Adrian Witas, adrian@webapp.strefa.pl =cut