admin scripts

97
10g -- -------------------------------------------------------------------- --------------- -- File Name : http://www.oracle- base.com/dba/10g/active_session_waits.sql -- Author : DR Timothy S Hall -- Description : Displays information on the current wait states for all active database sessions. -- Requirements : Access to the V$ views. -- Call Syntax : @active_session_waits -- Last Modified: 21/12/2004 -- -------------------------------------------------------------------- --------------- SET LINESIZE 250 SET PAGESIZE 1000 COLUMN username FORMAT A15 COLUMN osuser FORMAT A15 COLUMN sid FORMAT 99999 COLUMN serial# FORMAT 9999999 COLUMN wait_class FORMAT A15 COLUMN state FORMAT A19 COLUMN logon_time FORMAT A20 SELECT NVL(a.username, '(oracle)') AS username, a.osuser, a.sid, a.serial#, d.spid AS process_id, a.wait_class, a.seconds_in_wait, a.state, a.blocking_session, a.blocking_session_status, a.module, TO_CHAR(a.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time FROM v$session a, v$process d WHERE a.paddr = d.addr AND a.status = 'ACTIVE' ORDER BY 1,2; -- -------------------------------------------------------------------- --------------- -- File Name : http://www.oracle-base.com/dba/10g/db_usage_hwm.sql -- Author : DR Timothy S Hall -- Description : Displays high water mark statistics. -- Requirements : Access to the DBA views. -- Call Syntax : @db_usage_hwm -- Last Modified: 26-NOV-2004 -- -------------------------------------------------------------------- ---------------

Upload: mudireddy-madhu

Post on 24-Apr-2015

119 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Admin Scripts

10g-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/active_session_waits.sql-- Author : DR Timothy S Hall-- Description : Displays information on the current wait states for all active database sessions.-- Requirements : Access to the V$ views.-- Call Syntax : @active_session_waits-- Last Modified: 21/12/2004-- -----------------------------------------------------------------------------------SET LINESIZE 250SET PAGESIZE 1000

COLUMN username FORMAT A15COLUMN osuser FORMAT A15COLUMN sid FORMAT 99999COLUMN serial# FORMAT 9999999COLUMN wait_class FORMAT A15COLUMN state FORMAT A19COLUMN logon_time FORMAT A20

SELECT NVL(a.username, '(oracle)') AS username, a.osuser, a.sid, a.serial#, d.spid AS process_id, a.wait_class, a.seconds_in_wait, a.state, a.blocking_session, a.blocking_session_status, a.module, TO_CHAR(a.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_timeFROM v$session a, v$process dWHERE a.paddr = d.addrAND a.status = 'ACTIVE'ORDER BY 1,2;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/db_usage_hwm.sql-- Author : DR Timothy S Hall-- Description : Displays high water mark statistics.-- Requirements : Access to the DBA views.-- Call Syntax : @db_usage_hwm-- Last Modified: 26-NOV-2004-- -----------------------------------------------------------------------------------

Page 2: Admin Scripts

COLUMN name FORMAT A40COLUMN highwater FORMAT 999999999999COLUMN last_value FORMAT 999999999999SET PAGESIZE 24

SELECT hwm1.name, hwm1.highwater, hwm1.last_valueFROM dba_high_water_mark_statistics hwm1WHERE hwm1.version = (SELECT MAX(hwm2.version) FROM dba_high_water_mark_statistics hwm2 WHERE hwm2.name = hwm1.name)ORDER BY hwm1.name;

COLUMN FORMAT DEFAULT

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/dynamic_memory.sql-- Author : DR Timothy S Hall-- Description : Displays the values of the dynamically memory pools.-- Requirements : Access to the V$ views.-- Call Syntax : @dynamic_memory-- Last Modified: 08-NOV-2004-- -----------------------------------------------------------------------------------

COLUMN name FORMAT A40COLUMN value FORMAT A40

SELECT name, valueFROM v$parameterWHERE SUBSTR(name, 1, 1) = '_'ORDER BY name;

COLUMN FORMAT DEFAULT

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/feature_usage.sql-- Author : DR Timothy S Hall-- Description : Displays feature usage statistics.-- Requirements : Access to the DBA views.-- Call Syntax : @feature_usage-- Last Modified: 26-NOV-2004

Page 3: Admin Scripts

-- -----------------------------------------------------------------------------------

COLUMN name FORMAT A50COLUMN detected_usages FORMAT 999999999999

SELECT u1.name, u1.detected_usagesFROM dba_feature_usage_statistics u1WHERE u1.version = (SELECT MAX(u2.version) FROM dba_feature_usage_statistics u2 WHERE u2.name = u1.name)ORDER BY u1.name;

COLUMN FORMAT DEFAULT

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/generate_multiple_awr_reports.sql-- Author : DR Timothy S Hall-- Description : Generates AWR reports for all snapsots between the specified start and end point.-- Requirements : Access to the v$ views, UTL_FILE and DBMS_WORKLOAD_REPOSITORY packages.-- Call Syntax : Create the directory with the appropriate path.-- Adjust the start and end snapshots as required.-- @generate_multiple_awr_reports.sql-- Last Modified: 02/08/2007-- -----------------------------------------------------------------------------------CREATE OR REPLACE DIRECTORY awr_reports_dir AS '/tmp/';

DECLARE -- Adjust before use. l_snap_start NUMBER := 1; l_snap_end NUMBER := 10; l_dir VARCHAR2(50) := 'AWR_REPORTS_DIR'; l_last_snap NUMBER := NULL; l_dbid v$database.dbid%TYPE; l_instance_number v$instance.instance_number%TYPE; l_file UTL_FILE.file_type; l_file_name VARCHAR(50);

BEGIN SELECT dbid INTO l_dbid FROM v$database;

SELECT instance_number INTO l_instance_number

Page 4: Admin Scripts

FROM v$instance; FOR cur_snap IN (SELECT snap_id FROM dba_hist_snapshot WHERE instance_number = l_instance_number AND snap_id BETWEEN l_snap_start AND l_snap_end ORDER BY snap_id) LOOP IF l_last_snap IS NOT NULL THEN l_file := UTL_FILE.fopen(l_dir, 'awr_' || l_last_snap || '_' || cur_snap.snap_id || '.htm', 'w', 32767); FOR cur_rep IN (SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_html(l_dbid, l_instance_number, l_last_snap, cur_snap.snap_id))) LOOP UTL_FILE.put_line(l_file, cur_rep.output); END LOOP; UTL_FILE.fclose(l_file); END IF; l_last_snap := cur_snap.snap_id; END LOOP; EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(l_file) THEN UTL_FILE.fclose(l_file); END IF; RAISE; END;/

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/job_classes.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about job classes.-- Requirements : Access to the DBA views.-- Call Syntax : @job_classes-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 200

COLUMN service FORMAT A20COLUMN comments FORMAT A40

SELECT job_class_name, resource_consumer_group, service, logging_level,

Page 5: Admin Scripts

log_history, commentsFROM dba_scheduler_job_classesORDER BY job_class_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/job_programs.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about job programs.-- Requirements : Access to the DBA views.-- Call Syntax : @job_programs-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 250

COLUMN owner FORMAT A20COLUMN program_name FORMAT A30COLUMN program_action FORMAT A50COLUMN comments FORMAT A40

SELECT owner, program_name, program_type, program_action, number_of_arguments, enabled, commentsFROM dba_scheduler_programsORDER BY owner, program_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/job_schedules.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about job schedules.-- Requirements : Access to the DBA views.-- Call Syntax : @job_schedules-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 250

COLUMN owner FORMAT A20COLUMN schedule_name FORMAT A30COLUMN start_date FORMAT A35COLUMN repeat_interval FORMAT A50COLUMN end_date FORMAT A35

Page 6: Admin Scripts

COLUMN comments FORMAT A40

SELECT owner, schedule_name, start_date, repeat_interval, end_date, commentsFROM dba_scheduler_schedulesORDER BY owner, schedule_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/jobs.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler job information.-- Requirements : Access to the DBA views.-- Call Syntax : @jobs-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 200

COLUMN owner FORMAT A20COLUMN next_run_date FORMAT A35

SELECT owner, job_name, enabled, job_class, next_run_dateFROM dba_scheduler_jobsORDER BY owner, job_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/jobs_running.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information for running jobs.-- Requirements : Access to the DBA views.-- Call Syntax : @jobs_running-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 200

COLUMN owner FORMAT A20

SELECT owner,

Page 7: Admin Scripts

job_name, running_instance, elapsed_timeFROM dba_scheduler_running_jobsORDER BY owner, job_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/lock_tree.sql-- Author : DR Timothy S Hall-- Description : Displays information on all database sessions with the username-- column displayed as a heirarchy if locks are present.-- Requirements : Access to the V$ views.-- Call Syntax : @lock_tree-- Last Modified: 18-MAY-2005-- -----------------------------------------------------------------------------------SET LINESIZE 500SET PAGESIZE 1000

COLUMN username FORMAT A15COLUMN machine FORMAT A25COLUMN logon_time FORMAT A20

SELECT LPAD(' ', (level-1)*2, ' ') || NVL(s.username, '(oracle)') AS username, s.osuser, s.sid, s.serial#, s.lockwait, s.status, s.module, s.machine, s.program, TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_timeFROM v$session sCONNECT BY PRIOR s.sid = s.blocking_sessionSTART WITH s.blocking_session IS NULL;

SET PAGESIZE 14

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/segment_advisor.sql

Page 8: Admin Scripts

-- Author : DR Timothy S Hall-- Description : Displays segment advice for the specified segment.-- Requirements : Access to the DBMS_ADVISOR package.-- Call Syntax : Object-type = "tablespace":-- @segment_advisor.sql tablespace (tablespace-name) null-- Object-type = "table" or "index":-- @segment_advisor.sql (object-type) (object-owner) (object-name)-- Last Modified: 08-APR-2005-- -----------------------------------------------------------------------------------SET SERVEROUTPUT ON SIZE 1000000SET LINESIZE 200SET VERIFY OFF

DECLARE l_object_id NUMBER; l_task_name VARCHAR2(32767) := 'SEGMENT_ADVISOR_TASK'; l_object_type VARCHAR2(32767) := UPPER('&1'); l_attr1 VARCHAR2(32767) := UPPER('&2'); l_attr2 VARCHAR2(32767) := UPPER('&3');BEGIN IF l_attr2 = 'NULL' THEN l_attr2 := NULL; END IF;

DBMS_ADVISOR.create_task ( advisor_name => 'Segment Advisor', task_name => l_task_name);

DBMS_ADVISOR.create_object ( task_name => l_task_name, object_type => l_object_type, attr1 => l_attr1, attr2 => l_attr2, attr3 => NULL, attr4 => 'null', attr5 => NULL, object_id => l_object_id);

DBMS_ADVISOR.set_task_parameter ( task_name => l_task_name, parameter => 'RECOMMEND_ALL', value => 'TRUE');

DBMS_ADVISOR.execute_task(task_name => l_task_name);

FOR cur_rec IN (SELECT f.impact, o.type, o.attr1, o.attr2, f.message, f.more_info

Page 9: Admin Scripts

FROM dba_advisor_findings f JOIN dba_advisor_objects o ON f.object_id = o.object_id AND f.task_name = o.task_name WHERE f.task_name = l_task_name ORDER BY f.impact DESC) LOOP DBMS_OUTPUT.put_line('..'); DBMS_OUTPUT.put_line('Type : ' || cur_rec.type); DBMS_OUTPUT.put_line('Attr1 : ' || cur_rec.attr1); DBMS_OUTPUT.put_line('Attr2 : ' || cur_rec.attr2); DBMS_OUTPUT.put_line('Message : ' || cur_rec.message); DBMS_OUTPUT.put_line('More info : ' || cur_rec.more_info); END LOOP;

DBMS_ADVISOR.delete_task(task_name => l_task_name);EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line('Error : ' || DBMS_UTILITY.format_error_backtrace); DBMS_ADVISOR.delete_task(task_name => l_task_name);END;/

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/services.sql-- Author : DR Timothy S Hall-- Description : Displays information about database services.-- Requirements : Access to the DBA views.-- Call Syntax : @services-- Last Modified: 05/11/2004-- -----------------------------------------------------------------------------------SET LINESIZE 200COLUMN name FORMAT A30COLUMN network_name FORMAT A50

SELECT name, network_nameFROM dba_servicesORDER BY name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/session_waits.sql-- Author : DR Timothy S Hall

Page 10: Admin Scripts

-- Description : Displays information on all database session waits.-- Requirements : Access to the V$ views.-- Call Syntax : @session_waits-- Last Modified: 11/03/2005-- -----------------------------------------------------------------------------------SET LINESIZE 200SET PAGESIZE 1000

COLUMN username FORMAT A20COLUMN event FORMAT A30COLUMN wait_class FORMAT A15

SELECT NVL(s.username, '(oracle)') AS username, s.sid, s.serial#, sw.event, sw.wait_class, sw.wait_time, sw.seconds_in_wait, sw.stateFROM v$session_wait sw, v$session sWHERE s.sid = sw.sidORDER BY sw.seconds_in_wait DESC;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/10g/sga_buffers.sql-- Author : DR Timothy S Hall-- Description : Displays the status of buffers in the SGA.-- Requirements : Access to the v$ and DBA views.-- Call Syntax : @sga_buffers-- Last Modified: 27/07/2005-- -----------------------------------------------------------------------------------SET LINESIZE 200COLUMN object_name FORMAT A30

SELECT t.name AS tablespace_name, o.object_name, SUM(DECODE(bh.status, 'free', 1, 0)) AS free, SUM(DECODE(bh.status, 'xcur', 1, 0)) AS xcur, SUM(DECODE(bh.status, 'scur', 1, 0)) AS scur, SUM(DECODE(bh.status, 'cr', 1, 0)) AS cr, SUM(DECODE(bh.status, 'read', 1, 0)) AS read, SUM(DECODE(bh.status, 'mrec', 1, 0)) AS mrec, SUM(DECODE(bh.status, 'irec', 1, 0)) AS irecFROM v$bh bh JOIN dba_objects o ON o.object_id = bh.objd JOIN v$tablespace t ON t.ts# = bh.ts#

Page 11: Admin Scripts

GROUP BY t.name, o.object_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/monitoring/window_groups.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about window groups.-- Requirements : Access to the DBA views.-- Call Syntax : @window_groups-- Last Modified: 05/11/2004-- -----------------------------------------------------------------------------------SET LINESIZE 250

COLUMN comments FORMAT A40

SELECT window_group_name, enabled, number_of_windows, commentsFROM dba_scheduler_window_groupsORDER BY window_group_name;

SELECT window_group_name, window_nameFROM dba_scheduler_wingroup_membersORDER BY window_group_name, window_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/monitoring/windows.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about windows.-- Requirements : Access to the DBA views.-- Call Syntax : @windows-- Last Modified: 05/11/2004-- -----------------------------------------------------------------------------------SET LINESIZE 250

COLUMN comments FORMAT A40

SELECT window_name,

Page 12: Admin Scripts

resource_plan, enabled, active, commentsFROM dba_scheduler_windowsORDER BY window_name;

11g

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/11g/identify_trace_file.sql-- Author : DR Timothy S Hall-- Description : Displays the name of the trace file associated with the current session.-- Requirements : Access to the V$ views.-- Call Syntax : @identify_trace_file-- Last Modified: 23/08/2008-- -----------------------------------------------------------------------------------SET LINESIZE 100COLUMN value FORMAT A60

