You are on page 1of 97

10g

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN

username FORMAT A15


osuser FORMAT A15
sid FORMAT 99999
serial# FORMAT 9999999
wait_class FORMAT A15
state FORMAT A19
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
-- ----------------------------------------------------------------------------------

COLUMN name FORMAT A40


COLUMN highwater FORMAT 999999999999
COLUMN last_value FORMAT 999999999999
SET PAGESIZE 24
SELECT hwm1.name,
hwm1.highwater,
hwm1.last_value
FROM
dba_high_water_mark_statistics hwm1
WHERE 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
memory pools.

: Displays the values of the dynamically

-- Requirements : Access to the V$ views.


-- Call Syntax : @dynamic_memory
-- Last Modified: 08-NOV-2004
-- ---------------------------------------------------------------------------------COLUMN name FORMAT A40
COLUMN value FORMAT A40
SELECT name,
value
FROM
v$parameter
WHERE 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

-- ---------------------------------------------------------------------------------COLUMN name FORMAT A50


COLUMN detected_usages FORMAT 999999999999
SELECT u1.name,
u1.detected_usages
FROM
dba_feature_usage_statistics u1
WHERE 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.oraclebase.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
l_dbid
l_instance_number
l_file
l_file_name

NUMBER := NULL;
v$database.dbid%TYPE;
v$instance.instance_number%TYPE;
UTL_FILE.file_type;
VARCHAR(50);

BEGIN
SELECT dbid
INTO
l_dbid
FROM
v$database;
SELECT instance_number
INTO
l_instance_number

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
classes.

: Displays scheduler information about job

-- Requirements : Access to the DBA views.


-- Call Syntax : @job_classes
-- Last Modified: 27/07/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 200
COLUMN service FORMAT A20
COLUMN comments FORMAT A40
SELECT job_class_name,
resource_consumer_group,
service,
logging_level,

log_history,
comments
FROM
dba_scheduler_job_classes
ORDER BY job_class_name;

-- ----------------------------------------------------------------------------------- File Name


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

-- Description
programs.

: Displays scheduler information about job

-- Requirements : Access to the DBA views.


-- Call Syntax : @job_programs
-- Last Modified: 27/07/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 250
COLUMN
COLUMN
COLUMN
COLUMN

owner FORMAT A20


program_name FORMAT A30
program_action FORMAT A50
comments FORMAT A40

SELECT owner,
program_name,
program_type,
program_action,
number_of_arguments,
enabled,
comments
FROM
dba_scheduler_programs
ORDER BY owner, program_name;

-- ----------------------------------------------------------------------------------- File Name


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

-- Description
schedules.

: Displays scheduler information about job

-- Requirements : Access to the DBA views.


-- Call Syntax : @job_schedules
-- Last Modified: 27/07/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 250
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN

owner FORMAT A20


schedule_name FORMAT A30
start_date FORMAT A35
repeat_interval FORMAT A50
end_date FORMAT A35

COLUMN comments FORMAT A40


SELECT owner,
schedule_name,
start_date,
repeat_interval,
end_date,
comments
FROM
dba_scheduler_schedules
ORDER 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 A20
COLUMN next_run_date FORMAT A35
SELECT owner,
job_name,
enabled,
job_class,
next_run_date
FROM
dba_scheduler_jobs
ORDER BY owner, job_name;

-- ----------------------------------------------------------------------------------- File Name


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

-- Description
running jobs.

: Displays scheduler information for

-- Requirements : Access to the DBA views.


-- Call Syntax : @jobs_running
-- Last Modified: 27/07/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 200
COLUMN owner FORMAT A20
SELECT owner,

job_name,
running_instance,
elapsed_time
FROM
dba_scheduler_running_jobs
ORDER 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 500
SET PAGESIZE 1000
COLUMN username FORMAT A15
COLUMN machine FORMAT A25
COLUMN 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_time
FROM
v$session s
CONNECT BY PRIOR s.sid = s.blocking_session
START WITH s.blocking_session IS NULL;
SET PAGESIZE 14

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.com/dba/10g/segment_advisor.sql

-- Author

: DR Timothy S Hall

-- Description
segment.

: Displays segment advice for the specified

-- 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 1000000
SET LINESIZE 200
SET VERIFY OFF
DECLARE
l_object_id
NUMBER;
l_task_name
VARCHAR2(32767)
l_object_type
VARCHAR2(32767)
l_attr1
VARCHAR2(32767)
l_attr2
VARCHAR2(32767)
BEGIN
IF l_attr2 = 'NULL' THEN
l_attr2 := NULL;
END IF;

:=
:=
:=
:=

'SEGMENT_ADVISOR_TASK';
UPPER('&1');
UPPER('&2');
UPPER('&3');

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

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
services.

: Displays information about database

-- Requirements : Access to the DBA views.


