Во-первых, ловить when others
без повторного рейза обычно ошибка; здесь похоже, что вы намереваетесь сообщать об ошибках, но продолжаете, что не представляется необоснованным. Но вы должны включить ошибку в отображаемую вами информацию, например:
EXCEPTION
WHEN others THEN
dbms_output.put_line( 'Error encountered trying to read ' ||
t.column_name || ' from ' ||
t.owner || '.' || t.table_name );
dbms_output.put_line(SQLERRM);
END;
Предположительно, это говорит о том, что таблицы не существуют, или у вас неверные идентификаторы, или у вас есть ошибки привилегий. Вы просматриваете все таблицы, принадлежащие всем, и даже не исключаете таблицы, принадлежащие SYS, как , как сделал исходный код - надеюсь, это не потому, что вы создаете свои собственные таблицы под SYS - и это возможно где-то там у вас есть таблицы с указанными в кавычках идентификаторами . На самом деле, это очень вероятно; SYS имеет _default_auditing_options_
, а сгенерированные системой имена вложенных таблиц могут быть, например, в смешанном регистре.
Чтобы быть в безопасности, добавление кавычек в любом случае не повредит:
BEGIN
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM "' || t.owner || '"."' || t.table_name || '"' ||
' WHERE "' || t.column_name || '" = :1'
INTO match_count
USING v_search_string;