SELECT valueFROM v$diag_infoWHERE name = 'Default Trace File';

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/11g/job_credentials.sql-- Author : DR Timothy S Hall-- Description : Displays scheduler information about job credentials.-- Requirements : Access to the DBA views.-- Call Syntax : @job_credentials-- Last Modified: 23/08/2008-- -----------------------------------------------------------------------------------COLUMN credential_name FORMAT A25COLUMN username FORMAT A20COLUMN windows_domain FORMAT A20

SELECT credential_name, username, windows_domainFROM dba_scheduler_credentialsORDER BY credential_name;

Page 13: Admin Scripts

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/11g/memory_target_advice.sql-- Author : DR Timothy S Hall-- Description : Provides information to help tune the MEMORY_TARGET parameter.-- Requirements : Access to the DBA views.-- Call Syntax : @memory_target_advice-- Last Modified: 23/08/2008-- -----------------------------------------------------------------------------------SELECT *FROM v$memory_target_adviceORDER BY memory_size;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/11g/temp_free_space.sql-- Author : DR Timothy S Hall-- Description : Displays information about temporary tablespace usage.-- Requirements : Access to the DBA views.-- Call Syntax : @temp_free_space-- Last Modified: 23/08/2008-- -----------------------------------------------------------------------------------SELECT *FROM dba_temp_free_space;

constraints...

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/disable_chk.sql-- Author : DR Timothy S Hall-- Description : Disables all check constraints for a specified table, or all tables.-- Call Syntax : @disable_chk (table-name or all) (schema-name)-- Last Modified: 28/01/2001

Page 14: Admin Scripts

-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' || a.constraint_name || '";'FROM all_constraints aWHERE a.constraint_type = 'C'AND a.owner = UPPER('&2');AND a.table_name = DECODE(UPPER('&1'),'ALL',a.table_name,UPPER('&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/disable_fk.sql-- Author : DR Timothy S Hall-- Description : Disables all Foreign Keys belonging to the specified table, or all tables.-- Call Syntax : @disable_fk (table-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' || a.constraint_name || '";'FROM all_constraints aWHERE a.constraint_type = 'R'AND a.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1'))AND a.owner = Upper('&2');

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