-- Call Syntax : @services
-- Last Modified: 05/11/2004
-- ---------------------------------------------------------------------------------SET LINESIZE 200
COLUMN name FORMAT A30
COLUMN network_name FORMAT A50
SELECT name,
network_name
FROM
dba_services
ORDER BY name;

-- ----------------------------------------------------------------------------------- File Name


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

-- Description
session waits.

: Displays information on all database

-- Requirements : Access to the V$ views.


-- Call Syntax : @session_waits
-- Last Modified: 11/03/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 200
SET PAGESIZE 1000
COLUMN username FORMAT A20
COLUMN event FORMAT A30
COLUMN 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.state
FROM
v$session_wait sw,
v$session s
WHERE s.sid = sw.sid
ORDER BY sw.seconds_in_wait DESC;

-- ----------------------------------------------------------------------------------- File Name


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

-- Description
SGA.

: Displays the status of buffers in the

-- Requirements : Access to the v$ and DBA views.


-- Call Syntax : @sga_buffers
-- Last Modified: 27/07/2005
-- ---------------------------------------------------------------------------------SET LINESIZE 200
COLUMN 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 irec
FROM
v$bh bh
JOIN dba_objects o ON o.object_id = bh.objd
JOIN v$tablespace t ON t.ts# = bh.ts#

GROUP BY t.name, o.object_name;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.com/dba/monitoring/window_groups.sql
-- Author
: DR Timothy S Hall

-- Description
window groups.

: Displays scheduler information about

-- 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,
comments
FROM
dba_scheduler_window_groups
ORDER BY window_group_name;
SELECT window_group_name,
window_name
FROM
dba_scheduler_wingroup_members
ORDER BY window_group_name, window_name;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oracle-base.com/dba/monitoring/windows.sql
-- Author
: DR Timothy S Hall

-- Description
windows.

: Displays scheduler information about

-- Requirements : Access to the DBA views.


-- Call Syntax : @windows
-- Last Modified: 05/11/2004
-- ---------------------------------------------------------------------------------SET LINESIZE 250
COLUMN comments FORMAT A40
SELECT window_name,

resource_plan,
enabled,
active,
comments
FROM
dba_scheduler_windows
ORDER BY window_name;

11g
-- ----------------------------------------------------------------------------------- File Name
: http://www.oraclebase.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 100
COLUMN value FORMAT A60
SELECT value
FROM
v$diag_info
WHERE name = 'Default Trace File';

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 A25
COLUMN username FORMAT A20
COLUMN windows_domain FORMAT A20
SELECT credential_name,
username,
windows_domain
FROM
dba_scheduler_credentials
ORDER BY credential_name;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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_advice
ORDER BY memory_size;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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.oraclebase.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

-- ---------------------------------------------------------------------------------SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' ||
a.constraint_name || '";'
FROM
all_constraints a
WHERE 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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' ||
a.constraint_name || '";'
FROM
all_constraints a
WHERE 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 run
@temp.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE PRIMARY KEY;'
FROM
all_constraints a
WHERE 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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF

SET VERIFY OFF


SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" DISABLE CONSTRAINT "' ||
a.constraint_name || '";' enable_constraints
FROM
all_constraints a
WHERE 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
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' ||
a.constraint_name || '";'
FROM
all_constraints a
WHERE 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 run
@temp.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' ||
a.constraint_name || '";'
FROM
all_constraints a
WHERE 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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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
-- ----------------------------------------------------------------------------------

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE PRIMARY KEY;'
FROM
all_constraints a
WHERE 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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TABLE "' || a.table_name || '" ENABLE CONSTRAINT "' ||
a.constraint_name || '";'
FROM
all_constraints a
WHERE 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

@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

miscellaneous...
-- ----------------------------------------------------------------------------------- File Name
: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ANALYZE TABLE "' || table_name || '" COMPUTE STATISTICS;'
FROM
all_tables
WHERE owner = Upper('&1')
ORDER BY 1;
SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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

-- ---------------------------------------------------------------------------------SET VERIFY OFF


