Сообщения об ошибках ссылаются на line 31
, где код имеет RETURN SQLERRM;
, который пытается вернуть alpha-numeric string
, в то время как функция должна возвращать number
, вы уже можете увидеть сообщение об ошибке:
dbms_output.put_line('Returning Error : '||SQLERRM);
, так что конвертируйте RETURN SQLERRM;
в RETURN NULL;
, и действительно выявите вашу главную проблему, это - ORA-01722: invalid number
, которая возникает.
Это происходит, когда типы данных в ваших столбцах не VARCHAR2
, NVARCHAR
.. и т. Д., А DATE
, NUMBER
.. и т. Д.
Следовательно, вы можете конвертировать курсор в
for i in
(
select owner, table_name, column_name, data_type
from all_tab_columns
where table_name = l_table
and owner = l_owner
and column_name = l_column_name
order by column_id
)
и добавить оператор if внутри цикла как
if i.data_type in ('CHAR','VARCHAR2','VARCHAR','NCHAR','NVARCHAR2') then
sql_stmt := 'SELECT COUNT('||i.column_name||') FROM ' || i.owner ||'.' || i.table_name ||
' WHERE ' ||i.column_name|| '='||''' ''' ;
else
sql_stmt := 'SELECT COUNT('||i.column_name||') FROM ' || i.owner ||'.' || i.table_name ||
' WHERE ' ||i.column_name|| ' IS NULL';
end if;
Всякий раз, когда вы видите, что не возникает исключение из-за оператора if, вы можете полностью удалить часть исключения. Поскольку вашей конечной целью должно быть избавление от таких исключений.