2013-04-20 3 views
0

У меня есть процедура в PLSQL, которая заполняет временную таблицу. Данные выглядит следующим образом:Oracle PLSQL записывает записи во временную таблицу

BUYER_NAME QUANTITY AMOUNT 
------------------------------- 
JOHN  10   1200 
JOHN  12   1310 
ALAN  15   1450 
ALAN  10   1200 
JOHN  20   2400 

мне нужно подвести итог количество и суммы для каждого покупателя, а затем удалить существующие данные и заполнить таблицу еще раз таким образом, что каждое имя покупателя приходит только один раз с общим количеством и количеством ,

Я знаю, что это можно сделать, если я создам другую временную таблицу и передаю данные через нее. Тем не менее, есть способ, которым мы можем объединить записи в пределах одной временной таблицы (и в пределах того же сеанса)?

+0

Как насчет утверждения 'MERGE'? http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm –

+0

@a_horse_with_no_name Интересно, как в этом случае может работать оператор слияния, потому что источником данных является одна и та же таблица. –

+0

Это нехороший способ работы. Чтобы сделать хорошую работу, я предлагаю вам заполнить глобальную временную таблицу процедурой, а затем объединить сгруппированные данные в финальную таблицу, где BUYER_NAME - уникальный столбец. –

ответ

0

Похоже, проблема связана с процедурой initil pl/sql, которая заполняет таблицу. Почему бы не изменить его, чтобы сделать это? Я подозреваю, что ответ будет заключаться в том, что он много использует pl/sql - если это так, приложите все усилия, чтобы преобразовать его в SQL вместо этого или превратить его в конвейерную функцию, которую вы можете выбрать и агрегировать вывод.

В стороне, я бы просто собрал результат в другую таблицу. Я предполагаю, что это глобальные временные таблицы, поэтому на самом деле не так много накладных расходов, так как вставка прямого пути в GTT будет намного более эффективной, чем изменение уже существующей таблицы.

+0

Согласен с агрегированной суммой, и «отдельная» операция, скорее всего, будет выполнена в одном запросе. И, возможно, ему даже не нужна временная таблица (конвейерная функция может быть достаточно). –

+0

Фактически в исходном PLSQL данные не могут быть агрегированы. Данные обрабатываются (значения вычисляются), а затем вставляются в временную таблицу. Могу ли я создать два экземпляра одной и той же таблицы temp в одном сеансе и выполнить передачу данных между ними? –

+0

@ asim-ishaq: Я уверен, что вы можете агрегировать данные в одном и том же статуте. Почему бы вам не показать нам заявление, которое заполняет временную таблицу? –

Смежные вопросы