SET PAGESIZE 100
COLUMN column_name FORMAT A20
COLUMN comments
FORMAT A50
SELECT column_name,
comments
FROM
dba_col_comments
WHERE owner
= UPPER('&1')
AND
table_name = UPPER('&2')
ORDER BY column_name;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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
-- ---------------------------------------------------------------------------------PROMPT
SET VERIFY OFF
SET FEEDBACK OFF
SET LINESIZE 255
SET PAGESIZE 1000
SELECT a.table_name "Table",
a.table_type "Type",
Substr(a.comments,1,200) "Comments"
FROM
all_tab_comments a
WHERE 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 a
WHERE a.table_name = Upper('&1')
AND
a.owner
= Upper('&2');
SET VERIFY ON
SET FEEDBACK ON
SET PAGESIZE 14
PROMPT

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 example
check any grants, synonyms, clusters or storage definitions).
The script drops and creates a few temporary objects prefixed with
the 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/or
problems, please send a mail to the author.
This script has been tested on Oracle 7.3.
*/
undef prex
undef prefx
undef a
undef thisuser
undef b
undef REMOTESCHEMA
undef REMOTEPASSW
undef connstring
undef c
undef todaysdate
variable prefx varchar2(3)
declare
i number ;
j number ;
k number ;
cnt number;
begin

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 prex
set verify off
set linesize 132
set feedback off
select :prefx a from dual;
column b new_val thisuser
select user b from dual;
column c new_val todaysdate
select 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:' hide
accept connstring char prompt 'Enter remote connectstring:'
spool dbdiff.txt
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT
SCHEMA DEFINITION DIFFERENCES
&todaysdate
PROMPT
PROMPT
this schema: &thisuser
PROMPT
remote schema: &remoteschema.@&connstring
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT
PROMPT
create database link &prex.lnk connect to &REMOTESCHEMA identified
by &REMOTEPASSW using '&CONNSTRING';
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT TABLES MISSING IN THIS SCHEMA:
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create table &prex.common_tables as
select table_name from user_TAbles@&prex.lnk
intersect
select table_name from user_tables;
select table_name from user_TAbles@&prex.lnk
minus
select table_name from &prex.common_tables;
PROMPT
PROMPT

PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT TABLES MISSING IN REMOTE SCHEMA:
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select table_name from user_TAbles where table_name not like '&prex.%'
minus
select table_name from user_tables@&prex.lnk;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT COLUMNS MISSING IN THIS SCHEMA FOR COMMON TABLES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select table_name,column_name from user_tab_columns@&prex.lnk
where table_name in
(select table_name from &prex.common_tables)
minus
select table_name,column_name from user_tab_columns
where table_name in
(select table_name from &prex.common_tables);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT COLUMNS MISSING IN REMOTE SCHEMA FOR COMMON TABLES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select table_name,column_name from user_tab_columns
where table_name in
(select table_name from &prex.common_tables)
minus
select 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,

DEFAULT_LENGTH
NUMBER,
DATA_DEFAULT
varchar2(2000));
declare
cursor c1 is
select
l.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 c
where 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;
begin
open 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;
/
declare
cursor c1 is
select
l.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 c
where 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;
begin
open 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 a20
column column_name format a20
column param format a15
column local_value format a20
column remote_value format a20
set arraysize 1
set maxdata 32000
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT DIFFERENCE IN COLUMN-DEFS
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select l.table_name,l.column_name,'DATA_DEFAULT' param ,
l.DATA_DEFAULT local_value, r.DATA_DEFAULT remote_value
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_DEFAULT != r.DATA_DEFAULT
union
select 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_type
union
select 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_length
union
select l.table_name,l.column_name,'DATA_PRECISION',

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_PRECISION
union
select 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_SCALE
union
select 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.NULLABLE
union
select 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_ID
union
select
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_LENGTH
order by 1,2
/
create table &prex.common_indexes as
select table_name, index_name from user_indexes@&prex.lnk
where table_name in (select table_name from &prex.common_tables)
intersect
select table_name, INdex_name from user_indexes
where table_name in (select table_name from &prex.common_tables);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT INDEXES MISSING IN THIS SCHEMA FOR COMMON TABLES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select table_name, index_name from user_indexes@&prex.lnk
where table_name in (select table_name from &prex.common_tables)
minus
select table_name, index_name from &prex.common_indexes;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT INDEXES MISSING IN REMOTE SCHEMA FOR COMMON TABLES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

select table_name, index_name from user_indexes


where table_name in (select table_name from &prex.common_tables)
minus
select table_name, index_name from &prex.common_indexes;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT COMMON INDEXES WITH DIFFERENT UNIQUENESS
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select a.table_name, a.index_name, a.uniqueness local, b.uniqueness
remote
from user_indexes a,
user_indexes@&prex.lnk b
where a.index_name = b.index_name
and
a.uniqueness != b.uniqueness
and (a.table_name, a.index_name) in
(select table_name, index_name from &prex.common_indexes);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT INDEX COLUMNS MISSING IN THIS SCHEMA FOR COMMON INDEXES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select index_name, column_name from user_ind_columns@&prex.lnk
where (table_name,index_name) in
(select table_name,index_name from &prex.common_indexes)
minus
select index_name, column_name from user_ind_columns
where (table_name,index_name) in
(select table_name,index_name from &prex.common_indexes);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT INDEX COLUMNS MISSING IN REMOTE SCHEMA FOR COMMON INDEXES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select index_name, column_name from user_ind_columns
where (table_name,index_name) in
(select table_name,index_name from &prex.common_indexes)
minus
select index_name, column_name from user_ind_columns@&prex.lnk
where (table_name,index_name) in
(select table_name,index_name from &prex.common_indexes);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT INDEX COLUMNS POSITIONED DIFFERENTLY FOR COMMON INDEXES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select a.index_name, a.column_name, a.column_position local,
b.column_position remote
from user_ind_columns a,

