ORACLE: Compile all invalid objects

Para compilar los objetos inválidos del usuario de BD actual podemos ejecutar el siguiente script:

1
2
3
4
5
6
7
8
SELECT 'ALTER '
  ||decode(object_type,'PACKAGE BODY','PACKAGE',object_type)
  ||' '
  ||object_name
  ||decode(object_type,'PACKAGE BODY', ' COMPILE BODY;',' COMPILE;')
   FROM user_objects
  WHERE STATUS   = 'INVALID'
AND object_type IN ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE');

Esto nos generará una serie de alters para poder recompilar los objetos inválidos.

Oracle: Script para hacer un drop de all user objects

Un ejemplo de script para hacer un drop de todos los objetos del usuario seria el siguiente:

1
2
3
4
5
6
7
8
9
SELECT 'drop sequence ' || sequence_name || ';' FROM user_sequences
UNION
SELECT 'drop trigger ' || trigger_name || ';' FROM user_triggers
UNION
SELECT 'drop view ' || view_name || ';' FROM user_views
UNION
SELECT 'drop index ' || index_name || ';' FROM user_indexes
UNION
SELECT 'drop table ' || table_name || ';' FROM user_tables;

De momento solamente hace drops de triggers, vistas, índices y tablas pero se puede añadir unions para generar el drop de lo que queramos.

Una vez ejecutada la consulta, copiar el resultado en una hoja de SQL y ejecutarla. Es posible que nos den errores por dependencias y no se borren todos los objetos, en ese caso lo que hago es ejecutar el script varias veces hasta que se borren todos los objetos (se debería hacer una nueva versión que calcule las dependencias pero eso ya seria demasiado tiempo…)

SPOOL, cómo guardar el output de un sqlplus en un fichero

Si queremos guardar el output de la ejecución de cualquier sqlpluspodemos activar el modo spool que nos irá guardando en el fichero que le especifiquemos la salida del script.

ejemplo:
 
SET serveroutput ON size 1000000
spool salida.txt
BEGIN
fnd_global.apps_initialize (user_id => 3018
,resp_id => 52630
,resp_appl_id => 551);
 
xx_custom_pkg.procedure_with_output;
END;
/
spool off
EXIT

Como cargar el entorno de Aplicaciones desde una SQL window

Si necesitamos tener cargado el entrono de applications para ejecutar una query (para filtrar correctamente por las vistas, etc.) tenemos que ejecutar el siguiente trozo de código: 

DECLARE
var VARCHAR2(20);
BEGIN
fnd_client_info.setup_client_info(551,52845,3018,-1);
fnd_global.apps_initialize(3018,52845,551);
SELECT fnd_profile.VALUE('GEMMS_DEFAULT_ORGN')
INTO var
FROM dual;
DBMS_OUTPUT.enable(10000);
DBMS_OUTPUT.put_line('var=>'||var);
END;