Ошибка не требует пояснений:
Недопустимо одно из имен таблиц, для которых вы пытаетесь сосчитать количество строк.
Вы можете использовать следующий код для перехвата исключения и определите имя таблицы (вам также нужно объявить переменную sq3
):
procedure test
IS
sq3 CLOB;
tn varchar2(99);
i number(6);
cursor c1 is
select tname
from tab
where tabtype='TABLE'
and tname NOT LIKE 'BIN%'
order by tname;
invalid_table_name EXCEPTION;
PRAGMA EXCEPTION_INIT( invalid_table_name, -903 );
begin
open c1;
loop
fetch c1 into tn;
exit when c1%notfound;
BEGIN
sq3 := 'select count(*) from '||tn;
EXECUTE IMMEDIATE sq3 INTO i;
htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
EXCEPTION
WHEN invalid_table_name THEN
DBMS_OUTPUT.PUT_LINE( 'Invalid Table Name: ' || tn );
END;
end loop;
close c1;
end test;
Вы можете обнаружить, что имя таблицы недопустимо, потому что оно чувствительно к регистру или содержит символы, которые обычно не являются ожидается в имени таблицы, и вы не обрабатываете его как таковое в операторе EXECUTE IMMEDIATE
. В этом случае вы можете использовать:
sq3 := 'select count(*) from "'||tn||'"';
db <> fiddle