user_ind_columns@&prex.lnk b
where (a.table_name,a.index_name) in
(select table_name,index_name from &prex.common_indexes)
and b.index_name = a.index_name
and b.table_name = a.table_name
and a.column_name = b.column_name
and a.column_position != b.column_position;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT CONSTRAINTS MISSING IN THIS SCHEMA FOR COMMON TABLES
PROMPT (WORKS ONLY FOR CONSTRAINT WITH NON SYSTEM GENERATED NAMES)
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select 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)
minus
select table_name,constraint_name from user_constraints
where constraint_name not like 'SYS%' and table_name in
(select table_name from &prex.common_tables);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT CONSTRAINTS MISSING IN REMOTE SCHEMA FOR COMMON TABLES
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select table_name,constraint_name from user_constraints
where constraint_name not like 'SYS%' and table_name in
(select table_name from &prex.common_tables)
minus
select 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);
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT COMMON CONSTRAINTS, TYPE MISMATCH
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select a.constraint_name,a.constraint_type local_type,
b.constraint_type remote_type
from user_constraints a, user_constraints@&prex.lnk b where
a.table_name = b.table_name and
a.constraint_name=b.constraint_name and
a.constraint_type !=b.constraint_type;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT COMMON CONSTRAINTS, TABLE MISMATCH
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

select a.constraint_name,a.table_name,b.table_name from


user_constraints a, user_constraints@&prex.lnk b,
(select z.constraint_name from
(select constraint_name, table_name from useR_constraints union
select constraint_name, table_name from user_constraints@&prex.lnk) z
group by constraint_name having count(*) >1) q
where a.constraint_name = q.constraint_name and
b.constraint_name=q.constraint_name
and a.table_name != b.table_name;
create table &prex.comcons as
select 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%';
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT DIFFERENCES IN COLUMN USAGE FOR CONSTRAINT DEFS
PROMPT
(Unique key, Primary Key, Foreign key)
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare
cursor c1 is
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_name
union
select 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
minus
(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_name
intersect
select 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;
begin
for 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

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;
/
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT DIFFERENCES IN CHECK CONSTRAINT DEFS
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set serveroutput on
declare
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);
begin
dbms_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;
/
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT TRIGGERS MISSING IN REMOTE SCHEMA
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select trigger_name from user_Triggers minus
select trigger_name from user_Triggers@&prex.lnk;

PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT TRIGGERS MISSING IN THIS SCHEMA
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select trigger_name from user_Triggers@&prex.lnk minus
select trigger_name from user_Triggers@&prex.lnk;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT TRIGGER DEFINITION DIFFERENCES ON COMMON TRIGGERS
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set serveroutput on
declare
cursor 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;
begin
dbms_output.enable(100000);
open c1;
loop
fetch 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;

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('------------------------------------------------'||

'-----------------------');
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;
/
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT MISSING PROCEDURES/PACKAGES/FUNCTIONS IN REMOTE SCHEMA
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select distinct name,type from user_source minus
select distinct name,type from user_source@&prex.lnk;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT MISSING PROCEDURES/PACKAGES/FUNCTIONS IN LOCAL SCHEMA
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select distinct name,type from user_source@&prex.lnk minus
select distinct name,type from user_source;
create table &prex.comcod as
select distinct name,type from user_source intersect
select distinct name,type from user_source@&prex.lnk;
PROMPT
PROMPT

PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT PROCEDURES/PACKAGES/FUNCTIONS WITH DIFFERENT DEFINITIONS
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT VIEWS MISSING IN THIS SCHEMA:
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create table &prex.common_views as
select view_name from user_views@&prex.lnk
intersect
select view_name from user_views;
select view_name from user_views@&prex.lnk
minus
select view_name from &prex.common_views;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT VIEWS MISSING IN REMOTE SCHEMA:
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select view_name from user_views
minus
select view_name from user_views@&prex.lnk;
PROMPT
PROMPT
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROMPT VIEWS WITH DIFFERENCES IN THE DEFINITION
PROMPT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare
def1 varchar2(32000);
def2 varchar2(32000);
len1 number;
len2 number;
i number;

cursor c1 is select view_name from &prex.common_views;


begin
dbms_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 off
set verify on
set feedback on
undef prex

undef
undef
undef
undef
undef
undef
undef
undef
undef

prefx
a
thisuser
b
REMOTESCHEMA
REMOTEPASSW
connstring
c
todaysdate

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER PACKAGE
BODY;'
FROM
all_objects a
WHERE
a.object_type
AND
a.status
AND
a.owner
Upper('&&1'));

