Re: Error: ORA-00911: invalid character

From: Rich J <rjoralist3_at_society.servebeer.com>
Date: Fri, 11 Mar 2016 10:32:50 -0600
Message-ID: <b9b7236d0547b4901371cde36970c81a_at_society.servebeer.com>


 

On 2016/03/11 09:38, Zabair Ahmed wrote:

> CREATE OR REPLACE PACKAGE BODY Purge_Data AS
>
> PROCEDURE pr_Purge_Data
> ( P_Days IN Number
> ) IS
> L_Error_Count PLS_INTEGER := 0;
> BEGIN
> for L_Row in (
> select * from (
> select 1 as order_tname
> , tname as object_name
> , 'select count(*) from '||tname||' where last_modified < sysdate - ' ||P_Days|| ';'
> as STMT
> from tab
> )
> where object_name like 'CT%'
> order by order_tname, object_name
> ) LOOP
> BEGIN
> dbms_output.put_line(L_Row.Stmt);
> execute immediate L_Row.Stmt;
> EXCEPTION
> WHEN OTHERS THEN
> dbms_output.put_line('Error: ' || sqlerrm);
> L_Error_Count := L_Error_Count + 1;
> END;
>
> END LOOP;
> _[snip]_
> SQL>
>
> Any pointers on the error, greatly appreciated.
>
> TIA
My kneejerk is that there's implicit casting going on with P_Days, and also that SELECTs would generally require an corresponding INTO clause within PL/SQL.

You might also want to try a different approach to the above, using XML, something along the lines of:

SELECT
 TNAME,
 TO_NUMBER(
 EXTRACTVALUE(
 XMLTYPE(
 dbms_xmlgen.getxml('SELECT COUNT(*) c from '||tname||' WHERE last_modified < sysdate - '||P_Days)
 )
 ,'/ROWSET/ROW/C')
 ) COUNT
FROM
 tab
WHERE tname LIKE 'CT%'
ORDER BY 1,2; Try this from the command line first, and if it works, include the INTO clause in your package body.

HTH! GL! Rich

--
http://www.freelists.org/webpage/oracle-l
Received on Fri Mar 11 2016 - 17:32:50 CET

Original text of this message