Page 15: Admin Scripts

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/disable_pk.sql-- Author : DR Timothy S Hall-- Description : Disables the Primary Key for the specified table, or all tables.-- Call Syntax : @disable_pk (table-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE PRIMARY KEY;'FROM all_constraints aWHERE a.constraint_type = 'P'AND a.owner = Upper('&2')AND a.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/disable_ref_fk.sql-- Author : DR Timothy S Hall-- Description : Disables all Foreign Keys referencing a specified table, or all tables.-- Call Syntax : @disable_ref_fk (table-name) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFF

Page 16: Admin Scripts

SET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' || a.constraint_name || '";' enable_constraintsFROM all_constraints aWHERE a.owner = Upper('&2')AND a.constraint_type = 'R'AND a.r_constraint_name IN (SELECT a1.constraint_name FROM all_constraints a1 WHERE a1.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1')) AND a1.owner = Upper('&2'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/enable_chk.sql-- Author : DR Timothy S Hall-- Description : Enables all check constraints for a specified table, or all tables.-- Call Syntax : @enable_chk (table-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' || a.constraint_name || '";'FROM all_constraints aWHERE a.constraint_type = 'C'AND a.owner = Upper('&2');AND a.table_name = DECODE(Upper('&1'),'ALL',a.table_name,UPPER('&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

Page 17: Admin Scripts

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/enable_fk.sql-- Author : DR Timothy S Hall-- Description : Enables all Foreign Keys belonging to the specified table, or all tables.-- Call Syntax : @enable_fk (table-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' || a.constraint_name || '";'FROM all_constraints aWHERE a.constraint_type = 'R'AND a.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1'))AND a.owner = Upper('&2');

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/enable_pk.sql-- Author : DR Timothy S Hall-- Description : Enables the Primary Key for the specified table, or all tables.-- Call Syntax : @disable_pk (table-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------

Page 18: Admin Scripts

SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE PRIMARY KEY;'FROM all_constraints aWHERE a.constraint_type = 'P'AND a.owner = Upper('&2')AND a.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/constraints/enable_ref_fk.sql-- Author : DR Timothy S Hall-- Description : Enables all Foreign Keys referencing a specified table, or all tables.-- Call Syntax : @enable_ref_fk (table-name) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' || a.constraint_name || '";'FROM all_constraints aWHERE a.owner = Upper('&2')AND a.constraint_type = 'R'AND a.r_constraint_name IN (SELECT a1.constraint_name FROM all_constraints a1 WHERE a1.table_name = DECODE(Upper('&1'),'ALL',a.table_name,Upper('&1')) AND a1.owner = Upper('&2'));

SPOOL OFF

-- Comment out following line to prevent immediate run

Page 19: Admin Scripts

@temp.sql

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

miscellaneous...

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/analyze_all.sql-- Author : DR Timothy S Hall-- Description : Outdated script to analyze all tables for the specified schema.-- Comment : Use DBMS_UTILITY.ANALYZE_SCHEMA or DBMS_STATS.GATHER_SCHEMA_STATS if your server allows it.-- Call Syntax : @ananlyze_all (schema-name)-- Last Modified: 26/02/2002-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ANALYZE TABLE "' || table_name || '" COMPUTE STATISTICS;'FROM all_tablesWHERE owner = Upper('&1')ORDER BY 1;

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/column_comments.sql-- Author : DR Timothy S Hall-- Description : Displays comments associate with specific tables.-- Requirements : Access to the DBA views.-- Call Syntax : @column_comments (schema) (table-name)-- Last Modified: 15/07/2000

Page 20: Admin Scripts

-- -----------------------------------------------------------------------------------SET VERIFY OFFSET PAGESIZE 100COLUMN column_name FORMAT A20COLUMN comments FORMAT A50

SELECT column_name, commentsFROM dba_col_commentsWHERE owner = UPPER('&1')AND table_name = UPPER('&2')ORDER BY column_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/comments.sql-- Author : DR Timothy S Hall-- Description : Displays all comments for the specified table and its columns.-- Call Syntax : @comments (table-name) (schema-name)-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------PROMPTSET VERIFY OFFSET FEEDBACK OFFSET LINESIZE 255SET PAGESIZE 1000

SELECT a.table_name "Table", a.table_type "Type", Substr(a.comments,1,200) "Comments"FROM all_tab_comments aWHERE a.table_name = Upper('&1')AND a.owner = Upper('&2');

SELECT a.column_name "Column", Substr(a.comments,1,200) "Comments"FROM all_col_comments aWHERE a.table_name = Upper('&1')AND a.owner = Upper('&2');

SET VERIFY ONSET FEEDBACK ONSET PAGESIZE 14PROMPT

Page 21: Admin Scripts

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compare_schemas.sql-- Author : Ottar Sorland (Oracle UK)-- Description : See file.-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------/* This Code entry comes from Ottar Sorland, a consultant for Oracle UK in Bracknell, United Kingdom.

This script compares the object definitions in the current schema to that of a remote schema.The remote schema is defined using a database link.THE SCRIPT COMPARES THE FOLLOWING:- Existence of tables- Existence of columns- Column definitions- Existence of indexes- Index definitions (column usage)- Existence of constraints- Constraint definitions (table, type and reference)- Constraint column usage (for unique, primary key and foreign keys)- Check constraint definitions- Existence of triggers- Definition of triggers- Existence of procedure/packages/functions- Definition of procedures/packages/functions(Ie. the script does not do a complete check, it does not for examplecheck any grants, synonyms, clusters or storage definitions).The script drops and creates a few temporary objects prefixed withthe first 3 letter combination (AAA - ZZZ) that does not conflict with any existing objects.If you find ways of improving this script or have any comments and/orproblems, please send a mail to the author.This script has been tested on Oracle 7.3.*/undef prexundef prefxundef aundef thisuserundef bundef REMOTESCHEMAundef REMOTEPASSW undef connstring undef cundef todaysdatevariable prefx varchar2(3)declarei number ;j number ;k number ;cnt number;begin

Page 22: Admin Scripts

for i in ascii('A') .. ascii('Z') loop for j in ascii('A') .. ascii('Z') loop for k in ascii('A') .. ascii('Z') loop select count(*) into cnt from user_objects where object_name like chr(i)||chr(j)||chr(k)||'%'; if cnt = 0 then :prefx := chr(i)||chr(j)||chr(k); return; end if; end loop; end loop; end loop;end;/column a new_val prexset verify offset linesize 132set feedback offselect :prefx a from dual;column b new_val thisuserselect user b from dual;column c new_val todaysdateselect to_char(sysdate,'DD-MON-YYYY HH24:MI') c from dual;accept REMOTESCHEMA char prompt 'Enter remote username:'accept REMOTEPASSW char prompt 'Enter remote password:' hideaccept connstring char prompt 'Enter remote connectstring:'spool dbdiff.txtPROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT SCHEMA DEFINITION DIFFERENCES &todaysdate PROMPT PROMPT this schema: &thisuser PROMPT remote schema: &remoteschema.@&connstringPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPTPROMPTcreate database link &prex.lnk connect to &REMOTESCHEMA identified by &REMOTEPASSW using '&CONNSTRING';PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT TABLES MISSING IN THIS SCHEMA:PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~create table &prex.common_tables asselect table_name from user_TAbles@&prex.lnkintersectselect table_name from user_tables;select table_name from user_TAbles@&prex.lnkminusselect table_name from &prex.common_tables;PROMPTPROMPT

Page 23: Admin Scripts

PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT TABLES MISSING IN REMOTE SCHEMA:PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name from user_TAbles where table_name not like '&prex.%'minusselect table_name from user_tables@&prex.lnk;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT COLUMNS MISSING IN THIS SCHEMA FOR COMMON TABLESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name,column_name from user_tab_columns@&prex.lnkwhere table_name in(select table_name from &prex.common_tables)minusselect table_name,column_name from user_tab_columns where table_name in(select table_name from &prex.common_tables);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT COLUMNS MISSING IN REMOTE SCHEMA FOR COMMON TABLESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name,column_name from user_tab_columnswhere table_name in(select table_name from &prex.common_tables)minusselect table_name,column_name from user_tab_columns@&prex.lnk where table_name in(select table_name from &prex.common_tables);

create table &prex.diff_cols1( TABLE_NAME VARCHAR2(30),COLUMN_NAME VARCHAR2(30),DATA_TYPE VARCHAR2(9),DATA_LENGTH NUMBER,DATA_PRECISION NUMBER,DATA_SCALE NUMBER,NULLABLE VARCHAR2(1),COLUMN_ID NUMBER,DEFAULT_LENGTH NUMBER,DATA_DEFAULT varchar2(2000));

create table &prex.diff_cols2( TABLE_NAME VARCHAR2(30),COLUMN_NAME VARCHAR2(30),DATA_TYPE VARCHAR2(9),DATA_LENGTH NUMBER,DATA_PRECISION NUMBER,DATA_SCALE NUMBER,NULLABLE VARCHAR2(1),COLUMN_ID NUMBER,

Page 24: Admin Scripts

DEFAULT_LENGTH NUMBER,DATA_DEFAULT varchar2(2000));

declarecursor c1 isselectl.TABLE_NAME , l.COLUMN_NAME, l.DATA_TYPE , l.DATA_LENGTH, l.DATA_PRECISION , l.DATA_SCALE , l.NULLABLE, l.COLUMN_ID , l.DEFAULT_LENGTH , l.DATA_DEFAULT

from user_tab_columns l,&prex.common_tables cwhere c.table_name=l.table_name ;TYPE rec is record (TABLE_NAME VARCHAR2(30),COLUMN_NAME VARCHAR2(30),DATA_TYPE VARCHAR2(9),DATA_LENGTH NUMBER,DATA_PRECISION NUMBER,DATA_SCALE NUMBER,NULLABLE VARCHAR2(1),COLUMN_ID NUMBER,DEFAULT_LENGTH NUMBER,DATA_DEFAULT varchar2(2000)

);c rec;beginopen c1;loop

fetch c1 into c; exit when c1%NOTFOUND; insert into &prex.diff_cols1 values (c.table_name,c.column_name,c.data_type,c.data_length, c.DATA_PRECISION, c.DATA_SCALE, c.NULLABLE, c.COLUMN_ID, c.DEFAULT_LENGTH, c.DATA_DEFAULT);end loop;end;/declarecursor c1 isselectl.TABLE_NAME , l.COLUMN_NAME, l.DATA_TYPE , l.DATA_LENGTH, l.DATA_PRECISION , l.DATA_SCALE , l.NULLABLE, l.COLUMN_ID , l.DEFAULT_LENGTH , l.DATA_DEFAULT

from user_tab_columns@&prex.lnk l,&prex.common_tables cwhere c.table_name=l.table_name ;

Page 25: Admin Scripts

TYPE rec is record (TABLE_NAME VARCHAR2(30),COLUMN_NAME VARCHAR2(30),DATA_TYPE VARCHAR2(9),DATA_LENGTH NUMBER,DATA_PRECISION NUMBER,DATA_SCALE NUMBER,NULLABLE VARCHAR2(1),COLUMN_ID NUMBER,DEFAULT_LENGTH NUMBER,DATA_DEFAULT varchar2(2000)

);c rec;beginopen c1;loop

fetch c1 into c; exit when c1%NOTFOUND; insert into &prex.diff_cols2 values (c.table_name,c.column_name,c.data_type,c.data_length, c.DATA_PRECISION, c.DATA_SCALE, c.NULLABLE, c.COLUMN_ID, c.DEFAULT_LENGTH, c.DATA_DEFAULT);end loop;end;/column table_name format a20column column_name format a20column param format a15column local_value format a20column remote_value format a20set arraysize 1set maxdata 32000PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT DIFFERENCE IN COLUMN-DEFSPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select l.table_name,l.column_name,'DATA_DEFAULT' param ,l.DATA_DEFAULT local_value, r.DATA_DEFAULT remote_valuefrom &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.DATA_DEFAULT != r.DATA_DEFAULTunionselect l.table_name,l.column_name,'DATA_TYPE',l.data_type,r.data_type from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.data_type != r.data_typeunionselect l.table_name,l.column_name,'DATA_LENGTH',to_char(l.data_length),to_char(r.data_length) from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.data_length != r.data_lengthunionselect l.table_name,l.column_name,'DATA_PRECISION',

Page 26: Admin Scripts

to_char(l.DATA_PRECISION),to_char(r.DATA_PRECISION) from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.DATA_PRECISION != r.DATA_PRECISIONunionselect l.table_name,l.column_name,'DATA_SCALE',to_char(l.DATA_SCALE),to_char(r.DATA_SCALE) from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.DATA_SCALE != r.DATA_SCALEunionselect l.table_name,l.column_name,'NULLABLE',l.NULLABLE,r.NULLABLE from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.NULLABLE != r.NULLABLEunionselect l.table_name,l.column_name,'COLUMN_ID',to_char(l.COLUMN_ID),to_char(r.COLUMN_ID) from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.COLUMN_ID != r.COLUMN_IDunionselect l.table_name,l.column_name,'DEFAULT_LENGTH',to_char(l.DEFAULT_LENGTH),to_char(r.DEFAULT_LENGTH) from &prex.diff_cols1 l, &prex.diff_cols2 r where l.table_name=r.table_name and l.column_name=r.column_name and l.DEFAULT_LENGTH != r.DEFAULT_LENGTHorder by 1,2/ create table &prex.common_indexes asselect table_name, index_name from user_indexes@&prex.lnkwhere table_name in (select table_name from &prex.common_tables)intersectselect table_name, INdex_name from user_indexeswhere table_name in (select table_name from &prex.common_tables);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT INDEXES MISSING IN THIS SCHEMA FOR COMMON TABLESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name, index_name from user_indexes@&prex.lnkwhere table_name in (select table_name from &prex.common_tables)minusselect table_name, index_name from &prex.common_indexes;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT INDEXES MISSING IN REMOTE SCHEMA FOR COMMON TABLESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Page 27: Admin Scripts

select table_name, index_name from user_indexeswhere table_name in (select table_name from &prex.common_tables)minusselect table_name, index_name from &prex.common_indexes;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT COMMON INDEXES WITH DIFFERENT UNIQUENESSPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select a.table_name, a.index_name, a.uniqueness local, b.uniqueness remotefrom user_indexes a, user_indexes@&prex.lnk bwhere a.index_name = b.index_nameand a.uniqueness != b.uniquenessand (a.table_name, a.index_name) in(select table_name, index_name from &prex.common_indexes);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT INDEX COLUMNS MISSING IN THIS SCHEMA FOR COMMON INDEXESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select index_name, column_name from user_ind_columns@&prex.lnkwhere (table_name,index_name) in (select table_name,index_name from &prex.common_indexes)minusselect index_name, column_name from user_ind_columnswhere (table_name,index_name) in (select table_name,index_name from &prex.common_indexes);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT INDEX COLUMNS MISSING IN REMOTE SCHEMA FOR COMMON INDEXESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select index_name, column_name from user_ind_columnswhere (table_name,index_name) in (select table_name,index_name from &prex.common_indexes)minusselect index_name, column_name from user_ind_columns@&prex.lnkwhere (table_name,index_name) in (select table_name,index_name from &prex.common_indexes);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT INDEX COLUMNS POSITIONED DIFFERENTLY FOR COMMON INDEXESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select a.index_name, a.column_name, a.column_position local, b.column_position remote from user_ind_columns a,

Page 28: Admin Scripts

user_ind_columns@&prex.lnk bwhere (a.table_name,a.index_name) in (select table_name,index_name from &prex.common_indexes) and b.index_name = a.index_nameand b.table_name = a.table_nameand a.column_name = b.column_nameand a.column_position != b.column_position;

PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT CONSTRAINTS MISSING IN THIS SCHEMA FOR COMMON TABLESPROMPT (WORKS ONLY FOR CONSTRAINT WITH NON SYSTEM GENERATED NAMES)PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name,constraint_name from user_constraints@&prex.lnkwhere constraint_name not like 'SYS%' and table_name in(select table_name from &prex.common_tables)minusselect table_name,constraint_name from user_constraints where constraint_name not like 'SYS%' and table_name in(select table_name from &prex.common_tables);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT CONSTRAINTS MISSING IN REMOTE SCHEMA FOR COMMON TABLESPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select table_name,constraint_name from user_constraintswhere constraint_name not like 'SYS%' and table_name in(select table_name from &prex.common_tables)minusselect table_name,constraint_name from user_constraints@&prex.lnk where constraint_name not like 'SYS%' and table_name in(select table_name from &prex.common_tables);PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT COMMON CONSTRAINTS, TYPE MISMATCHPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select a.constraint_name,a.constraint_type local_type, b.constraint_type remote_typefrom user_constraints a, user_constraints@&prex.lnk b wherea.table_name = b.table_name anda.constraint_name=b.constraint_name and a.constraint_type !=b.constraint_type;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT COMMON CONSTRAINTS, TABLE MISMATCHPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Page 29: Admin Scripts

select a.constraint_name,a.table_name,b.table_name fromuser_constraints a, user_constraints@&prex.lnk b,(select z.constraint_name from (select constraint_name, table_name from useR_constraints unionselect constraint_name, table_name from user_constraints@&prex.lnk) zgroup by constraint_name having count(*) >1) qwhere a.constraint_name = q.constraint_name and b.constraint_name=q.constraint_nameand a.table_name != b.table_name;create table &prex.comcons asselect constraint_name, constraint_type, table_name from useR_constraints intersect select constraint_name, constraint_type, table_name from user_constraints@&prex.lnk;delete from &prex.comcons where constraint_name in (select constraint_name from &prex.comcons group by constraint_name having count(*) > 1);delete from &prex.comcons where constraint_name like 'SYS%';PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT DIFFERENCES IN COLUMN USAGE FOR CONSTRAINT DEFS PROMPT (Unique key, Primary Key, Foreign key)PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~declarecursor c1 isselect a.constraint_name,a.position,a.column_name,b.constraint_type from user_cons_columns a, &prex.comcons bwhere a.constraint_name=b.constraint_nameunionselect a.constraint_name,a.position,a.column_name,b.constraint_type from user_cons_columns@&prex.lnk a, &prex.comcons bwhere a.constraint_name=b.constraint_nameminus(select a.constraint_name,a.position,a.column_name,b.constraint_type from user_cons_columns a, &prex.comcons b where a.constraint_name=b.constraint_nameintersectselect a.constraint_name,a.position,a.column_name,b.constraint_type from user_cons_columns@&prex.lnk a, &prex.comcons b where a.constraint_name=b.constraint_name);i binary_integer;beginfor c in c1 loop dbms_output.put_line('COLUMN USAGE DIFFERENCE FOR '||c.constraint_type|| ' CONSTRAINT '||c.constraint_name); dbms_output.put_line('. Local columns:'); i:=1; for c2 in (select column_name col from user_cons_columns where constraint_name=c.constraint_name order by position) loop

Page 30: Admin Scripts

dbms_output.put_line('. '||c2.col); end loop; i:=1; dbms_output.put_line('. Remote columns:'); for c3 in (select column_name col from user_cons_columns@&prex.lnk where constraint_name=c.constraint_name ) loop dbms_output.put_line('. '||c3.col); end loop;end loop;end;/PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT DIFFERENCES IN CHECK CONSTRAINT DEFS PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~set serveroutput ondeclare cursor c1 is select constraint_name,constraint_type,table_name from &prex.comcons where constraint_type='C';cons varchar2(50);tab1 varchar2(50);tab2 varchar2(50);search1 varchar2(32000);search2 varchar2(32000);begindbms_output.enable(100000);for c in c1 loop select search_condition into search1 from user_constraints where constraint_name=c.constraint_name; select search_condition into search2 from user_constraints@&prex.lnk where constraint_name=c.constraint_name; if search1 != search2 then dbms_output.put_line('Check constraint '||c.constraint_name|| ' defined differently!'); dbms_output.put_line('. Local definition:'); dbms_output.put_line('. '||search1); dbms_output.put_line('. Remote definition:'); dbms_output.put_line('. '||search2); end if;end loop;end;/PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT TRIGGERS MISSING IN REMOTE SCHEMAPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select trigger_name from user_Triggers minus select trigger_name from user_Triggers@&prex.lnk;

Page 31: Admin Scripts

PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT TRIGGERS MISSING IN THIS SCHEMAPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select trigger_name from user_Triggers@&prex.lnk minus select trigger_name from user_Triggers@&prex.lnk;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT TRIGGER DEFINITION DIFFERENCES ON COMMON TRIGGERSPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~set serveroutput ondeclarecursor c1 is select TRIGGER_NAME,TRIGGER_TYPE,TRIGGERING_EVENT,TABLE_NAME,REFERENCING_NAMES,rtrim(WHEN_CLAUSE,' '),STATUS, rtrim(replace(description,'"&thisuser".',null),' ') DESCRIPTION,TRIGGER_BODY from user_Triggers;nam1 varchar2(30);type1 varchar2(16);event1 varchar2(26);table1 varchar2(30);ref1 varchar2(87);when1 varchar2(2000);status1 varchar2(8);desc1 varchar2(2000);body1 varchar2(32000);type2 varchar2(16);event2 varchar2(26);table2 varchar2(30);ref2 varchar2(87);when2 varchar2(2000);status2 varchar2(8);desc2 varchar2(2000);body2 varchar2(32000);pr_head boolean;begindbms_output.enable(100000);open c1;loopfetch c1 into nam1,type1,event1,table1,ref1,when1,status1,desc1,body1;exit when c1%notfound;begin

select TRIGGER_TYPE,TRIGGERING_EVENT, TABLE_NAME,REFERENCING_NAMES,rtrim(WHEN_CLAUSE,' '),STATUS, rtrim(replace(description,upper('"&remoteschema".'),null),' ') DESCRIPTION, TRIGGER_BODY into type2,event2,table2,ref2,when2,status2,desc2,body2 from user_Triggers@&prex.lnk where trigger_name=nam1;

Page 32: Admin Scripts

pr_head := FALSE; if table1 != table2 then dbms_output.put_line('T R I G G E R : '||nam1); dbms_output.put_line('-------------------------------------------------'|| '-----------------------'); pr_head := TRUE; dbms_output.put_line(' '); dbms_output.put_line('DEFINED ON DIFFERENT TABLES!'); dbms_output.put_line('. This table_name : '||table1); dbms_output.put_line('. Remote table_name: '||table2); end if; if event1 != event2 then if not pr_head then dbms_output.put_line('T R I G G E R : '||nam1); dbms_output.put_line('-------------------------------------------------'|| '-----------------------'); pr_head := TRUE; end if; dbms_output.put_line(' '); dbms_output.put_line('DEFINED FOR DIFFERENT EVENTS!'); dbms_output.put_line('. This event: '||event1); dbms_output.put_line('. Remote event: '||event2); end if; if type1 != type2 then if not pr_head then dbms_output.put_line('T R I G G E R : '||nam1); dbms_output.put_line('-------------------------------------------------'|| '-----------------------'); pr_head := TRUE; end if; dbms_output.put_line(' '); dbms_output.put_line('DIFFERENT TYPES!'); dbms_output.put_line('. This type: '||type1); dbms_output.put_line('. Remote: '||type2); end if; if ref1 != ref2 then if not pr_head then dbms_output.put_line('T R I G G E R : '||nam1); dbms_output.put_line('-------------------------------------------------'|| '-----------------------'); pr_head := TRUE; end if; dbms_output.put_line(' '); dbms_output.put_line('DIFFERENT REFERENCES!'); dbms_output.put_line('. This ref: '||ref1); dbms_output.put_line('. Remote: '||ref2); end if; if when1 != when2 then dbms_output.put_line(' '); if not pr_head then dbms_output.put_line('T R I G G E R : '||nam1); dbms_output.put_line('-------------------------------------------------'||

Page 33: Admin Scripts

'-----------------------'); pr_head := TRUE; end if; dbms_output.put_line('DIFFERENT WHEN CLAUSES!');

dbms_output.put_line('. Local when_clause:'); dbms_output.put_line(when1); dbms_output.put_line('. Remote when_clause: '); dbms_output.put_line(when2); end if; if status1 != status2 then dbms_output.put_line(' '); dbms_output.put_line('DIFFERENT STATUS!'); dbms_output.put_line('. Local status: '||status1); dbms_output.put_line('. Remote status: '||status2); end if;if replace(desc1,chr(10),'') != replace(desc2,chr(10),'') then

dbms_output.put_line(' '); dbms_output.put_line('DIFFERENT DESCRIPTIONS!'); dbms_output.put_line('Local definition: '); dbms_output.put_line(desc1); dbms_output.put_line('Remote definition: '); dbms_output.put_line(desc2); end if; if body1 != body2 then dbms_output.put_line(' '); dbms_output.put_line('THE PL/SQL BLOCKS ARE DIFFERENT! '); dbms_output.put_line(' '); end if; exception when NO_DATA_FOUND then null; when others then raise_application_error(-20010,SQLERRM);end;

end loop;end;/PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT MISSING PROCEDURES/PACKAGES/FUNCTIONS IN REMOTE SCHEMAPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select distinct name,type from user_source minus select distinct name,type from user_source@&prex.lnk;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT MISSING PROCEDURES/PACKAGES/FUNCTIONS IN LOCAL SCHEMAPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select distinct name,type from user_source@&prex.lnk minus select distinct name,type from user_source;create table &prex.comcod asselect distinct name,type from user_source intersect select distinct name,type from user_source@&prex.lnk;PROMPTPROMPT

Page 34: Admin Scripts

PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT PROCEDURES/PACKAGES/FUNCTIONS WITH DIFFERENT DEFINITIONSPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select distinct q.name Object_name,q.type Object_type from (select a.name,a.type,a.line,a.text from user_source a, &prex.comcod b where a.name=b.name union select a.name,a.type,a.line,a.text from user_source@&prex.lnk a, &prex.comcod b

where a.name=b.name minus(select a.name,a.type,a.line,a.text from user_source a, &prex.comcod b where a.name=b.name intersect

select a.name,a.type,a.line,a.text from user_source@&prex.lnk a, &prex.comcod b where a.name=b.name )) q;

PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT VIEWS MISSING IN THIS SCHEMA:PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~create table &prex.common_views asselect view_name from user_views@&prex.lnkintersectselect view_name from user_views;select view_name from user_views@&prex.lnkminusselect view_name from &prex.common_views;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT VIEWS MISSING IN REMOTE SCHEMA:PROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~select view_name from user_viewsminusselect view_name from user_views@&prex.lnk;PROMPTPROMPTPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PROMPT VIEWS WITH DIFFERENCES IN THE DEFINITIONPROMPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~declaredef1 varchar2(32000);def2 varchar2(32000);len1 number;len2 number;i number;

Page 35: Admin Scripts

cursor c1 is select view_name from &prex.common_views;begindbms_output.enable(100000);for c in c1 loop select text,text_length into def1,len1 from user_Views where view_name=c.view_name; select text,text_length into def2,len2 from user_Views@&prex.lnk where view_name=c.view_name; i := 1; def1:=replace(def1,' ',''); def2:=replace(def2,' ',''); if def1 != def2 or length(def1) != length(def2) then dbms_output.put_line(lpad('-',35+length(c.view_name),'-')); dbms_output.put_line('| '||c.view_name || ' |'); dbms_output.put_line(lpad('-',35+length(c.view_name),'-')); dbms_output.put_line('Local text_length: ' || to_char(len1)); dbms_output.put_line('Remote text_length): ' || to_char(len2)); dbms_output.put_line(' '); i := 1; while i <= length(def1) loop if substr(def1,i,240) != substr(def2,i,240) then dbms_output.put_line('Difference at offset ' || to_char(i)); dbms_output.put_line(' local: ' || substr(def1,i,240)); dbms_output.put_line(' remote: ' || substr(def2,i,240)); end if; i := i + 240; end loop; end if; if length(def2) > length(def1) then dbms_output.put_line('Remote longer than Local. Next 255 bytes: '); dbms_output.put_line(substr(def2,length(def1),255)); end if;end loop;end;/drop database link &prex.lnk;drop table &prex.comcod;drop table &prex.diff_cols1;drop table &prex.diff_cols2;drop table &prex.common_tables;drop table &prex.common_indexes;drop table &prex.common_views;drop table &prex.ind;drop table &prex.ind1;drop table &prex.ind2;drop table &prex.comcons;spool offset verify onset feedback onundef prex

Page 36: Admin Scripts

undef prefxundef aundef thisuserundef bundef REMOTESCHEMAundef REMOTEPASSW undef connstring undef cundef todaysdate

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid objects for specified schema, or all schema.-- Requirements : Requires all other "Compile_All" scripts.-- Call Syntax : @compile_all (schema-name or all)-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------@Compile_All_Specs &&1@Compile_All_Bodies &&1@Compile_All_Procs &&1@Compile_All_Funcs &&1@Compile_All_Views &&1

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_bodies.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid package bodies for specified schema, or all schema.-- Call Syntax : @compile_all_bodies (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER PACKAGE ' || a.owner || '.' || a.object_name || ' COMPILE BODY;'FROM all_objects aWHERE a.object_type = 'PACKAGE BODY'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

Page 37: Admin Scripts

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_funcs.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid functions for specified schema, or all schema.-- Call Syntax : @compile_all_funcs (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER FUNCTION ' || a.owner || '.' || a.object_name || ' COMPILE;'FROM all_objects aWHERE a.object_type = 'FUNCTION'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_procs.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid procedures for specified schema, or all schema.-- Call Syntax : @compile_all_procs (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------

Page 38: Admin Scripts

SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER PROCEDURE ' || a.owner || '.' || a.object_name || ' COMPILE;'FROM all_objects aWHERE a.object_type = 'PROCEDURE'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_specs.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid package specifications for specified schema, or all schema.-- Call Syntax : @compile_all_specs (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER PACKAGE ' || a.owner || '.' || a.object_name || ' COMPILE;'FROM all_objects aWHERE a.object_type = 'PACKAGE'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

Page 39: Admin Scripts

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_trigs.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid triggers for specified schema, or all schema.-- Call Syntax : @compile_all_trigs (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER TRIGGER ' || a.owner || '.' || a.object_name || ' COMPILE;'FROM all_objects aWHERE a.object_type = 'TRIGGER'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/compile_all_views.sql-- Author : DR Timothy S Hall-- Description : Compiles all invalid views for specified schema, or all schema.-- Call Syntax : @compile_all_views (schema-name or all)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

Page 40: Admin Scripts

SELECT 'ALTER VIEW ' || a.owner || '.' || a.object_name || ' COMPILE;'FROM all_objects aWHERE a.object_type = 'VIEW'AND a.status = 'INVALID'AND a.owner = Decode(Upper('&&1'), 'ALL',a.owner, Upper('&&1'));

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

CREATE OR REPLACE PACKAGE conversion_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/conversion_api-- Author : DR Timothy S Hall-- Description : Provides some base conversion functions.-- Ammedments :-- When Who What-- =========== ======== =================================================-- 10-SEP-2003 Tim Hall Initial Creation-- --------------------------------------------------------------------------

FUNCTION to_base(p_dec IN NUMBER, p_base IN NUMBER) RETURN VARCHAR2;

FUNCTION to_dec (p_str IN VARCHAR2, p_from_base IN NUMBER DEFAULT 16) RETURN NUMBER;

FUNCTION to_hex(p_dec IN NUMBER) RETURN VARCHAR2;

FUNCTION to_bin(p_dec IN NUMBER) RETURN VARCHAR2;

FUNCTION to_oct(p_dec IN NUMBER) RETURN VARCHAR2;

END conversion_api;/SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY conversion_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/conversion_api

Page 41: Admin Scripts

-- Author : DR Timothy S Hall-- Description : Provides some base conversion functions.-- Ammedments :-- When Who What-- =========== ======== =================================================-- 10-SEP-2003 Tim Hall Initial Creation-- --------------------------------------------------------------------------

-- ----------------------------------------------------------------------------FUNCTION to_base(p_dec IN NUMBER, p_base IN NUMBER) RETURN VARCHAR2 IS-- ----------------------------------------------------------------------------

l_str VARCHAR2(255) DEFAULT NULL;l_num NUMBER DEFAULT p_dec;l_hex VARCHAR2(16) DEFAULT '0123456789ABCDEF';

BEGINIF (TRUNC(p_dec) <> p_dec OR p_dec < 0) THEN

RAISE PROGRAM_ERROR;END IF;LOOP

l_str := SUBSTR(l_hex, MOD(l_num,p_base)+1, 1) || l_str;l_num := TRUNC(l_num/p_base);EXIT WHEN (l_num = 0);

END LOOP;RETURN l_str;

END to_base;-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------FUNCTION to_dec (p_str IN VARCHAR2, p_from_base IN NUMBER DEFAULT 16) RETURN NUMBER IS-- ----------------------------------------------------------------------------

l_num NUMBER DEFAULT 0;l_hex VARCHAR2(16) DEFAULT '0123456789ABCDEF';

BEGINFOR i IN 1 .. LENGTH(p_str) LOOP

l_num := l_num * p_from_base + INSTR(l_hex,UPPER(SUBSTR(p_str,i,1)))-1;

END LOOP;RETURN l_num;

END to_dec;-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------

Page 42: Admin Scripts

FUNCTION to_hex(p_dec IN NUMBER) RETURN VARCHAR2 IS-- ----------------------------------------------------------------------------BEGIN

RETURN to_base(p_dec, 16);END to_hex;-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------FUNCTION to_bin(p_dec IN NUMBER) RETURN VARCHAR2 IS-- ----------------------------------------------------------------------------BEGIN

RETURN to_base(p_dec, 2);END to_bin;-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------FUNCTION to_oct(p_dec IN NUMBER) RETURN VARCHAR2 IS-- ----------------------------------------------------------------------------BEGIN

RETURN to_base(p_dec, 8);END to_oct;-- ----------------------------------------------------------------------------

END conversion_api;/SHOW ERRORS

CREATE OR REPLACE PACKAGE csv AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/cvs.sql-- Author : DR Timothy S Hall-- Description : Basic CSV API. For usage notes see:-- http://www.oracle-base.com/articles/9i/GeneratingCSVFiles.php---- CREATE OR REPLACE DIRECTORY dba_dir AS '/u01/app/oracle/dba/';-- ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';--

Page 43: Admin Scripts

-- EXEC csv.generate('DBA_DIR', 'generate.csv', p_query => 'SELECT * FROM emp');---- Requirements : UTL_FILE, DBMS_SQL-- Ammedments :-- When Who What-- =========== ======== =================================================-- 14-MAY-2005 Tim Hall Initial Creation-- --------------------------------------------------------------------------

PROCEDURE generate (p_dir IN VARCHAR2, p_file IN VARCHAR2, p_query IN VARCHAR2);END csv;/SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY csv AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/cvs.sql-- Author : DR Timothy S Hall-- Description : Basic CSV API. For usage notes see:-- http://www.oracle-base.com/articles/9i/GeneratingCSVFiles.php---- CREATE OR REPLACE DIRECTORY dba_dir AS '/u01/app/oracle/dba/';-- ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';---- EXEC csv.generate('DBA_DIR', 'generate.csv', p_query => 'SELECT * FROM emp');---- Requirements : UTL_FILE, DBMS_SQL-- Ammedments :-- When Who What-- =========== ======== =================================================-- 14-MAY-2005 Tim Hall Initial Creation-- --------------------------------------------------------------------------

g_sep VARCHAR2(5) := ',';

PROCEDURE generate (p_dir IN VARCHAR2, p_file IN VARCHAR2, p_query IN VARCHAR2) AS l_cursor PLS_INTEGER; l_rows PLS_INTEGER; l_col_cnt PLS_INTEGER; l_desc_tab DBMS_SQL.desc_tab; l_buffer VARCHAR2(32767);

l_file UTL_FILE.file_type;

Page 44: Admin Scripts

BEGIN l_cursor := DBMS_SQL.open_cursor; DBMS_SQL.parse(l_cursor, p_query, DBMS_SQL.native);

DBMS_SQL.describe_columns (l_cursor, l_col_cnt, l_desc_tab);

FOR i IN 1 .. l_col_cnt LOOP DBMS_SQL.define_column(l_cursor, i, l_buffer, 32767 ); END LOOP;

l_rows := DBMS_SQL.execute(l_cursor);

l_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);

-- Output the column names. FOR i IN 1 .. l_col_cnt LOOP IF i > 1 THEN UTL_FILE.put(l_file, g_sep); END IF; UTL_FILE.put(l_file, l_desc_tab(i).col_name); END LOOP; UTL_FILE.new_line(l_file);

-- Output the data. LOOP EXIT WHEN DBMS_SQL.fetch_rows(l_cursor) = 0;

FOR i IN 1 .. l_col_cnt LOOP IF i > 1 THEN UTL_FILE.put(l_file, g_sep); END IF;

DBMS_SQL.COLUMN_VALUE(l_cursor, i, l_buffer); UTL_FILE.put(l_file, l_buffer); END LOOP; UTL_FILE.new_line(l_file); END LOOP;

UTL_FILE.fclose(l_file);EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(l_file) THEN UTL_FILE.fclose(l_file); END IF; IF DBMS_SQL.is_open(l_cursor) THEN DBMS_SQL.close_cursor(l_cursor); END IF; RAISE;END generate;

END csv;/SHOW ERRORS

Page 45: Admin Scripts

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/dict_comments.sql-- Author : DR Timothy S Hall-- Description : Displays comments associate with specific tables.-- Requirements : Access to the DBA views.-- Call Syntax : @dict_comments (table-name or partial match)-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------PROMPTSET VERIFY OFFSET FEEDBACK OFFSET LINESIZE 255SET PAGESIZE 1000

SELECT a.table_name "Table", Substr(a.comments,1,200) "Comments"FROM dictionary aWHERE a.table_name LIKE Upper('%&1%');

SET VERIFY ONSET FEEDBACK ONSET PAGESIZE 14PROMPT

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/drop_all.sql-- Author : DR Timothy S Hall-- Description : Drops all objects within the current schema.-- Call Syntax : @drop_all-- Last Modified: 20/01/2006-- Notes : Loops a maximum of 5 times, allowing for failed drops due to dependencies.-- Quits outer loop if no drops were atempted.-- -----------------------------------------------------------------------------------SET SERVEROUTPUT ONDECLARE l_count NUMBER; l_cascade VARCHAR2(20);BEGIN << dependency_failure_loop >> FOR i IN 1 .. 5 LOOP EXIT dependency_failure_loop WHEN l_count = 0; l_count := 0; FOR cur_rec IN (SELECT object_name, object_type FROM user_objects) LOOP BEGIN l_count := l_count + 1; l_cascade := NULL;

Page 46: Admin Scripts

IF cur_rec.object_type = 'TABLE' THEN l_cascade := ' CASCADE CONSTRAINTS'; END IF; EXECUTE IMMEDIATE 'DROP ' || cur_rec.object_type || ' "' || cur_rec.object_name || '"' || l_cascade; EXCEPTION WHEN OTHERS THEN NULL; END; END LOOP; -- Comment out the following line if you are pre-10g, or want to preserve the recyclebin contents. EXECUTE IMMEDIATE 'PURGE RECYCLEBIN'; DBMS_OUTPUT.put_line('Pass: ' || i || ' Drops: ' || l_count); END LOOP;END;/

CREATE OR REPLACE PACKAGE BODY err AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/err.pkb-- Author : DR Timothy S Hall-- Description : A simple mechanism for logging error information to a table.-- Requirements : err.pks, dsp.pks, dsp.pkb and schema definied in err.pks-- Ammedments :-- When Who What-- =========== ======== =================================================-- 17-JUL-2003 Tim Hall Initial Creation-- --------------------------------------------------------------------------

-- Package Variables g_logs_on BOOLEAN := TRUE; g_date_format VARCHAR2(50) := 'DD-MON-YYYY HH24:MI:SS';

-- Exposed Methods

-- -------------------------------------------------------------------------- PROCEDURE reset_defaults IS -- -------------------------------------------------------------------------- BEGIN g_logs_on := TRUE; g_date_format := 'DD-MON-YYYY HH24:MI:SS'; END; -- --------------------------------------------------------------------------

Page 47: Admin Scripts

-- -------------------------------------------------------------------------- PROCEDURE logs_on IS -- -------------------------------------------------------------------------- BEGIN g_logs_on := TRUE; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE logs_off IS -- -------------------------------------------------------------------------- BEGIN g_logs_on := FALSE; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE set_date_format (p_date_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS') IS -- -------------------------------------------------------------------------- BEGIN g_date_format := p_date_format; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2, p_error_level IN NUMBER DEFAULT 5, p_error_user IN VARCHAR2 DEFAULT USER) IS -- -------------------------------------------------------------------------- PRAGMA AUTONOMOUS_TRANSACTION; BEGIN IF g_logs_on THEN INSERT INTO error_logs (id, prefix, data, error_level, created_date, created_by) VALUES (error_logs_seq.NEXTVAL,

Page 48: Admin Scripts

p_prefix, p_data, p_error_level, SYSDATE, p_error_user);

COMMIT; END IF; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE line (p_data IN VARCHAR2, p_error_level IN NUMBER DEFAULT 5, p_error_user IN VARCHAR2 DEFAULT USER) IS -- -------------------------------------------------------------------------- PRAGMA AUTONOMOUS_TRANSACTION; BEGIN line (p_prefix => NULL, p_data => p_data, p_error_level => p_error_level, p_error_user => p_error_user); END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE display (p_error_level IN NUMBER DEFAULT NULL, p_error_user IN VARCHAR2 DEFAULT NULL, p_from_date IN DATE DEFAULT NULL, p_to_date IN DATE DEFAULT NUll) IS -- -------------------------------------------------------------------------- CURSOR c_errors IS SELECT * FROM error_logs WHERE error_level = NVL(p_error_level, error_level) AND created_by = NVL(p_error_user, created_by) AND created_date >= NVL(p_from_date, created_date) AND created_date <= NVL(p_to_date, created_date) ORDER BY id; BEGIN FOR cur_rec IN c_errors LOOP dsp.line(cur_rec.prefix, cur_rec.data); END LOOP; END; -- --------------------------------------------------------------------------

END err;/

Page 49: Admin Scripts

SHOW ERRORS

CREATE OR REPLACE PACKAGE dsp AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/dsp.pks-- Author : DR Timothy S Hall-- Description : An extension of the DBMS_OUTPUT package.-- Requirements : http://www.oracle-base.com/dba/miscellaneous/dsp.pkb-- Ammedments :-- When Who What-- =========== ======== =================================================-- 08-JAN-2002 Tim Hall Initial Creation-- 04-APR-2005 Tim Hall Store last call. Add get_last_prefix and-- get_last_data to allow retrieval.-- Switch from date to timestamp for greater accuracy.-- --------------------------------------------------------------------------

PROCEDURE reset_defaults;

PROCEDURE show_output_on; PROCEDURE show_output_off;

PROCEDURE show_date_on; PROCEDURE show_date_off;

PROCEDURE line_wrap_on; PROCEDURE line_wrap_off;

PROCEDURE set_max_width (p_width IN NUMBER);

PROCEDURE set_date_format (p_date_format IN VARCHAR2);

PROCEDURE file_output_on (p_file_dir IN VARCHAR2 DEFAULT NULL, p_file_name IN VARCHAR2 DEFAULT NULL);

PROCEDURE file_output_off;

FUNCTION get_last_prefix RETURN VARCHAR2;

FUNCTION get_last_data RETURN VARCHAR2;

PROCEDURE line (p_data IN VARCHAR2); PROCEDURE line (p_data IN NUMBER); PROCEDURE line (p_data IN BOOLEAN); PROCEDURE line (p_data IN DATE, p_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS.FF');

Page 50: Admin Scripts

PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2); PROCEDURE line (p_prefix IN VARCHAR2, p_data IN NUMBER); PROCEDURE line (p_prefix IN VARCHAR2, p_data IN BOOLEAN); PROCEDURE line (p_prefix IN VARCHAR2, p_data IN DATE, p_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS.FF');

END dsp;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY dsp AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/dsp.pkb-- Author : DR Timothy S Hall-- Description : An extension of the DBMS_OUTPUT package.-- Requirements : http://www.oracle-base.com/dba/miscellaneous/dsp.pks-- Ammedments :-- When Who What-- =========== ======== =================================================-- 08-JAN-2002 Tim Hall Initial Creation.-- 04-APR-2005 Tim Hall Store last call. Add get_last_prefix and-- get_last_data to allow retrieval.-- Switch from date to timestamp for greater accuracy.-- --------------------------------------------------------------------------

-- Package Variablesg_show_output BOOLEAN := FALSE;g_show_date BOOLEAN := FALSE;g_line_wrap BOOLEAN := TRUE;g_max_width NUMBER(10) := 255;g_date_format VARCHAR2(32767) := 'DD-MON-YYYY HH24:MI:SS.FF';g_file_dir VARCHAR2(32767) := NULL;g_file_name VARCHAR2(32767) := NULL;g_last_prefix VARCHAR2(32767) := NULL;g_last_data VARCHAR2(32767) := NULL;

-- Hidden MethodsPROCEDURE display (p_prefix IN VARCHAR2, p_data IN VARCHAR2);PROCEDURE wrap_line (p_data IN VARCHAR2);PROCEDURE output (p_data IN VARCHAR2);

Page 51: Admin Scripts

-- Exposed Methods

-- --------------------------------------------------------------------------PROCEDURE reset_defaults IS-- --------------------------------------------------------------------------BEGIN g_show_output := FALSE; g_show_date := FALSE; g_line_wrap := TRUE; g_max_width := 255; g_date_format := 'DD-MON-YYYY HH24:MI:SS.FF';END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE show_output_on IS-- --------------------------------------------------------------------------BEGIN g_show_output := TRUE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE show_output_off IS-- --------------------------------------------------------------------------BEGIN g_show_output := FALSE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE show_date_on IS-- --------------------------------------------------------------------------BEGIN g_show_date := TRUE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE show_date_off IS

Page 52: Admin Scripts

-- --------------------------------------------------------------------------BEGIN g_show_date := FALSE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line_wrap_on IS-- --------------------------------------------------------------------------BEGIN g_line_wrap := TRUE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line_wrap_off IS-- --------------------------------------------------------------------------BEGIN g_line_wrap := FALSE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE set_max_width (p_width IN NUMBER) IS-- --------------------------------------------------------------------------BEGIN g_max_width := p_width;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE set_date_format (p_date_format IN VARCHAR2) IS-- --------------------------------------------------------------------------BEGIN g_date_format := p_date_format;END;-- --------------------------------------------------------------------------

Page 53: Admin Scripts

-- --------------------------------------------------------------------------PROCEDURE file_output_on (p_file_dir IN VARCHAR2 DEFAULT NULL, p_file_name IN VARCHAR2 DEFAULT NULL) IS-- --------------------------------------------------------------------------BEGIN g_file_dir := p_file_dir; g_file_name := p_file_name;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE file_output_off IS-- --------------------------------------------------------------------------BEGIN g_file_dir := NULL; g_file_name := NULL;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_last_prefix RETURN VARCHAR2 IS-- --------------------------------------------------------------------------BEGIN RETURN g_last_prefix;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_last_data RETURN VARCHAR2 IS-- --------------------------------------------------------------------------BEGIN RETURN g_last_data;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_data IN VARCHAR2) IS

Page 54: Admin Scripts

-- --------------------------------------------------------------------------BEGIN display (NULL, p_data);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_data IN NUMBER) IS-- --------------------------------------------------------------------------BEGIN display (NULL, p_data);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_data IN BOOLEAN) IS-- --------------------------------------------------------------------------BEGIN line (NULL, p_data);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_data IN DATE, p_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS.FF') IS-- --------------------------------------------------------------------------BEGIN line (NULL, p_data, p_format);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2) IS-- --------------------------------------------------------------------------BEGIN display (p_prefix, p_data);END;

Page 55: Admin Scripts

-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_prefix IN VARCHAR2, p_data IN NUMBER) IS-- --------------------------------------------------------------------------BEGIN display (p_prefix, TO_CHAR(p_data));END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_prefix IN VARCHAR2, p_data IN BOOLEAN) IS-- --------------------------------------------------------------------------BEGIN IF p_data THEN display (p_prefix, 'TRUE'); ELSE display (p_prefix, 'FALSE'); END IF;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE line (p_prefix IN VARCHAR2, p_data IN DATE, p_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS.FF') IS-- --------------------------------------------------------------------------BEGIN display (p_prefix, TO_CHAR(p_data, p_format));END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE display (p_prefix IN VARCHAR2, p_data IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_data VARCHAR2(32767) := p_data;BEGIN

Page 56: Admin Scripts

g_last_prefix := p_prefix; g_last_data := p_data; IF g_show_output THEN IF l_data IS NULL THEN l_data := '<NULL>'; END IF;

IF p_prefix IS NOT NULL THEN l_data := p_prefix || ' : ' || l_data; END IF;

IF g_show_date THEN l_data := TO_CHAR(SYSTIMESTAMP, g_date_format) || ' : ' || l_data; END IF;

IF Length(l_data) > g_max_width THEN IF g_line_wrap THEN wrap_line (l_data); ELSE l_data := SUBSTR(l_data, 1, g_max_width); output (l_data); END IF; ELSE output (l_data); END IF; END IF;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE wrap_line (p_data IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_data VARCHAR2(32767) := p_data;BEGIN LOOP display (NULL, SUBSTR(l_data, 1, g_max_width)); l_data := SUBSTR(l_data, g_max_width + 1); EXIT WHEN l_data IS NULL; END LOOP;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE output (p_data IN VARCHAR2) IS-- --------------------------------------------------------------------------BEGIN IF g_file_dir IS NULL OR g_file_name IS NULL THEN DBMS_OUTPUT.put_line(p_data);

Page 57: Admin Scripts

ELSE DECLARE l_file UTL_FILE.file_type; BEGIN l_file := UTL_FILE.fopen (g_file_dir, g_file_name, 'A'); UTL_FILE.put_line(l_file, p_data); UTL_FILE.fclose (l_file); EXCEPTION WHEN OTHERS THEN UTL_FILE.fclose (l_file); END; END IF;END;-- --------------------------------------------------------------------------

END dsp;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE err AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/err.pks-- Author : DR Timothy S Hall-- Description : A simple mechanism for logging error information to a table.-- Requirements : err.pkb, dsp.pks, dsp.pkb and:---- CREATE TABLE error_logs (-- id NUMBER(10) NOT NULL,-- prefix VARCHAR2(50),-- data VARCHAR2(2000) NOT NULL,-- error_level NUMBER(2) NOT NULL,-- created_date DATE NOT NULL,-- created_by VARCHAR2(50) NOT NULL);---- ALTER TABLE error_logs ADD (CONSTRAINT error_logs_pk PRIMARY KEY (id));---- CREATE SEQUENCE error_logs_seq;---- Ammedments :-- When Who What-- =========== ======== =================================================-- 17-JUL-2003 Tim Hall Initial Creation-- --------------------------------------------------------------------------

PROCEDURE reset_defaults;

PROCEDURE logs_on;

Page 58: Admin Scripts

PROCEDURE logs_off;

PROCEDURE set_date_format (p_date_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS');

PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2, p_error_level IN NUMBER DEFAULT 5, p_error_user IN VARCHAR2 DEFAULT USER);

PROCEDURE line (p_data IN VARCHAR2, p_error_level IN NUMBER DEFAULT 5, p_error_user IN VARCHAR2 DEFAULT USER);

PROCEDURE display (p_error_level IN NUMBER DEFAULT NULL, p_error_user IN VARCHAR2 DEFAULT NULL, p_from_date IN DATE DEFAULT NULL, p_to_date IN DATE DEFAULT NUll);END err;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY ftp AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/ftp.pkb-- Author : DR Timothy S Hall-- Description : Basic FTP API. For usage notes see:-- http://www.oracle-base.com/articles/misc/FTPFromPLSQL.php-- Requirements : http://www.oracle-base.com/dba/miscellaneous/ftp.pks-- Ammedments :-- When Who What-- =========== ======== =================================================-- 14-AUG-2003 Tim Hall Initial Creation-- 10-MAR-2004 Tim Hall Add convert_crlf procedure.-- Incorporate CRLF conversion functionality into-- put_local_ascii_data and put_remote_ascii_data-- functions.-- Make get_passive function visible.-- Added get_direct and put_direct procedures.-- 23-DEC-2004 Tim Hall The get_reply procedure was altered to deal with-- banners starting with 4 white spaces. This fix is-- a small variation on the resolution provided by-- Gary Mason who spotted the bug.-- 10-NOV-2005 Tim Hall Addition of get_reply after doing a transfer to

Page 59: Admin Scripts

-- pickup the 226 Transfer complete message. This-- allows gets and puts with a single connection.-- Issue spotted by Trevor Woolnough.-- 03-OCT-2006 Tim Hall Add list, rename, delete, mkdir, rmdir procedures.-- 12-JAN-2007 Tim Hall A final call to get_reply was added to the get_remote%-- procedures to allow multiple transfers per connection.-- 15-Jan-2008 Tim Hall login: Include timeout parameter (suggested by Dmitry Bogomolov).-- 21-Jan-2008 Tim Hall put_%: "l_pos < l_clob_len" to "l_pos <= l_clob_len" to prevent-- potential loss of one character for single-byte files or files-- sized 1 byte bigger than a number divisible by the buffer size-- (spotted by Michael Surikov).-- 23-Jan-2008 Tim Hall send_command: Possible solution for ORA-29260 errors included,-- but commented out (suggested by Kevin Phillips).-- 12-Feb-2008 Tim Hall put_local_binary_data and put_direct: Open file with "wb" for-- binary writes (spotted by Dwayne Hoban). -- 03-Mar-2008 Tim Hall list: get_reply call and close of passive connection added-- (suggested by Julian, Bavaria).-- 12-Jun-2008 Tim Hall A final call to get_reply was added to the put_remote%-- procedures, but commented out. If uncommented, it may cause the-- operation to hang, but it has been reported (morgul) to allow-- multiple transfers per connection.-- get_reply: Moved to pakage specification.-- 24-Jun-2008 Tim Hall get_remote% and put_remote%: Exception handler added to close the passive-- connection and reraise the error (suggested by Mark Reichman).-- 22-Apr-2009 Tim Hall get_remote_ascii_data: Remove unnecessary logout (suggested by John Duncan).-- get_reply and list: Handle 400 messages as well as 500 messages (suggested by John Duncan).-- logout: Added a call to UTL_TCP.close_connection, so not necessary to close-- any connections manually (suggested by Victor Munoz).-- get_local_*_data: Check for zero length files to prevent exception (suggested by Daniel)-- nlst: Added to return list of file names only (suggested by Julian and John Duncan)-- --------------------------------------------------------------------------

Page 60: Admin Scripts

g_reply t_string_table := t_string_table();g_binary BOOLEAN := TRUE;g_debug BOOLEAN := TRUE;g_convert_crlf BOOLEAN := TRUE;

PROCEDURE debug (p_text IN VARCHAR2); -- --------------------------------------------------------------------------FUNCTION login (p_host IN VARCHAR2, p_port IN VARCHAR2, p_user IN VARCHAR2, p_pass IN VARCHAR2, p_timeout IN NUMBER := NULL) RETURN UTL_TCP.connection IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection;BEGIN g_reply.delete; l_conn := UTL_TCP.open_connection(p_host, p_port, tx_timeout => p_timeout); get_reply (l_conn); send_command(l_conn, 'USER ' || p_user); send_command(l_conn, 'PASS ' || p_pass); RETURN l_conn;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_passive (p_conn IN OUT NOCOPY UTL_TCP.connection) RETURN UTL_TCP.connection IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_reply VARCHAR2(32767); l_host VARCHAR(100); l_port1 NUMBER(10); l_port2 NUMBER(10);BEGIN send_command(p_conn, 'PASV'); l_reply := g_reply(g_reply.last); l_reply := REPLACE(SUBSTR(l_reply, INSTR(l_reply, '(') + 1, (INSTR(l_reply, ')')) - (INSTR(l_reply, '('))-1), ',', '.'); l_host := SUBSTR(l_reply, 1, INSTR(l_reply, '.', 1, 4)-1);

l_port1 := TO_NUMBER(SUBSTR(l_reply, INSTR(l_reply, '.', 1, 4)+1, (INSTR(l_reply, '.', 1, 5)-1) - (INSTR(l_reply, '.', 1, 4)))); l_port2 := TO_NUMBER(SUBSTR(l_reply, INSTR(l_reply, '.', 1, 5)+1)); l_conn := utl_tcp.open_connection(l_host, 256 * l_port1 + l_port2);

Page 61: Admin Scripts

return l_conn;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE logout(p_conn IN OUT NOCOPY UTL_TCP.connection, p_reply IN BOOLEAN := TRUE) AS-- --------------------------------------------------------------------------BEGIN send_command(p_conn, 'QUIT', p_reply); UTL_TCP.close_connection(p_conn);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE send_command (p_conn IN OUT NOCOPY UTL_TCP.connection, p_command IN VARCHAR2, p_reply IN BOOLEAN := TRUE) IS-- -------------------------------------------------------------------------- l_result PLS_INTEGER;BEGIN l_result := UTL_TCP.write_line(p_conn, p_command); -- If you get ORA-29260 after the PASV call, replace the above line with the following line. -- l_result := UTL_TCP.write_text(p_conn, p_command || utl_tcp.crlf, length(p_command || utl_tcp.crlf)); IF p_reply THEN get_reply(p_conn); END IF;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE get_reply (p_conn IN OUT NOCOPY UTL_TCP.connection) IS-- -------------------------------------------------------------------------- l_reply_code VARCHAR2(3) := NULL;BEGIN LOOP g_reply.extend; g_reply(g_reply.last) := UTL_TCP.get_line(p_conn, TRUE); debug(g_reply(g_reply.last));

Page 62: Admin Scripts

IF l_reply_code IS NULL THEN l_reply_code := SUBSTR(g_reply(g_reply.last), 1, 3); END IF; IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN RAISE_APPLICATION_ERROR(-20000, g_reply(g_reply.last)); ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN EXIT; END IF; END LOOP;EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_local_ascii_data (p_dir IN VARCHAR2, p_file IN VARCHAR2) RETURN CLOB IS-- -------------------------------------------------------------------------- l_bfile BFILE; l_data CLOB;BEGIN DBMS_LOB.createtemporary (lob_loc => l_data, cache => TRUE, dur => DBMS_LOB.call); l_bfile := BFILENAME(p_dir, p_file); DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);

IF DBMS_LOB.getlength(l_bfile) > 0 THEN DBMS_LOB.loadfromfile(l_data, l_bfile, DBMS_LOB.getlength(l_bfile)); END IF;

DBMS_LOB.fileclose(l_bfile);

RETURN l_data;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_local_binary_data (p_dir IN VARCHAR2, p_file IN VARCHAR2) RETURN BLOB IS-- --------------------------------------------------------------------------

Page 63: Admin Scripts

l_bfile BFILE; l_data BLOB;BEGIN DBMS_LOB.createtemporary (lob_loc => l_data, cache => TRUE, dur => DBMS_LOB.call); l_bfile := BFILENAME(p_dir, p_file); DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly); IF DBMS_LOB.getlength(l_bfile) > 0 THEN DBMS_LOB.loadfromfile(l_data, l_bfile, DBMS_LOB.getlength(l_bfile)); END IF; DBMS_LOB.fileclose(l_bfile);

RETURN l_data;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_remote_ascii_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2) RETURN CLOB IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_amount PLS_INTEGER; l_buffer VARCHAR2(32767); l_data CLOB;BEGIN DBMS_LOB.createtemporary (lob_loc => l_data, cache => TRUE, dur => DBMS_LOB.call);