' || a.owner || '.' || a.object_name || ' COMPILE

= 'PACKAGE BODY'
= 'INVALID'
= Decode(Upper('&&1'), 'ALL',a.owner,

SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER FUNCTION ' || a.owner || '.' || a.object_name || '
COMPILE;'
FROM
all_objects a
WHERE
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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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
-- ----------------------------------------------------------------------------------

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER PROCEDURE
COMPILE;'
FROM
all_objects a
WHERE
a.object_type =
AND
a.status
=
AND
a.owner
=
Upper('&&1'));

' || a.owner || '.' || a.object_name || '

'PROCEDURE'
'INVALID'
Decode(Upper('&&1'), 'ALL',a.owner,

SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON
-- ----------------------------------------------------------------------------------- File Name
: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER PACKAGE
COMPILE;'
FROM
all_objects a
WHERE
a.object_type
AND
a.status
AND
a.owner
Upper('&&1'));

' || a.owner || '.' || a.object_name || '

= 'PACKAGE'
= 'INVALID'
= Decode(Upper('&&1'), 'ALL',a.owner,

SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER TRIGGER
COMPILE;'
FROM
all_objects a
WHERE
a.object_type
AND
a.status
AND
a.owner
Upper('&&1'));

' || a.owner || '.' || a.object_name || '

= 'TRIGGER'
= 'INVALID'
= Decode(Upper('&&1'), 'ALL',a.owner,

SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql

SELECT 'ALTER VIEW ' ||


FROM
all_objects a
WHERE
a.object_type =
AND
a.status
=
AND
a.owner
=
Upper('&&1'));

a.owner || '.' || a.object_name || ' COMPILE;'


'VIEW'
'INVALID'
Decode(Upper('&&1'), 'ALL',a.owner,

SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

CREATE OR REPLACE PACKAGE conversion_api AS


-- -------------------------------------------------------------------------- Name
: http://www.oraclebase.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
p_base

IN
IN

NUMBER,
NUMBER) RETURN VARCHAR2;

FUNCTION to_dec (p_str


p_from_base

IN
IN

VARCHAR2,
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.oraclebase.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 IS
-- --------------------------------------------------------------------------l_str
VARCHAR2(255) DEFAULT NULL;
l_num
NUMBER
DEFAULT p_dec;
l_hex
VARCHAR2(16) DEFAULT '0123456789ABCDEF';
BEGIN
IF (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';
BEGIN
FOR 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;
-- ---------------------------------------------------------------------------

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

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.oraclebase.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
-- ------------------------------------------------------------------------PROCEDURE generate (p_dir
p_file
p_query
END csv;
/
SHOW ERRORS

IN
IN
IN

VARCHAR2,
VARCHAR2,
VARCHAR2);

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.oraclebase.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
p_file
IN
p_query
IN
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;

VARCHAR2,
VARCHAR2,
VARCHAR2) AS

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

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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
-- ---------------------------------------------------------------------------------PROMPT
SET VERIFY OFF
SET FEEDBACK OFF
SET LINESIZE 255
SET PAGESIZE 1000
SELECT a.table_name "Table",
Substr(a.comments,1,200) "Comments"
FROM
dictionary a
WHERE a.table_name LIKE Upper('%&1%');
SET VERIFY ON
SET FEEDBACK ON
SET PAGESIZE 14
PROMPT

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 ON
DECLARE
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;

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;
-- -------------------------------------------------------------------------

-- ------------------------------------------------------------------------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-MONYYYY 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,

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;
/

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


PROCEDURE file_output_on (p_file_dir
p_file_name

IN
IN

IN

VARCHAR2);

VARCHAR2 DEFAULT NULL,


VARCHAR2 DEFAULT NULL);

PROCEDURE file_output_off;
FUNCTION get_last_prefix
RETURN VARCHAR2;
FUNCTION get_last_data
RETURN VARCHAR2;
PROCEDURE
PROCEDURE
PROCEDURE
PROCEDURE

line
line
line
line

HH24:MI:SS.FF');

