Я хочу написать способ проверки наличия данных в таблице перед выполнением хранимой процедуры.
Я создал некоторый «урезанный» тестовый код, который «почти» соответствует условиям, к которым я стремлюсь, я надеялся, что кто-то сможет помочь мне заставить это работать. Если это так, тогда я могу заменить значения для моей процедуры вместо просто 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 должен быть объявлен. Можете ли вы понять, что я пытаюсь сделать, и если да, то, надеюсь, предложить средство для достижения моей цели, пожалуйста?