l_conn := get_passive(p_conn); send_command(p_conn, 'RETR ' || p_file, TRUE); --logout(l_conn, FALSE); BEGIN LOOP l_amount := UTL_TCP.read_text (l_conn, l_buffer, 32767); DBMS_LOB.writeappend(l_data, l_amount, l_buffer); END LOOP; EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL; WHEN OTHERS THEN NULL; END; UTL_TCP.close_connection(l_conn); get_reply(p_conn);

Page 64: Admin Scripts

RETURN l_data;

EXCEPTION WHEN OTHERS THEN UTL_TCP.close_connection(l_conn); RAISE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------FUNCTION get_remote_binary_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2) RETURN BLOB IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_amount PLS_INTEGER; l_buffer RAW(32767); l_data BLOB;BEGIN DBMS_LOB.createtemporary (lob_loc => l_data, cache => TRUE, dur => DBMS_LOB.call);

l_conn := get_passive(p_conn); send_command(p_conn, 'RETR ' || p_file, TRUE); BEGIN LOOP l_amount := UTL_TCP.read_raw (l_conn, l_buffer, 32767); DBMS_LOB.writeappend(l_data, l_amount, l_buffer); END LOOP; EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL; WHEN OTHERS THEN NULL; END; UTL_TCP.close_connection(l_conn); get_reply(p_conn);