(p_data
(p_data
(p_data
(p_data
p_format

IN
IN
IN
IN
IN

VARCHAR2);
NUMBER);
BOOLEAN);
DATE,
VARCHAR2 DEFAULT 'DD-MON-YYYY

PROCEDURE line (p_prefix


p_data
PROCEDURE line (p_prefix
p_data
PROCEDURE line (p_prefix
p_data
PROCEDURE line (p_prefix
p_data
p_format
HH24:MI:SS.FF');

IN
IN
IN
IN
IN
IN
IN
IN
IN

VARCHAR2,
VARCHAR2);
VARCHAR2,
NUMBER);
VARCHAR2,
BOOLEAN);
VARCHAR2,
DATE,
VARCHAR2 DEFAULT 'DD-MON-YYYY

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 Variables
g_show_output BOOLEAN
g_show_date
BOOLEAN
g_line_wrap
BOOLEAN
g_max_width
NUMBER(10)
g_date_format VARCHAR2(32767)
g_file_dir
VARCHAR2(32767)
g_file_name
VARCHAR2(32767)
g_last_prefix VARCHAR2(32767)
g_last_data
VARCHAR2(32767)

:=
:=
:=
:=
:=
:=
:=
:=
:=

FALSE;
FALSE;
TRUE;
255;
'DD-MON-YYYY HH24:MI:SS.FF';
NULL;
NULL;
NULL;
NULL;

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

-- 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

-- ------------------------------------------------------------------------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;
-- -------------------------------------------------------------------------

-- ------------------------------------------------------------------------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

-- ------------------------------------------------------------------------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;

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

-- ------------------------------------------------------------------------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

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);

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;

PROCEDURE logs_off;
PROCEDURE set_date_format (p_date_format IN VARCHAR2 DEFAULT 'DD-MONYYYY HH24:MI:SS');
PROCEDURE line (p_prefix
p_data
p_error_level
p_error_user

IN
IN
IN
IN

VARCHAR2,
VARCHAR2,
NUMBER
DEFAULT 5,
VARCHAR2 DEFAULT USER);

PROCEDURE line (p_data


p_error_level
p_error_user

IN
IN
IN

VARCHAR2,
NUMBER
DEFAULT 5,
VARCHAR2 DEFAULT USER);

PROCEDURE display (p_error_level


p_error_user
p_from_date
p_to_date
END err;
/

IN
IN
IN
IN

NUMBER
VARCHAR2
DATE
DATE

DEFAULT
DEFAULT
DEFAULT
DEFAULT

NULL,
NULL,
NULL,
NUll);

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.oraclebase.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

-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 singlebyte 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 ORA29260 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)
-- -------------------------------------------------------------------------

g_reply
g_binary
g_debug
g_convert_crlf

t_string_table := t_string_table();
BOOLEAN := TRUE;
BOOLEAN := TRUE;
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);

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));

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
-- -------------------------------------------------------------------------

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);

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;
-- -------------------------------------------------------------------------

-- ------------------------------------------------------------------------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);

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.

-- 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;
-- -------------------------------------------------------------------------

-- ------------------------------------------------------------------------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,

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,

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;

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

-- ------------------------------------------------------------------------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));

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;

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;

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

-- ------------------------------------------------------------------------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


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

-- 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.oraclebase.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 (suggested
by 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
p_port
IN
p_user
IN
p_pass
IN
p_timeout IN
RETURN UTL_TCP.connection;

VARCHAR2,
VARCHAR2,
VARCHAR2,
VARCHAR2,
NUMBER := NULL)

FUNCTION get_passive (p_conn


RETURN UTL_TCP.connection;

IN OUT NOCOPY

PROCEDURE logout (p_conn


p_reply

IN OUT NOCOPY
IN

PROCEDURE send_command (p_conn


p_command
p_reply
PROCEDURE get_reply (p_conn

UTL_TCP.connection)

UTL_TCP.connection,
BOOLEAN := TRUE);

IN OUT NOCOPY
IN
IN

IN OUT NOCOPY

FUNCTION get_local_ascii_data (p_dir


p_file
RETURN CLOB;

IN
IN

UTL_TCP.connection,
VARCHAR2,
BOOLEAN := TRUE);

UTL_TCP.connection);
VARCHAR2,
VARCHAR2)

FUNCTION get_local_binary_data (p_dir


p_file
RETURN BLOB;

IN
IN

FUNCTION get_remote_ascii_data (p_conn


UTL_TCP.connection,
p_file
RETURN CLOB;

IN OUT NOCOPY
IN

VARCHAR2,
VARCHAR2)

VARCHAR2)

FUNCTION get_remote_binary_data (p_conn


UTL_TCP.connection,
p_file
RETURN BLOB;

IN OUT NOCOPY
IN

PROCEDURE put_local_ascii_data (p_data


p_dir
p_file

VARCHAR2)

IN
IN
IN

CLOB,
VARCHAR2,
VARCHAR2);

PROCEDURE put_local_binary_data (p_data


p_dir
p_file

IN
IN
IN

BLOB,
VARCHAR2,
VARCHAR2);

PROCEDURE put_remote_ascii_data (p_conn


UTL_TCP.connection,
p_file
p_data

IN OUT NOCOPY
IN
IN

PROCEDURE put_remote_binary_data (p_conn


UTL_TCP.connection,
p_file
p_data

VARCHAR2,
CLOB);

IN OUT NOCOPY
IN
IN

VARCHAR2,
BLOB);

PROCEDURE get (p_conn


p_from_file
p_to_dir
p_to_file

IN OUT NOCOPY
IN
IN
IN

UTL_TCP.connection,
VARCHAR2,
VARCHAR2,
VARCHAR2);

