First off, exactly what are you passing to the function? Your SELECT statement shows that you are passing a lower case string 'pqr'. But in bold type, you are passing an upper case string 'PQR'. Since table names are stored in upper case in the data dictionary in upper case (unless you happen to have used quoted identifiers and specified a lower case table name) and since you're not doing an UPPER in your query, that is an important difference.
Second, what is the purpose of your exception handler? It makes no sense to catch an exception that you cannot handle and just call dbms_output which the client may or may not happen to have enabled and may or may not read from the buffer dbms_output writes to. Remove the exception handler and see if an error is thrown.
Third, code running in a definer's rights stored procedure, which this is, does not have access to privileges granted via roles. It only has access to privileges granted directly to the procedure owner. If the owner of the procedure has been granted access to the tables in question via a role, you could query ALL_TAB_COLS in a SQL*Plus session directly and see the tables but not if the query was inside a definer's rights stored procedure. In SQL*Plus, you can disable roles to simulate the privileges you would have access to in a definer's rights stored procedure
SQL> set role none
and then retry the operation. If you can no longer see the data you expect in ALL_TAB_COLS, you'd need to grant the owner of the procedure access to the tables directly rather than via a role. Alternately, you could grant the user access to the DBA_TAB_COLS view via the SELECT ANY DICTIONARY privilege and change the code to use DBA_TAB_COLS.
abc('PQR')what is actually returned from the statement?