RETURN l_data;

EXCEPTION WHEN OTHERS THEN UTL_TCP.close_connection(l_conn); RAISE;END;-- --------------------------------------------------------------------------

Page 65: Admin Scripts

-- --------------------------------------------------------------------------PROCEDURE put_local_ascii_data (p_data IN CLOB, p_dir IN VARCHAR2, p_file IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_out_file UTL_FILE.file_type; l_buffer VARCHAR2(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_clob_len INTEGER;BEGIN l_clob_len := DBMS_LOB.getlength(p_data);

l_out_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767); WHILE l_pos <= l_clob_len LOOP DBMS_LOB.read (p_data, l_amount, l_pos, l_buffer); IF g_convert_crlf THEN l_buffer := REPLACE(l_buffer, CHR(13), NULL); END IF;

UTL_FILE.put(l_out_file, l_buffer); UTL_FILE.fflush(l_out_file); l_pos := l_pos + l_amount; END LOOP; UTL_FILE.fclose(l_out_file);EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(l_out_file) THEN UTL_FILE.fclose(l_out_file); END IF; RAISE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE put_local_binary_data (p_data IN BLOB, p_dir IN VARCHAR2, p_file IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_out_file UTL_FILE.file_type; l_buffer RAW(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_blob_len INTEGER;BEGIN l_blob_len := DBMS_LOB.getlength(p_data);

Page 66: Admin Scripts

l_out_file := UTL_FILE.fopen(p_dir, p_file, 'wb', 32767); WHILE l_pos <= l_blob_len LOOP DBMS_LOB.read (p_data, l_amount, l_pos, l_buffer); UTL_FILE.put_raw(l_out_file, l_buffer, TRUE); UTL_FILE.fflush(l_out_file); l_pos := l_pos + l_amount; END LOOP; UTL_FILE.fclose(l_out_file);EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(l_out_file) THEN UTL_FILE.fclose(l_out_file); END IF; RAISE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE put_remote_ascii_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2, p_data IN CLOB) IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_result PLS_INTEGER; l_buffer VARCHAR2(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_clob_len INTEGER;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'STOR ' || p_file, TRUE); l_clob_len := DBMS_LOB.getlength(p_data);

WHILE l_pos <= l_clob_len LOOP DBMS_LOB.READ (p_data, l_amount, l_pos, l_buffer); IF g_convert_crlf THEN l_buffer := REPLACE(l_buffer, CHR(13), NULL); END IF; l_result := UTL_TCP.write_text(l_conn, l_buffer, LENGTH(l_buffer)); UTL_TCP.flush(l_conn); l_pos := l_pos + l_amount; END LOOP;

UTL_TCP.close_connection(l_conn); -- The following line allows some people to make multiple calls from one connection. -- It causes the operation to hang for me, hence it is commented out by default.

Page 67: Admin Scripts

-- get_reply(p_conn);

EXCEPTION WHEN OTHERS THEN UTL_TCP.close_connection(l_conn); RAISE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE put_remote_binary_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2, p_data IN BLOB) IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_result PLS_INTEGER; l_buffer RAW(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_blob_len INTEGER;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'STOR ' || p_file, TRUE); l_blob_len := DBMS_LOB.getlength(p_data);

WHILE l_pos <= l_blob_len LOOP DBMS_LOB.READ (p_data, l_amount, l_pos, l_buffer); l_result := UTL_TCP.write_raw(l_conn, l_buffer, l_amount); UTL_TCP.flush(l_conn); l_pos := l_pos + l_amount; END LOOP;

UTL_TCP.close_connection(l_conn); -- The following line allows some people to make multiple calls from one connection. -- It causes the operation to hang for me, hence it is commented out by default. -- get_reply(p_conn);

EXCEPTION WHEN OTHERS THEN UTL_TCP.close_connection(l_conn); RAISE;END;-- --------------------------------------------------------------------------

Page 68: Admin Scripts

-- --------------------------------------------------------------------------PROCEDURE get (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_file IN VARCHAR2, p_to_dir IN VARCHAR2, p_to_file IN VARCHAR2) AS-- --------------------------------------------------------------------------BEGIN IF g_binary THEN put_local_binary_data(p_data => get_remote_binary_data (p_conn, p_from_file), p_dir => p_to_dir, p_file => p_to_file); ELSE put_local_ascii_data(p_data => get_remote_ascii_data (p_conn, p_from_file), p_dir => p_to_dir, p_file => p_to_file); END IF; END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE put (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_dir IN VARCHAR2, p_from_file IN VARCHAR2, p_to_file IN VARCHAR2) AS-- --------------------------------------------------------------------------BEGIN IF g_binary THEN put_remote_binary_data(p_conn => p_conn, p_file => p_to_file, p_data => get_local_binary_data(p_from_dir, p_from_file)); ELSE put_remote_ascii_data(p_conn => p_conn, p_file => p_to_file, p_data => get_local_ascii_data(p_from_dir, p_from_file)); END IF; get_reply(p_conn);END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE get_direct (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_file IN VARCHAR2,

Page 69: Admin Scripts

p_to_dir IN VARCHAR2, p_to_file IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_out_file UTL_FILE.file_type; l_amount PLS_INTEGER; l_buffer VARCHAR2(32767); l_raw_buffer RAW(32767);BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'RETR ' || p_from_file, TRUE); IF g_binary THEN l_out_file := UTL_FILE.fopen(p_to_dir, p_to_file, 'wb', 32767); ELSE l_out_file := UTL_FILE.fopen(p_to_dir, p_to_file, 'w', 32767); END IF; BEGIN LOOP IF g_binary THEN l_amount := UTL_TCP.read_raw (l_conn, l_raw_buffer, 32767); UTL_FILE.put_raw(l_out_file, l_raw_buffer, TRUE); ELSE l_amount := UTL_TCP.read_text (l_conn, l_buffer, 32767); IF g_convert_crlf THEN l_buffer := REPLACE(l_buffer, CHR(13), NULL); END IF; UTL_FILE.put(l_out_file, l_buffer); END IF; UTL_FILE.fflush(l_out_file); END LOOP; EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL; WHEN OTHERS THEN NULL; END; UTL_FILE.fclose(l_out_file); UTL_TCP.close_connection(l_conn);EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(l_out_file) THEN UTL_FILE.fclose(l_out_file); END IF; RAISE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE put_direct (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_dir IN VARCHAR2, p_from_file IN VARCHAR2,

Page 70: Admin Scripts

p_to_file IN VARCHAR2) IS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_bfile BFILE; l_result PLS_INTEGER; l_amount PLS_INTEGER := 32767; l_raw_buffer RAW(32767); l_len NUMBER; l_pos NUMBER := 1; ex_ascii EXCEPTION;BEGIN IF NOT g_binary THEN RAISE ex_ascii; END IF;

l_conn := get_passive(p_conn); send_command(p_conn, 'STOR ' || p_to_file, TRUE);

l_bfile := BFILENAME(p_from_dir, p_from_file); DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly); l_len := DBMS_LOB.getlength(l_bfile);