PROCEDURE put (p_conn


p_from_dir
p_from_file
p_to_file

IN OUT NOCOPY
IN
IN
IN

UTL_TCP.connection,
VARCHAR2,
VARCHAR2,
VARCHAR2);

PROCEDURE get_direct (p_conn


p_from_file
p_to_dir
p_to_file

IN OUT NOCOPY
IN
IN
IN

UTL_TCP.connection,
VARCHAR2,
VARCHAR2,
VARCHAR2);

PROCEDURE put_direct (p_conn


p_from_dir
p_from_file
p_to_file

IN OUT NOCOPY
IN
IN
IN

UTL_TCP.connection,
VARCHAR2,
VARCHAR2,
VARCHAR2);

PROCEDURE help (p_conn


PROCEDURE ascii (p_conn

IN OUT NOCOPY

PROCEDURE binary (p_conn

IN OUT NOCOPY

UTL_TCP.connection);

IN OUT NOCOPY

UTL_TCP.connection);
UTL_TCP.connection);

PROCEDURE list (p_conn


p_dir
p_list

IN OUT NOCOPY
IN
OUT

UTL_TCP.connection,
VARCHAR2,
t_string_table);

PROCEDURE nlst (p_conn


p_dir
p_list

IN OUT NOCOPY
IN
OUT

UTL_TCP.connection,
VARCHAR2,
t_string_table);

PROCEDURE rename (p_conn


p_from
p_to

IN OUT NOCOPY
IN
IN

UTL_TCP.connection,
VARCHAR2,
VARCHAR2);

PROCEDURE delete (p_conn


p_file

IN OUT NOCOPY
IN

UTL_TCP.connection,
VARCHAR2);

PROCEDURE mkdir (p_conn


p_dir

IN OUT NOCOPY
IN

UTL_TCP.connection,
VARCHAR2);

PROCEDURE rmdir (p_conn


p_dir

IN OUT NOCOPY
IN

UTL_TCP.connection,
VARCHAR2);

PROCEDURE convert_crlf (p_status

IN

BOOLEAN);

END ftp;
/
SHOW ERRORS

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 OFF
SET TERMOUT OFF
COLUMN X NEW_VALUE Y
SELECT 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 ON
SET FEEDBACK ON
SET LINESIZE 100

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.com/dba/miscellaneous/get_pivot.sql
-- Author
: DR Timothy S Hall

-- 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
p_step IN
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

NUMBER,
NUMBER DEFAULT 1)

SELECT column_value
FROM
TABLE(get_pivot(17,2));

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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;

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.oraclebase.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 A30
COLUMN ol FORMAT A2
COLUMN sq FORMAT 99
COLUMN "Argument Name" FORMAT A32
COLUMN "Type" FORMAT A15
COLUMN "Size" FORMAT A6
BREAK ON ol SKIP 2
SET PAGESIZE 0
SET LINESIZE 200
SET TRIMOUT ON
SET TRIMSPOOL ON
SET 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",

in_out AS "In/Out",
default_value
FROM
user_arguments
WHERE package_name = UPPER('&1')
AND
object_name = DECODE(UPPER('&2'), 'ALL', object_name,
UPPER('&2'))
ORDER BY object_name, overload, sequence;
SET PAGESIZE 14
SET LINESIZE 80

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'ALTER INDEX ' || a.index_name || ' REBUILD;'
FROM
all_indexes a
WHERE 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 run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET 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
-=========== ========
=================================================

-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
p_namespace
p_envelope_tag
RETURN t_request;

PROCEDURE add_parameter(p_request
p_name
p_type
p_value
FUNCTION invoke(p_request
p_url
p_action
RETURN t_response;

IN
IN
IN

VARCHAR2,
VARCHAR2,
VARCHAR2 DEFAULT 'SOAP-ENV')

IN OUT NOCOPY
IN
IN
IN

IN OUT NOCOPY
IN
IN

FUNCTION get_return_value(p_response
p_name
p_namespace
RETURN VARCHAR2;

t_request,
VARCHAR2,
VARCHAR2,
VARCHAR2);

t_request,
VARCHAR2,
VARCHAR2)

IN OUT NOCOPY
IN
IN

t_response,
VARCHAR2,
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.

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

-- -------------------------------------------------------------------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/env
elope/" ' ||
'xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">' ||
'<'||p_request.envelope_tag||':Body>' ||

