Слияние 2 избранных высказываний в 1 - PullRequest
1 голос
/ 05 февраля 2010

В настоящее время у меня есть два довольно длинных оператора выбора, идентичных за исключением того, что первый ищет, существует ли строка с помощью count (*), а второй выбирает строку в переменную rowtype на основе оператора if. Это потому, что данные необходимы для дальнейшей манипуляции

Я знаю, что это возможно, но у меня полный мозговой замер, и Google возвращает много информации о select, и если / иначе, но не о ветвлении на основе select.

Я попытался обернуть выбор в операторах if и потерпел неудачу, поэтому мне было интересно, что еще можно попробовать.

Обновление : Psuedo-пример:

select count(*) into num_items where <very long operation>;
if (num_items = 1) then
  begin
  select * into row_item where <very long operation>;
  end;
else
  dbms_output.put_line('failure');
end if;

Также : На слегка неродственной ноте, как вы можете мгновенно очистить dbms_output, чтобы вы могли видеть, где находится скрипт в данный момент? На данный момент он печатается только после завершения сценария.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

Я думаю, что код, который вы хотите это:

begin
  select * into row_item where <very long operation>;
exception
  when too_many_rows then
    dbms_output.put_line('failure');
end;

dbms_output действительно хорош только для отладки при разработке кода или для сценариев SQL, которые вы будете запускать из SQL Plus или IDE. Вы можете использовать автономную транзакцию для записи сообщений в таблицу; затем они могут быть прочитаны другим сеансом, пока программа еще работает. См. этот вопрос для более подробной информации.

1 голос
/ 05 февраля 2010

Я бы посчитал что-то вроде этого:

DECLARE
  CURSOR c IS
    SELECT COUNT(*) OVER () count_rows,
    q.* FROM (<very long operation>) q
    WHERE ROWNUM <= 2;
  r c%ROWTYPE;
BEGIN
  OPEN c;
  FETCH c INTO r;
  IF c%NOTFOUND OR r.count_rows != 1 THEN
    dbms_output.put_line('failure');
  ELSE
    --process the row
  END IF;
END;

Это будет считать максимум 2 записи из "очень длинной операции"; но получит только первый ряд. r.count_rows будет 1, если была найдена только одна строка, или 2, если было найдено более 1 строки. Таким образом вы избежите двойного выполнения длинной операции дважды.

1 голос
/ 05 февраля 2010

Я думаю, что вы хотите ВЫБРАТЬ СЛУЧАЙ .

Если вам нужна более конкретная помощь, опубликуйте свой текущий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...