WHILE l_pos <= l_len LOOP DBMS_LOB.READ (l_bfile, l_amount, l_pos, l_raw_buffer); debug(l_amount); l_result := UTL_TCP.write_raw(l_conn, l_raw_buffer, l_amount); l_pos := l_pos + l_amount; END LOOP; DBMS_LOB.fileclose(l_bfile); UTL_TCP.close_connection(l_conn);EXCEPTION WHEN ex_ascii THEN RAISE_APPLICATION_ERROR(-20000, 'PUT_DIRECT not available in ASCII mode.'); WHEN OTHERS THEN IF DBMS_LOB.fileisopen(l_bfile) = 1 THEN DBMS_LOB.fileclose(l_bfile); END IF; RAISE;

END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE help (p_conn IN OUT NOCOPY UTL_TCP.connection) AS-- --------------------------------------------------------------------------BEGIN send_command(p_conn, 'HELP', TRUE);END;

Page 71: Admin Scripts

-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE ascii (p_conn IN OUT NOCOPY UTL_TCP.connection) AS-- --------------------------------------------------------------------------BEGIN send_command(p_conn, 'TYPE A', TRUE); g_binary := FALSE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE binary (p_conn IN OUT NOCOPY UTL_TCP.connection) AS-- --------------------------------------------------------------------------BEGIN send_command(p_conn, 'TYPE I', TRUE); g_binary := TRUE;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE list (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2, p_list OUT t_string_table) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_list t_string_table := t_string_table(); l_reply_code VARCHAR2(3) := NULL;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'LIST ' || p_dir, TRUE);

BEGIN LOOP l_list.extend; l_list(l_list.last) := UTL_TCP.get_line(l_conn, TRUE); debug(l_list(l_list.last)); IF l_reply_code IS NULL THEN l_reply_code := SUBSTR(l_list(l_list.last), 1, 3); END IF; IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN RAISE_APPLICATION_ERROR(-20000, l_list(l_list.last));

Page 72: Admin Scripts

ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN EXIT; END IF; END LOOP; EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL; END; l_list.delete(l_list.last); p_list := l_list; utl_tcp.close_connection(l_conn); get_reply (p_conn);END; -- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE nlst (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2, p_list OUT t_string_table) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection; l_list t_string_table := t_string_table(); l_reply_code VARCHAR2(3) := NULL;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'NLST ' || p_dir, TRUE);

BEGIN LOOP l_list.extend; l_list(l_list.last) := UTL_TCP.get_line(l_conn, TRUE); debug(l_list(l_list.last)); IF l_reply_code IS NULL THEN l_reply_code := SUBSTR(l_list(l_list.last), 1, 3); END IF; IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN RAISE_APPLICATION_ERROR(-20000, l_list(l_list.last)); ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN EXIT; END IF; END LOOP; EXCEPTION WHEN UTL_TCP.END_OF_INPUT THEN NULL; END; l_list.delete(l_list.last); p_list := l_list;

Page 73: Admin Scripts

utl_tcp.close_connection(l_conn); get_reply (p_conn);END; -- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE rename (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from IN VARCHAR2, p_to IN VARCHAR2) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'RNFR ' || p_from, TRUE); send_command(p_conn, 'RNTO ' || p_to, TRUE); logout(l_conn, FALSE);END rename; -- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE delete (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'DELE ' || p_file, TRUE); logout(l_conn, FALSE);END delete; -- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE mkdir (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'MKD ' || p_dir, TRUE); logout(l_conn, FALSE);END mkdir;

Page 74: Admin Scripts

-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE rmdir (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2) AS-- -------------------------------------------------------------------------- l_conn UTL_TCP.connection;BEGIN l_conn := get_passive(p_conn); send_command(p_conn, 'RMD ' || p_dir, TRUE); logout(l_conn, FALSE);END rmdir; -- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE convert_crlf (p_status IN BOOLEAN) AS-- --------------------------------------------------------------------------BEGIN g_convert_crlf := p_status;END;-- --------------------------------------------------------------------------

-- --------------------------------------------------------------------------PROCEDURE debug (p_text IN VARCHAR2) IS-- --------------------------------------------------------------------------BEGIN IF g_debug THEN DBMS_OUTPUT.put_line(SUBSTR(p_text, 1, 255)); END IF;END;-- --------------------------------------------------------------------------

END ftp;/SHOW ERRORS

CREATE OR REPLACE PACKAGE ftp AS-- --------------------------------------------------------------------------

Page 75: Admin Scripts

-- Name : http://www.oracle-base.com/dba/miscellaneous/ftp.pks-- Author : DR Timothy S Hall-- Description : Basic FTP API. For usage notes see:-- http://www.oracle-base.com/articles/misc/FTPFromPLSQL.php-- Requirements : UTL_TCP-- Ammedments :-- When Who What-- =========== ======== =================================================-- 14-AUG-2003 Tim Hall Initial Creation-- 10-MAR-2004 Tim Hall Add convert_crlf procedure.-- Make get_passive function visible.-- Added get_direct and put_direct procedures.-- 03-OCT-2006 Tim Hall Add list, rename, delete, mkdir, rmdir procedures.-- 15-Jan-2008 Tim Hall login: Include timeout parameter (suggestedby Dmitry Bogomolov).-- 12-Jun-2008 Tim Hall get_reply: Moved to pakage specification.-- 22-Apr-2009 Tim Hall nlst: Added to return list of file names only (suggested by Julian and John Duncan)-- --------------------------------------------------------------------------

TYPE t_string_table IS TABLE OF VARCHAR2(32767);

FUNCTION login (p_host IN VARCHAR2, p_port IN VARCHAR2, p_user IN VARCHAR2, p_pass IN VARCHAR2, p_timeout IN NUMBER := NULL) RETURN UTL_TCP.connection;

FUNCTION get_passive (p_conn IN OUT NOCOPY UTL_TCP.connection) RETURN UTL_TCP.connection;

