Я пытаюсь запустить процесс, когда запрос обнаружит, что таблица пуста - PullRequest
1 голос
/ 16 мая 2019

Я хочу написать способ проверки наличия данных в таблице перед выполнением хранимой процедуры.

Я создал некоторый «урезанный» тестовый код, который «почти» соответствует условиям, к которым я стремлюсь, я надеялся, что кто-то сможет помочь мне заставить это работать. Если это так, тогда я могу заменить значения для моей процедуры вместо просто dbms_output и быть в рабочем состоянии.

Создает тестовую таблицу без строк.

CREATE TABLE t (c VARCHAR2(20));

Тогда, как я пытаюсь это сделать ...

declare
    no_such_table exception;
    pragma exception_init( no_such_table, -942 );
    EXISTS_1 integer; 
BEGIN
    for tst in (
        select count (c) x from t 
    )
    loop
        execute immediate' select count (c) Z from ' ||tst.t into EXISTS_1;
        if EXISTS_1 <= 0
        then
             dbms_output.put_line( 'a' );
        else dbms_output.put_line( 'b' );
        end if;
    end loop;
exception
    when no_such_table
    then
        dbms_output.put_line( 'c' );
    WHEN NO_DATA_FOUND THEN
        dbms_output.put_line( 'd' );
end;

Предполагается, что первая часть со счетчиком будет содержать числовое значение, чтобы указать, есть ли в таблице какие-либо строки. Затем выполнение немедленно в EXISTS_1 содержит значение, чтобы решить, какой вывод выдать.

Во-первых, я не могу заставить бит выполнения немедленно работать. Но если бы я мог заставить его работать, я хочу, чтобы вывод записывал 'a', если в таблице нет строк. (На самом деле, я бы выполнил процедуру здесь) и записал 'b', если бы там были данные, которые вы можете вставить с помощью:

insert into t (c) values('x');
commit;

Выводы 'c' и 'd' являются просто попытками справиться с другими потенциальными проблемами, которые могут возникнуть.

В настоящее время я получаю сообщение об ошибке, указывающее, что компонент t должен быть объявлен. Можете ли вы понять, что я пытаюсь сделать, и если да, то, надеюсь, предложить средство для достижения моей цели, пожалуйста?

1 Ответ

1 голос
/ 16 мая 2019
  • ваш первый выбор в цикле всегда будет возвращать одну строку, поэтому теперь нужно сделать цикл.
  • использование tst.t в цикле невозможно.

это то, что вы ищете?

declare
  x number := 0;
begin
  select count(c) into x from t;

  if x <= 0
  then
    dbms_output.put_line( 'a' );
  else 
    dbms_output.put_line( 'b' );
  end if;

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