diff --git a/src/Persistence/Sql/Oracle/Query.php b/src/Persistence/Sql/Oracle/Query.php index 5c8ebf855c..8f0dd8fe5f 100644 --- a/src/Persistence/Sql/Oracle/Query.php +++ b/src/Persistence/Sql/Oracle/Query.php @@ -102,65 +102,24 @@ public function groupConcat($field, string $delimiter = ',') return $this->expr('listagg({field}, []) within group (order by {field})', ['field' => $field, $delimiter]); } - // {{{ for Oracle 11 and lower to support LIMIT with OFFSET - - protected $template_select = '[with]select[option] [field] [from] [table][join][where][group][having][order]'; - /** @var string */ - protected $template_select_limit = 'select * from (select "__t".*, rownum "__dsql_rownum" [from] ([with]select[option] [field] [from] [table][join][where][group][having][order]) "__t") where "__dsql_rownum" > [limit_start][and_limit_end]'; - - public function limit($cnt, $shift = null) - { - $this->template_select = $this->template_select_limit; - - return parent::limit($cnt, $shift); - } - public function _render_limit_start(): string { return (string) ($this->args['limit']['shift'] ?? 0); } - public function _render_and_limit_end(): ?string + public function _render_limit(): ?string { - if (!$this->args['limit']['cnt']) { - return ''; + if (!isset($this->args['limit'])) { + return null; } - return ' and "__dsql_rownum" <= ' - . max((int) ($this->args['limit']['cnt'] + $this->args['limit']['shift']), (int) $this->args['limit']['cnt']); - } - - public function getRowsIterator(): \Traversable - { - foreach (parent::getRowsIterator() as $row) { - unset($row['__dsql_rownum']); + $cnt = (int) $this->args['limit']['cnt']; + $shift = (int) $this->args['limit']['shift']; - yield $row; - } + return ($shift ? ' offset ' . $shift . ' rows' : '') + . ($cnt ? ' fetch next ' . $cnt . ' rows only' : ''); } - public function getRows(): array - { - return array_map(function ($row) { - unset($row['__dsql_rownum']); - - return $row; - }, parent::getRows()); - } - - public function getRow(): ?array - { - $row = parent::getRow(); - - if ($row !== null) { - unset($row['__dsql_rownum']); - } - - return $row; - } - - /// }}} - public function exists() { return $this->dsql()->mode('select')->field(