PROCEDURE logout (p_conn IN OUT NOCOPY UTL_TCP.connection, p_reply IN BOOLEAN := TRUE);

PROCEDURE send_command (p_conn IN OUT NOCOPY UTL_TCP.connection, p_command IN VARCHAR2, p_reply IN BOOLEAN := TRUE);

PROCEDURE get_reply (p_conn IN OUT NOCOPY UTL_TCP.connection);

FUNCTION get_local_ascii_data (p_dir IN VARCHAR2, p_file IN VARCHAR2) RETURN CLOB;

FUNCTION get_local_binary_data (p_dir IN VARCHAR2, p_file IN VARCHAR2) RETURN BLOB;

FUNCTION get_remote_ascii_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2) RETURN CLOB;

Page 76: Admin Scripts

FUNCTION get_remote_binary_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2) RETURN BLOB;

PROCEDURE put_local_ascii_data (p_data IN CLOB, p_dir IN VARCHAR2, p_file IN VARCHAR2);

PROCEDURE put_local_binary_data (p_data IN BLOB, p_dir IN VARCHAR2, p_file IN VARCHAR2);

PROCEDURE put_remote_ascii_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2, p_data IN CLOB);

PROCEDURE put_remote_binary_data (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2, p_data IN BLOB);

PROCEDURE get (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_file IN VARCHAR2, p_to_dir IN VARCHAR2, p_to_file IN VARCHAR2);

PROCEDURE put (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_dir IN VARCHAR2, p_from_file IN VARCHAR2, p_to_file IN VARCHAR2);

PROCEDURE get_direct (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_file IN VARCHAR2, p_to_dir IN VARCHAR2, p_to_file IN VARCHAR2);

PROCEDURE put_direct (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from_dir IN VARCHAR2, p_from_file IN VARCHAR2, p_to_file IN VARCHAR2);

PROCEDURE help (p_conn IN OUT NOCOPY UTL_TCP.connection);

PROCEDURE ascii (p_conn IN OUT NOCOPY UTL_TCP.connection);

PROCEDURE binary (p_conn IN OUT NOCOPY UTL_TCP.connection);

PROCEDURE list (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2, p_list OUT t_string_table);

PROCEDURE nlst (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2, p_list OUT t_string_table);

Page 77: Admin Scripts

PROCEDURE rename (p_conn IN OUT NOCOPY UTL_TCP.connection, p_from IN VARCHAR2, p_to IN VARCHAR2);

PROCEDURE delete (p_conn IN OUT NOCOPY UTL_TCP.connection, p_file IN VARCHAR2);

PROCEDURE mkdir (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2);

PROCEDURE rmdir (p_conn IN OUT NOCOPY UTL_TCP.connection, p_dir IN VARCHAR2);

PROCEDURE convert_crlf (p_status IN BOOLEAN);

END ftp;/SHOW ERRORS

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/login.sql-- Author : DR Timothy S Hall-- Description : Resets the SQL*Plus prompt when a new connection is made.-- Call Syntax : @login-- Last Modified: 04/03/2004-- -----------------------------------------------------------------------------------SET FEEDBACK OFFSET TERMOUT OFF

COLUMN X NEW_VALUE YSELECT LOWER(USER || '@' || instance_name) X FROM v$instance;SET SQLPROMPT '&Y> '

ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS'; ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YYYY HH24:MI:SS.FF';

SET TERMOUT ONSET FEEDBACK ONSET LINESIZE 100

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/get_pivot.sql-- Author : DR Timothy S Hall

Page 78: Admin Scripts

-- Description : Creates a function to produce a virtual pivot table with the specific values.-- Requirements : CREATE TYPE, CREATE PROCEDURE-- Call Syntax : @get_pivot.sql-- Last Modified: 13/08/2003-- -----------------------------------------------------------------------------------

CREATE OR REPLACE TYPE t_pivot AS TABLE OF NUMBER;/

CREATE OR REPLACE FUNCTION get_pivot(p_max IN NUMBER, p_step IN NUMBER DEFAULT 1) RETURN t_pivot AS l_pivot t_pivot := t_pivot();BEGIN FOR i IN 0 .. TRUNC(p_max/p_step) LOOP l_pivot.extend; l_pivot(l_pivot.last) := 1 + (i * p_step); END LOOP; RETURN l_pivot;END;/SHOW ERRORS

SELECT column_valueFROM TABLE(get_pivot(17,2));

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/gen_health.sql-- Author : DR Timothy S Hall-- Description : Miscellaneous queries to check the general health of the system.-- Call Syntax : @gen_health-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------SELECT file_id, tablespace_name, file_name, status FROM sys.dba_data_files;

SELECT file#, name, status, enabled FROM v$datafile;

SELECT * FROM v$backup;

Page 79: Admin Scripts

SELECT * FROM v$recovery_status;

SELECT * FROM v$recover_file;

SELECT * FROM v$recovery_file_status;

SELECT * FROM v$recovery_log;

SELECT username, command, status, module FROM v$session;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/proc_defs.sql-- Author : DR Timothy S Hall-- Description : Lists the parameters for the specified package and procedure.-- Call Syntax : @proc_defs (package-name) (procedure-name or all)-- Last Modified: 24/09/2003-- -----------------------------------------------------------------------------------COLUMN "Object Name" FORMAT A30COLUMN ol FORMAT A2COLUMN sq FORMAT 99COLUMN "Argument Name" FORMAT A32COLUMN "Type" FORMAT A15COLUMN "Size" FORMAT A6BREAK ON ol SKIP 2SET PAGESIZE 0SET LINESIZE 200SET TRIMOUT ONSET TRIMSPOOL ONSET VERIFY OFF

SELECT object_name AS "Object Name", overload AS ol, sequence AS sq, RPAD(' ', data_level*2, ' ') || argument_name AS "Argument Name", data_type AS "Type", (CASE WHEN data_type IN ('VARCHAR2','CHAR') THEN TO_CHAR(data_length) WHEN data_scale IS NULL OR data_scale = 0 THEN TO_CHAR(data_precision) ELSE TO_CHAR(data_precision) || ',' || TO_CHAR(data_scale) END) "Size",

Page 80: Admin Scripts

in_out AS "In/Out", default_valueFROM user_argumentsWHERE package_name = UPPER('&1')AND object_name = DECODE(UPPER('&2'), 'ALL', object_name, UPPER('&2'))ORDER BY object_name, overload, sequence;

SET PAGESIZE 14SET LINESIZE 80

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/rebuild_index.sql-- Author : DR Timothy S Hall-- Description : Rebuilds the specified index, or all indexes.-- Call Syntax : @rebuild_index (index-name or all) (schema-name)-- Last Modified: 28/01/2001-- -----------------------------------------------------------------------------------SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFF

SPOOL temp.sql

SELECT 'ALTER INDEX ' || a.index_name || ' REBUILD;'FROM all_indexes aWHERE index_name = DECODE(Upper('&1'),'ALL',a.index_name,Upper('&1'))AND table_owner = Upper('&2')ORDER BY 1/

SPOOL OFF

-- Comment out following line to prevent immediate [email protected]

SET PAGESIZE 14SET FEEDBACK ONSET VERIFY ON

CREATE OR REPLACE PACKAGE soap_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/soap_api-- Author : DR Timothy S Hall-- Description : SOAP related functions for consuming web services.-- Ammedments :-- When Who What-- =========== ======== =================================================

Page 81: Admin Scripts

-- 04-OCT-2003 Tim Hall Initial Creation-- 23-FEB-2006 Tim Hall Parameterized the "soap" envelope tags.-- --------------------------------------------------------------------------

TYPE t_request IS RECORD ( method VARCHAR2(256), namespace VARCHAR2(256), body VARCHAR2(32767), envelope_tag VARCHAR2(30));

TYPE t_response IS RECORD( doc XMLTYPE, envelope_tag VARCHAR2(30));

FUNCTION new_request(p_method IN VARCHAR2, p_namespace IN VARCHAR2, p_envelope_tag IN VARCHAR2 DEFAULT 'SOAP-ENV') RETURN t_request;

PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request, p_name IN VARCHAR2, p_type IN VARCHAR2, p_value IN VARCHAR2);

FUNCTION invoke(p_request IN OUT NOCOPY t_request, p_url IN VARCHAR2, p_action IN VARCHAR2) RETURN t_response;

FUNCTION get_return_value(p_response IN OUT NOCOPY t_response, p_name IN VARCHAR2, p_namespace IN VARCHAR2) RETURN VARCHAR2;

END soap_api;/SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY soap_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/soap_api-- Author : DR Timothy S Hall-- Description : SOAP related functions for consuming web services.-- Ammedments :-- When Who What-- =========== ======== =================================================-- 04-OCT-2003 Tim Hall Initial Creation-- 23-FEB-2006 Tim Hall Parameterized the "soap" envelope tags.

Page 82: Admin Scripts

-- --------------------------------------------------------------------------

-- ---------------------------------------------------------------------FUNCTION new_request(p_method IN VARCHAR2, p_namespace IN VARCHAR2, p_envelope_tag IN VARCHAR2 DEFAULT 'SOAP-ENV') RETURN t_request AS-- --------------------------------------------------------------------- l_request t_request;BEGIN l_request.method := p_method; l_request.namespace := p_namespace; l_request.envelope_tag := p_envelope_tag; RETURN l_request;END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request, p_name IN VARCHAR2, p_type IN VARCHAR2, p_value IN VARCHAR2) AS-- ---------------------------------------------------------------------BEGIN p_request.body := p_request.body||'<'||p_name||' xsi:type="'||p_type||'">'||p_value||'</'||p_name||'>';END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------PROCEDURE generate_envelope(p_request IN OUT NOCOPY t_request,

p_env IN OUT NOCOPY VARCHAR2) AS-- ---------------------------------------------------------------------BEGIN p_env := '<'||p_request.envelope_tag||':Envelope xmlns:'||p_request.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/" ' || 'xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">' || '<'||p_request.envelope_tag||':Body>' ||

Page 83: Admin Scripts

'<'||p_request.method||' '||p_request.namespace||' '||p_request.envelope_tag||':encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' || p_request.body || '</'||p_request.method||'>' || '</'||p_request.envelope_tag||':Body>' || '</'||p_request.envelope_tag||':Envelope>';END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------PROCEDURE show_envelope(p_env IN VARCHAR2) AS-- --------------------------------------------------------------------- i PLS_INTEGER; l_len PLS_INTEGER;BEGIN i := 1; l_len := LENGTH(p_env); WHILE (i <= l_len) LOOP DBMS_OUTPUT.put_line(SUBSTR(p_env, i, 60)); i := i + 60; END LOOP;END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------PROCEDURE check_fault(p_response IN OUT NOCOPY t_response) AS-- --------------------------------------------------------------------- l_fault_node XMLTYPE; l_fault_code VARCHAR2(256); l_fault_string VARCHAR2(32767);BEGIN l_fault_node := p_response.doc.extract('/'||p_response.envelope_tag||':Fault', 'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/'); IF (l_fault_node IS NOT NULL) THEN l_fault_code := l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultcode/child::text()', 'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/').getstringval(); l_fault_string := l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultstring/child::text()',

Page 84: Admin Scripts

'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/').getstringval(); RAISE_APPLICATION_ERROR(-20000, l_fault_code || ' - ' || l_fault_string); END IF;END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------FUNCTION invoke(p_request IN OUT NOCOPY t_request, p_url IN VARCHAR2, p_action IN VARCHAR2) RETURN t_response AS-- --------------------------------------------------------------------- l_envelope VARCHAR2(32767); l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_response t_response;BEGIN generate_envelope(p_request, l_envelope); show_envelope(l_envelope); l_http_request := UTL_HTTP.begin_request(p_url, 'POST','HTTP/1.1'); UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml'); UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_envelope)); UTL_HTTP.set_header(l_http_request, 'SOAPAction', p_action); UTL_HTTP.write_text(l_http_request, l_envelope); l_http_response := UTL_HTTP.get_response(l_http_request); UTL_HTTP.read_text(l_http_response, l_envelope); UTL_HTTP.end_response(l_http_response); l_response.doc := XMLTYPE.createxml(l_envelope); l_response.envelope_tag := p_request.envelope_tag; l_response.doc := l_response.doc.extract('/'||l_response.envelope_tag||':Envelope/'||l_response.envelope_tag||':Body/child::node()', 'xmlns:'||l_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/"'); -- show_envelope(l_response.doc.getstringval()); check_fault(l_response); RETURN l_response;END;-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------FUNCTION get_return_value(p_response IN OUT NOCOPY t_response, p_name IN VARCHAR2,

Page 85: Admin Scripts

p_namespace IN VARCHAR2) RETURN VARCHAR2 AS-- ---------------------------------------------------------------------BEGIN RETURN p_response.doc.extract('//'||p_name||'/child::text()',p_namespace).getstringval();END;-- ---------------------------------------------------------------------

END soap_api;/SHOW ERRORS

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/switch_schema.sql-- Author : DR Timothy S Hall-- Description : Allows developers to switch synonyms between schemas where a single instance-- : contains multiple discrete schemas.-- Requirements : Must be loaded into privileged user such as SYS.-- Usage : Create the package in a user that has the appropriate privileges to perform the actions (SYS)-- : Amend the list of schemas in the "reset_grants" FOR LOOP as necessary.-- : Call SWITCH_SCHEMA.RESET_GRANTS once to grant privileges to the developer role.-- : Assign the developer role to all developers.-- : Tell developers to use EXEC SWITCH_SCHEMA.RESET_SCHEMA_SYNONYMS ('SCHEMA-NAME'); to switch-- : there synonyms between schemas.-- Call Syntax : EXEC SWITCH_SCHEMA.RESET_SCHEMA_SYNONYMS ('SCHEMA-NAME');-- Last Modified: 02/06/2003-- -----------------------------------------------------------------------------------CREATE OR REPLACE PACKAGE switch_schema AS

PROCEDURE reset_grants;PROCEDURE reset_schema_synonyms (p_schema IN VARCHAR2);

END;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY switch_schema AS

PROCEDURE reset_grants ISBEGIN

Page 86: Admin Scripts

FOR cur_obj IN (SELECT owner, object_name, object_type FROM all_objects WHERE owner IN ('SCHEMA1','SCHEMA2','SCHEMA3','SCHEMA4') AND object_type IN ('TABLE','VIEW','SEQUENCE', 'PACKAGE', 'PROCEDURE', 'FUNCTION', 'TYPE')) LOOP CASE WHEN cur_obj.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || cur_obj.owner || '."' || cur_obj.object_name || '" TO developer'; WHEN cur_obj.object_type IN ('SEQUENCE') THEN EXECUTE IMMEDIATE 'GRANT SELECT ON ' || cur_obj.owner || '."' || cur_obj.object_name || '" TO developer'; WHEN cur_obj.object_type IN ('PACKAGE', 'PROCEDURE', 'FUNCTION', 'TYPE') THEN EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || cur_obj.owner || '."' || cur_obj.object_name || '" TO developer'; END CASE; END LOOP;END;

PROCEDURE reset_schema_synonyms (p_schema IN VARCHAR2) IS v_user VARCHAR2(30) := USER;BEGIN -- Drop all existing synonyms FOR cur_obj IN (SELECT synonym_name FROM all_synonyms WHERE owner = v_user) LOOP EXECUTE IMMEDIATE 'DROP SYNONYM ' || v_user || '."' || cur_obj.synonym_name || '"'; END LOOP;