'<'||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/e
nvelope/');
IF (l_fault_node IS NOT NULL) THEN
l_fault_code
:=
l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultcode/ch
ild::text()',
'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/e
nvelope/').getstringval();
l_fault_string :=
l_fault_node.extract('/'||p_response.envelope_tag||':Fault/faultstring/
child::text()',

'xmlns:'||p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/e
nvelope/').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_re
sponse.envelope_tag||':Body/child::node()',
'xmlns:'||l_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/e
nvelope/"');
-- 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,

p_namespace IN
VARCHAR2)
RETURN VARCHAR2 AS
-- -------------------------------------------------------------------BEGIN
RETURN
p_response.doc.extract('//'||p_name||'/child::text()',p_namespace).gets
tringval();
END;
-- -------------------------------------------------------------------END soap_api;
/
SHOW ERRORS

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 ('SCHEMANAME');
-- Last Modified: 02/06/2003
-- ---------------------------------------------------------------------------------CREATE OR REPLACE PACKAGE switch_schema AS
PROCEDURE reset_grants;
PROCEDURE reset_schema_synonyms (p_schema

IN

END;
/

VARCHAR2);

SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY switch_schema AS


PROCEDURE reset_grants IS
BEGIN

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;

CREATE OR REPLACE PACKAGE string_api AS


-- -------------------------------------------------------------------------- Name
: http://www.oraclebase.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 types
TYPE t_split_array IS TABLE OF VARCHAR2(32767);
FUNCTION split_text (p_text
p_delimeter
RETURN t_split_array;

IN
IN

CLOB,
VARCHAR2 DEFAULT ',')

END string_api;
/
SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY string_api AS


-- -------------------------------------------------------------------------- Name
: http://www.oraclebase.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

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.oraclebase.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:2296
14022562
-- 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),

STATIC FUNCTION ODCIAggregateInitialize(sctx


RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self
value
RETURN NUMBER,

IN OUT

IN OUT
IN

MEMBER FUNCTION ODCIAggregateTerminate(self


t_string_agg,
returnValue
flags
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self
ctx2
RETURN NUMBER

IN OUT
IN

t_string_agg)

t_string_agg,
VARCHAR2 )

IN
OUT
IN

VARCHAR2,
NUMBER)

t_string_agg,
t_string_agg)

);
/
SHOW ERRORS

CREATE OR REPLACE TYPE BODY t_string_agg IS


STATIC FUNCTION ODCIAggregateInitialize(sctx
RETURN NUMBER IS
BEGIN
sctx := t_string_agg(NULL);
RETURN ODCIConst.Success;
END;

IN OUT

MEMBER FUNCTION ODCIAggregateIterate(self


IN OUT
value IN
RETURN NUMBER IS
BEGIN
SELF.g_string := self.g_string || ',' || value;
RETURN ODCIConst.Success;
END;

t_string_agg)

t_string_agg,
VARCHAR2 )

MEMBER FUNCTION ODCIAggregateTerminate(self


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

VARCHAR2,
NUMBER)

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;
/

SHOW ERRORS

CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)


RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;
/
SHOW ERRORS

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 OFF
COLUMN table_name FORMAT A30
COLUMN comments
FORMAT A40
SELECT table_name,
comments
FROM
dba_tab_comments
WHERE owner = DECODE(UPPER('&1'), 'ALL', owner, UPPER('&1'))
AND
table_name LIKE UPPER('%&2%')
ORDER BY table_name;

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 99
COLUMN data_type FORMAT A10
COLUMN nullable FORMAT A8
COLUMN size FORMAT A6
BREAK ON table_name SKIP 2
SET PAGESIZE 0
SET LINESIZE 200
SET TRIMOUT ON
SET TRIMSPOOL ON

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') nullable
FROM
user_tab_columns
WHERE table_name = DECODE(UPPER('&1'), 'ALL', table_name, UPPER('&1'))
ORDER BY table_name, column_id;
SET PAGESIZE 14
SET LINESIZE 80

-- ----------------------------------------------------------------------------------- File Name


: http://www.oraclebase.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 ON
SET LINESIZE 500
SET VERIFY OFF
SET FEEDBACK OFF
PROMPT
SPOOL Tab_Diffs.txt
DECLARE
CURSOR c_tables IS

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
v_owner2
v_data
v_work

VARCHAR2(10) := 'DDDS2';
VARCHAR2(10) := 'PDDS';
c_table1%ROWTYPE;
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;

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

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
PROMPT
SET 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;

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


PROCEDURE line (p_prefix
p_data
p_trc_level
p_trc_user

IN
IN
IN
IN

PROCEDURE display (p_trc_level


p_trc_user
p_from_date
p_to_date
END trc;
/

VARCHAR2,
VARCHAR2,
NUMBER
DEFAULT 5,
VARCHAR2 DEFAULT USER);
IN
IN
IN
IN

NUMBER
VARCHAR2
DATE
DATE

DEFAULT
DEFAULT
DEFAULT
DEFAULT

NULL,
NULL,
NULL,
NUll);

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;
-- -------------------------------------------------------------------------

-- ------------------------------------------------------------------------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-MONYYYY 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,

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

You might also like