/*
	v01.00:
		Script reseteo del usario de BBDD FHIR
		-Elimina el contenido poblado en las tablas del modelo FHIR del usuario
		-Elimina los objetos básicos de secuencia, prodecimientos, vistas y tablas del usuario FHIR
		
	Requisitos:
		-Se requiere ejecutar este script con permisos de administrador BBDD, "As SYSDBA"	
	
	Pasos de ejecucion:	
		-Ejecutar en linea de comando o mediante herramienta cliente SQL
	
	Resultado:
		-Actualización del esquema asociado por defecto al usuario sin contenido y operativo para albergar los objetos FHIR creados en el arranque del servicio.

*/

DECLARE

    -- SECCIÓN DE DECLARACIÓN DE VARIABLES
	iCONTADOR        INTEGER:=1;
	iPROCESADOS      INTEGER:=0;
	dFINI            TIMESTAMP;			-- Fecha inicio proceso
	dFFIN            TIMESTAMP;			-- Fecha fin proceso
	sTOTAL           VARCHAR2(30);		-- Tiempo de ejecución parcial o total

BEGIN	
    -- REGISTRAMOS LA FECHA DE COMIENZO
    dFINI:=systimestamp;
	
    -- INFORMAMOS EL COMIENZO DEL PROCESO
    DBMS_OUTPUT.PUT_LINE('Comienzo del proceso de eliminación ('||to_char(dFINI,'HH24:MI:SS')||').....');

	--Sección de eliminacion de SEQUENCE del usuario
	iPROCESADOS:=0;	
	DBMS_OUTPUT.PUT_LINE('Comienzo del procesamiento de eliminación de SEQUENCES: ('||to_char(dFINI,'HH24:MI:SS')||').....');
	FOR s IN (SELECT sequence_name FROM all_sequences WHERE sequence_owner = 'fhir')
	LOOP
	  iPROCESADOS:=iPROCESADOS+1;
	  EXECUTE IMMEDIATE 'DROP SEQUENCE ' || 'fhir' || '.' || s.sequence_name;
	END LOOP;
	dFFIN:=sysdate; --systimestamp;
	DBMS_OUTPUT.PUT_LINE('Finalizacion del procesamiento de SEQUENCES: ('||to_char(dFFIN,'HH24:MI:SS')||').');
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('Numero de registros procesados: '||iPROCESADOS);	
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');	
	
	--Sección de eliminacion de PROCEDURE del usuario
	iPROCESADOS:=0;		
	DBMS_OUTPUT.PUT_LINE('Comienzo del procesamiento de eliminación de PROCEDURES: ('||to_char(dFINI,'HH24:MI:SS')||').....');	
	FOR p IN (SELECT object_name FROM all_procedures WHERE owner = 'fhir')
	LOOP
	  iPROCESADOS:=iPROCESADOS+1;	
	  EXECUTE IMMEDIATE 'DROP PROCEDURE ' || 'fhir' || '.' || p.object_name;
	END LOOP;
	dFFIN:=sysdate; --systimestamp;
	DBMS_OUTPUT.PUT_LINE('Finalizacion del procesamiento de PROCEDURES: ('||to_char(dFFIN,'HH24:MI:SS')||').');
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('Numero de registros procesados: '||iPROCESADOS);		
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');	
	
	--Sección de eliminacion de VIEWs del usuario
	iPROCESADOS:=0;			
	DBMS_OUTPUT.PUT_LINE('Comienzo del procesamiento de eliminación de VIEWS: ('||to_char(dFINI,'HH24:MI:SS')||').....');	
	FOR v IN (SELECT view_name FROM all_views WHERE owner = 'fhir')
	LOOP
	  iPROCESADOS:=iPROCESADOS+1;	
	  EXECUTE IMMEDIATE 'DROP VIEW ' || 'fhir' || '.' || v.view_name;
	END LOOP;
	dFFIN:=sysdate; --systimestamp;
	DBMS_OUTPUT.PUT_LINE('Finalizacion del procesamiento de VIEWS: ('||to_char(dFFIN,'HH24:MI:SS')||').');
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('Numero de registros procesados: '||iPROCESADOS);		
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');
	
	--Sección de eliminacion de TABLES del usuario
	iPROCESADOS:=0;			
	DBMS_OUTPUT.PUT_LINE('Comienzo del procesamiento de eliminación de TABLES: ('||to_char(dFINI,'HH24:MI:SS')||').....');	
	FOR t IN (SELECT table_name FROM all_tables WHERE owner = 'fhir')
	LOOP
	  iPROCESADOS:=iPROCESADOS+1;	
	  EXECUTE IMMEDIATE 'DROP TABLE ' || 'fhir' || '.' || t.table_name || ' CASCADE CONSTRAINTS';
	END LOOP;
	dFFIN:=sysdate; --systimestamp;
	DBMS_OUTPUT.PUT_LINE('Finalizacion del procesamiento de TABLES: ('||to_char(dFFIN,'HH24:MI:SS')||').');
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('Numero de registros procesados: '||iPROCESADOS);		
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');
	
	dFFIN:=sysdate; --systimestamp;
	DBMS_OUTPUT.PUT_LINE('Finalizacion del proceso de eliminación ('||to_char(dFFIN,'HH24:MI:SS')||').');
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');

EXCEPTION
   WHEN OTHERS THEN
	dFFIN:=sysdate; --systimestamp;	
	DBMS_OUTPUT.PUT_LINE('Finalizacion del procesamiento de eliminación con error inesperado ('||to_char(dFFIN,'HH24:MI:SS')||').');
	DBMS_OUTPUT.PUT_LINE('Salida1:Codigo Error: ' || sqlcode || ' - ' || sqlerrm);
	sTOTAL := to_char(dFFIN - dFINI,'HH24:MI:SS'); 
	DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución: '||sTOTAL||'.');
	DBMS_OUTPUT.PUT_LINE('________________________________________________________________________________');
      -- ******************************************** FIN **********************************************************************
-- FORMATEO FINAL

END;
/ 

PL/SQL Online Compiler

Write, Run & Share PL/SQL code online using OneCompiler's Oracle PL/SQL online editor and compiler for free. It's one of the robust, feature-rich online editor and compiler for Oracle PL/SQL running on latest version 23c (23.3.0.0). Getting started with the OneCompiler's Oracle PL/SQL editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'PL/SQL' and start writing code to learn and test online without worrying about tedious process of installation.

About PL/SQL

PL/SQL is procedural extension for SQL created by Oracle. It is by default embedded into the Oracle Database. PL/SQL program units are compiled and stored inside the Oracle Database which results in optimal execution times as the PL/SQL and SQL run within the same server process.

Syntax help

Following is the syntax structure for the PL/SQL code blocks

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

Example

DECLARE 
   message  varchar2(100):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Named procedures

CREATE OR REPLACE FUNCTION 
hello_user
   (user_name IN VARCHAR2) 
    RETURN VARCHAR2
IS
BEGIN
   RETURN 'Hello ' || user_name;
END hello_user;
/

BEGIN
   dbms_output.put_line(hello_user('Peter'));
END;
/

Exception handling

BEGIN
  DBMS_OUTPUT.put_line (1/0);
EXCEPTION
  WHEN OTHERS
  THEN
    DBMS_OUTPUT.put_line ('error is: ' || SQLERRM);
END;