-- Create new synonyms FOR cur_obj IN (SELECT object_name, object_type FROM all_objects WHERE owner = p_schema AND object_type IN ('TABLE','VIEW','SEQUENCE'))

LOOP EXECUTE IMMEDIATE 'CREATE SYNONYM ' || v_user || '."' || cur_obj.object_name || '" FOR ' || p_schema || '."' || cur_obj.object_name || '"'; END LOOP;END;

END;/

SHOW ERRORS

CREATE PUBLIC SYNONYM switch_schema FOR switch_schema;GRANT EXECUTE ON switch_schema TO PUBLIC;

CREATE ROLE developer;

Page 87: Admin Scripts

CREATE OR REPLACE PACKAGE string_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/string_api.sql-- Author : DR Timothy S Hall-- Description : A package to hold string utilities.-- Requirements : -- Ammedments :-- When Who What-- =========== ======== =================================================-- 02-DEC-2004 Tim Hall Initial Creation-- --------------------------------------------------------------------------

-- Public typesTYPE t_split_array IS TABLE OF VARCHAR2(32767);

FUNCTION split_text (p_text IN CLOB, p_delimeter IN VARCHAR2 DEFAULT ',') RETURN t_split_array;

END string_api;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY string_api AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/string_api.sql-- Author : DR Timothy S Hall-- Description : A package to hold string utilities.-- Requirements : -- Ammedments :-- When Who What-- =========== ======== =================================================-- 02-DEC-2004 Tim Hall Initial Creation-- --------------------------------------------------------------------------

-- ----------------------------------------------------------------------------FUNCTION split_text (p_text IN CLOB, p_delimeter IN VARCHAR2 DEFAULT ',') RETURN t_split_array IS-- ---------------------------------------------------------------------------- l_array t_split_array := t_split_array(); l_text CLOB := p_text; l_idx NUMBER;BEGIN

Page 88: Admin Scripts

l_array.delete;

IF l_text IS NULL THEN RAISE_APPLICATION_ERROR(-20000, 'P_TEXT parameter cannot be NULL'); END IF;

WHILE l_text IS NOT NULL LOOP l_idx := INSTR(l_text, p_delimeter); l_array.extend; IF l_idx > 0 THEN l_array(l_array.last) := SUBSTR(l_text, 1, l_idx - 1); l_text := SUBSTR(l_text, l_idx + 1); ELSE l_array(l_array.last) := l_text; l_text := NULL; END IF; END LOOP; RETURN l_array;END split_text;-- ----------------------------------------------------------------------------

END string_api;/

SHOW ERRORS

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/string_agg.sql-- Author : DR Timothy S Hall (based on an a method suggested by Tom Kyte).-- http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:229614022562-- Description : Aggregate function to concatenate strings.-- Call Syntax : Incorporate into queries as follows:-- COLUMN employees FORMAT A50-- -- SELECT deptno, string_agg(ename) AS employees-- FROM emp-- GROUP BY deptno;-- -- DEPTNO EMPLOYEES-- ---------- ---------------------------------------------------- 10 CLARK,KING,MILLER-- 20 SMITH,FORD,ADAMS,SCOTT,JONES-- 30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD-- -- Last Modified: 20-APR-2005-- -----------------------------------------------------------------------------------CREATE OR REPLACE TYPE t_string_agg AS OBJECT( g_string VARCHAR2(32767),

Page 89: Admin Scripts

STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg, value IN VARCHAR2 ) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg, ctx2 IN t_string_agg) RETURN NUMBER);/SHOW ERRORS

CREATE OR REPLACE TYPE BODY t_string_agg IS STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg) RETURN NUMBER IS BEGIN sctx := t_string_agg(NULL); RETURN ODCIConst.Success; END;

MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg, value IN VARCHAR2 ) RETURN NUMBER IS BEGIN SELF.g_string := self.g_string || ',' || value; RETURN ODCIConst.Success; END;

MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER IS BEGIN returnValue := RTRIM(LTRIM(SELF.g_string, ','), ','); RETURN ODCIConst.Success; END;

MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg, ctx2 IN t_string_agg) RETURN NUMBER IS BEGIN SELF.g_string := SELF.g_string || ',' || ctx2.g_string; RETURN ODCIConst.Success; END;END;/

Page 90: Admin Scripts

SHOW ERRORS

CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)RETURN VARCHAR2PARALLEL_ENABLE AGGREGATE USING t_string_agg;/SHOW ERRORS

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/table_comments.sql-- Author : DR Timothy S Hall-- Description : Displays comments associate with specific tables.-- Requirements : Access to the DBA views.-- Call Syntax : @table_comments (schema or all) (table-name or partial match)-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------SET VERIFY OFFCOLUMN table_name FORMAT A30COLUMN comments FORMAT A40

SELECT table_name, commentsFROM dba_tab_commentsWHERE owner = DECODE(UPPER('&1'), 'ALL', owner, UPPER('&1'))AND table_name LIKE UPPER('%&2%')ORDER BY table_name;

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/table_defs.sql-- Author : DR Timothy S Hall-- Description : Lists the column definitions for the specified table.-- Call Syntax : @table_defs (tablee-name or all)-- Last Modified: 24/09/2003-- -----------------------------------------------------------------------------------COLUMN column_id FORMAT 99COLUMN data_type FORMAT A10COLUMN nullable FORMAT A8COLUMN size FORMAT A6BREAK ON table_name SKIP 2SET PAGESIZE 0SET LINESIZE 200SET TRIMOUT ONSET TRIMSPOOL ON

Page 91: Admin Scripts

SET VERIFY OFF

SELECT table_name, column_id, column_name, data_type, (CASE WHEN data_type IN ('VARCHAR2','CHAR') THEN TO_CHAR(data_length) WHEN data_scale IS NULL OR data_scale = 0 THEN TO_CHAR(data_precision) ELSE TO_CHAR(data_precision) || ',' || TO_CHAR(data_scale) END) "SIZE", DECODE(nullable, 'Y', '', 'NOT NULL') nullableFROM user_tab_columnsWHERE table_name = DECODE(UPPER('&1'), 'ALL', table_name, UPPER('&1'))ORDER BY table_name, column_id;

SET PAGESIZE 14SET LINESIZE 80

-- ------------------------------------------------------------------------------------- File Name : http://www.oracle-base.com/dba/miscellaneous/table_differences.sql-- Author : DR Timothy S Hall-- Description : Checks column differences between a specified table or ALL tables.-- : The comparison is done both ways so datatype/size mismatches will-- : be listed twice per column.-- : Log into the first schema-owner. Make sure a DB Link is set up to-- : the second schema owner. Use this DB Link in the definition of -- : the c_table2 cursor and amend v_owner1 and v_owner2 accordingly-- : to make output messages sensible.-- : The result is spooled to the Tab_Diffs.txt file in the working directory.-- Call Syntax : @table_differences (table-name or all)-- Last Modified: 15/07/2000-- -----------------------------------------------------------------------------------SET SERVEROUTPUT ONSET LINESIZE 500SET VERIFY OFFSET FEEDBACK OFFPROMPT

SPOOL Tab_Diffs.txt

DECLARE

CURSOR c_tables IS

Page 92: Admin Scripts

SELECT a.table_name FROM user_tables a WHERE a.table_name = Decode(Upper('&&1'),'ALL',a.table_name,Upper('&&1')); CURSOR c_table1 (p_table_name IN VARCHAR2, p_column_name IN VARCHAR2) IS SELECT a.column_name, a.data_type, a.data_length, a.data_precision, a.data_scale, a.nullable FROM user_tab_columns a WHERE a.table_name = p_table_name AND a.column_name = NVL(p_column_name,a.column_name);

CURSOR c_table2 (p_table_name IN VARCHAR2, p_column_name IN VARCHAR2) IS SELECT a.column_name, a.data_type, a.data_length, a.data_precision, a.data_scale, a.nullable FROM user_tab_columns@pdds a WHERE a.table_name = p_table_name AND a.column_name = NVL(p_column_name,a.column_name);

v_owner1 VARCHAR2(10) := 'DDDS2'; v_owner2 VARCHAR2(10) := 'PDDS'; v_data c_table1%ROWTYPE; v_work BOOLEAN := FALSE; BEGIN

Dbms_Output.Disable; Dbms_Output.Enable(1000000); FOR cur_tab IN c_tables LOOP v_work := FALSE; FOR cur_rec IN c_table1 (cur_tab.table_name, NULL) LOOP v_work := TRUE; OPEN c_table2 (cur_tab.table_name, cur_rec.column_name); FETCH c_table2 INTO v_data; IF c_table2%NOTFOUND THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : Present in ' || v_owner1 || ' but not in ' || v_owner2); ELSE IF cur_rec.data_type != v_data.data_type THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_TYPE differs between ' || v_owner1 || ' and ' || v_owner2); END IF;

Page 93: Admin Scripts

IF cur_rec.data_length != v_data.data_length THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_LENGTH differs between ' || v_owner1 || ' and ' || v_owner2); END IF; IF cur_rec.data_precision != v_data.data_precision THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_PRECISION differs between ' || v_owner1 || ' and ' || v_owner2); END IF; IF cur_rec.data_scale != v_data.data_scale THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_SCALE differs between ' || v_owner1 || ' and ' || v_owner2); END IF; IF cur_rec.nullable != v_data.nullable THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : NULLABLE differs between ' || v_owner1 || ' and ' || v_owner2); END IF; END IF; CLOSE c_table2; END LOOP; FOR cur_rec IN c_table2 (cur_tab.table_name, NULL) LOOP v_work := TRUE; OPEN c_table1 (cur_tab.table_name, cur_rec.column_name); FETCH c_table1 INTO v_data; IF c_table1%NOTFOUND THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : Present in ' || v_owner2 || ' but not in ' || v_owner1); ELSE IF cur_rec.data_type != v_data.data_type THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_TYPE differs between ' || v_owner2 || ' and ' || v_owner1); END IF; IF cur_rec.data_length != v_data.data_length THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_LENGTH differs between ' || v_owner2 || ' and ' || v_owner1); END IF; IF cur_rec.data_precision != v_data.data_precision THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_PRECISION differs between ' || v_owner2 || ' and ' || v_owner1); END IF; IF cur_rec.data_scale != v_data.data_scale THEN Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : DATA_SCALE differs between ' || v_owner2 || ' and ' || v_owner1); END IF; IF cur_rec.nullable != v_data.nullable THEN

Page 94: Admin Scripts

Dbms_Output.Put_Line(cur_tab.table_name || '.' || cur_rec.column_name || ' : NULLABLE differs between ' || v_owner2 || ' and ' || v_owner1); END IF; END IF; CLOSE c_table1; END LOOP; IF v_work = FALSE THEN Dbms_Output.Put_Line(cur_tab.table_name || ' does not exist!'); END IF; END LOOP;END;/

SPOOL OFF

PROMPTSET FEEDBACK ON

CREATE OR REPLACE PACKAGE trc AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/trc.pks-- Author : DR Timothy S Hall-- Description : A simple mechanism for tracing information to a table.-- Requirements : trc.pkb, dsp.pks, dsp.pkb and:---- CREATE TABLE trace_data (-- id NUMBER(10) NOT NULL,-- prefix VARCHAR2(50),-- data VARCHAR2(2000) NOT NULL,-- trc_level NUMBER(2) NOT NULL,-- created_date DATE NOT NULL,-- created_by VARCHAR2(50) NOT NULL);-- -- ALTER TABLE trace_data ADD (CONSTRAINT trc_pk PRIMARY KEY (id));---- CREATE SEQUENCE trc_seq;---- Ammedments :-- When Who What-- =========== ======== =================================================-- 08-JAN-2002 Tim Hall Initial Creation-- --------------------------------------------------------------------------

PROCEDURE reset_defaults;

PROCEDURE trace_on; PROCEDURE trace_off;

Page 95: Admin Scripts

PROCEDURE set_date_format (p_date_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS'); PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2, p_trc_level IN NUMBER DEFAULT 5, p_trc_user IN VARCHAR2 DEFAULT USER);

PROCEDURE display (p_trc_level IN NUMBER DEFAULT NULL, p_trc_user IN VARCHAR2 DEFAULT NULL, p_from_date IN DATE DEFAULT NULL, p_to_date IN DATE DEFAULT NUll);END trc;/

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY trc AS-- ---------------------------------------------------------------------------- Name : http://www.oracle-base.com/dba/miscellaneous/trc.pkb-- Author : DR Timothy S Hall-- Description : A simple mechanism for tracing information to a table.-- Requirements : trc.pks, dsp.pks, dsp.pkb and schema definied in trc.pks-- Ammedments :-- When Who What-- =========== ======== =================================================-- 08-JAN-2002 Tim Hall Initial Creation-- --------------------------------------------------------------------------

-- Package Variables g_trace_on BOOLEAN := FALSE; g_date_format VARCHAR2(50) := 'DD-MON-YYYY HH24:MI:SS';

-- Exposed Methods

-- -------------------------------------------------------------------------- PROCEDURE reset_defaults IS -- -------------------------------------------------------------------------- BEGIN g_trace_on := FALSE; g_date_format := 'DD-MON-YYYY HH24:MI:SS'; END; -- --------------------------------------------------------------------------

Page 96: Admin Scripts

-- -------------------------------------------------------------------------- PROCEDURE trace_on IS -- -------------------------------------------------------------------------- BEGIN g_trace_on := TRUE; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE trace_off IS -- -------------------------------------------------------------------------- BEGIN g_trace_on := FALSE; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE set_date_format (p_date_format IN VARCHAR2 DEFAULT 'DD-MON-YYYY HH24:MI:SS') IS -- -------------------------------------------------------------------------- BEGIN g_date_format := p_date_format; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE line (p_prefix IN VARCHAR2, p_data IN VARCHAR2, p_trc_level IN NUMBER DEFAULT 5, p_trc_user IN VARCHAR2 DEFAULT USER) IS -- -------------------------------------------------------------------------- PRAGMA AUTONOMOUS_TRANSACTION; BEGIN IF g_trace_on THEN INSERT INTO trace_data (id, prefix, data, trc_level, created_date, created_by) VALUES (trc_seq.nextval,

Page 97: Admin Scripts

p_prefix, p_data, p_trc_level, Sysdate, p_trc_user); COMMIT; END IF; END; -- --------------------------------------------------------------------------

-- -------------------------------------------------------------------------- PROCEDURE display (p_trc_level IN NUMBER DEFAULT NULL, p_trc_user IN VARCHAR2 DEFAULT NULL, p_from_date IN DATE DEFAULT NULL, p_to_date IN DATE DEFAULT NUll) IS -- -------------------------------------------------------------------------- CURSOR c_trace IS SELECT * FROM trace_data WHERE trc_level = NVL(p_trc_level, trc_level) AND created_by = NVL(p_trc_user, created_by) AND created_date >= NVL(p_from_date, created_date) AND created_date <= NVL(p_to_date, created_date) ORDER BY id; BEGIN FOR cur_rec IN c_trace LOOP dsp.line(cur_rec.prefix, cur_rec.data); END LOOP; END; -- -------------------------------------------------------------------------- END trc;/

SHOW ERRORS