Have another procedure problem that I don't know how to debug. I comparred the procedure and package body of this DB with another DB of the same application only in a different country and when I found that the bodies were different I did change the bodies to be the same and thought that the error would go away but stayed and is the same;
the error:
Wed Aug 10 13:19:12 2005
Errors in file E:\ORADATA\admin\FAGW\bdum
p\fagwSNP3
.TRC:
ORA-12012: error on auto execute of job 1000
ORA-12008: error in snapshot refresh path
ORA-01004: default username feature not supported; logon denied
ORA-01988: remote os logon is not allowed
OSD-00000: Message 0 not found; product=RDBMS73; facility=SOSD
ORA-02063: preceding 3 lines from GBS
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 271
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 139
ORA-06512: at "REPSYS.STATICREPLICATION"
, line 60
ORA-06512: at "REPSYS.PRC$_STATICREPLICA
TION", line 6
ORA-06512: at line 1
the package body:
CREATE OR REPLACE PACKAGE REPSYS.StaticReplication
IS
FUNCTION generate_procedure_name( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2;
FUNCTION generate_snapshot_name( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2;
PROCEDURE replicate( owner IN VARCHAR2
, table_name IN VARCHAR2 );
PROCEDURE generate_master_script( owner IN VARCHAR2
, table_name IN VARCHAR2 );
PROCEDURE generate_snapshot_script( owner IN VARCHAR2
, table_name IN VARCHAR2 );
END;
/
CREATE OR REPLACE PACKAGE BODY REPSYS.StaticReplication
IS
/* naming conventions */
--------------------------
----------
----------
----------
-----
FUNCTION generate_procedure_name( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2
IS
BEGIN
RETURN owner || '.rsp$_' || table_name;
END;
--------------------------
----------
----------
----------
-----
FUNCTION generate_snapshot_name( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2
IS
BEGIN
RETURN owner || '.sn_' || table_name;
END; -- end generate_snapshot_name
--------------------------
----------
----------
----------
-----
FUNCTION generate_snapshot_table( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2
IS
BEGIN
RETURN owner || rpad( '.snap$_sn_' || table_name, 27) ; -- this length should stay 27!!!
END; -- end generate_snapshot_table
--------------------------
----------
----------
----------
-----
FUNCTION generate_snapshot_index( owner IN VARCHAR2
, table_name IN VARCHAR2 )
RETURN VARCHAR2
IS
BEGIN
RETURN owner || '.i_sn_' || table_name;
END; -- end generate_snapshot_index
--------------------------
----------
----------
----------
-----
/* all procedures */
PROCEDURE replicate( owner IN VARCHAR2
, table_name IN varchar2)
IS
cursor_handle NUMBER(38);
updated_rows NUMBER(38);
l_proc_name VARCHAR2(500);
CURSOR replication_status_cur ( proc_name varchar2 )
IS
SELECT execution_date
FROM replication_status
WHERE procedure_name = proc_name
FOR update ;
replication_status_rec replication_status_cur%ROW
TYPE;
BEGIN
l_proc_name := generate_procedure_name(ow
ner, table_name);
-- First refresh the snapshot
DBMS_OUTPUT.PUT_LINE('-- PDX start snapshot refresh ' ||to_char(sysdate,'HH24:MI
:SS') );
DBMS_SNAPSHOT.REFRESH(gene
rate_snaps
hot_name(o
wner, table_name),'?');
-- Then update the new master table
DBMS_OUTPUT.PUT_LINE('-- PDX start update table' ||to_char(sysdate,'HH24:MI
:SS') );
OPEN replication_status_cur (l_proc_name);
FETCH replication_status_cur INTO replication_status_rec;
IF replication_status_cur%FOU
ND
THEN
DBMS_OUTPUT.PUT_LINE('-- PDX exec date = ' ||
to_char(replication_status
_rec.execu
tion_date,
'DD-MON-YYYY HH24:MI:SS') );
cursor_handle := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_hand
le,
'BEGIN ' ||
l_proc_name || '( to_date( ''' ||
to_char(replication_status
_rec.execu
tion_date,
'DD-MON-YYYY HH24:MI:SS') ||
''', ''DD-MON-YYYY HH24:MI:SS'') ); ' ||
'END;',
DBMS_SQL.V7);
updated_rows := DBMS_SQL.EXECUTE(cursor_ha
ndle);
DBMS_SQL.CLOSE_CURSOR(curs
or_handle)
;
UPDATE replication_status
SET execution_date = sysdate
WHERE current of replication_status_cur ;
ELSE
DBMS_OUTPUT.PUT_LINE('-- PDX no exec date' );
cursor_handle := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_hand
le,
'BEGIN ' ||
l_proc_name || '(NULL); ' ||
'END;',
DBMS_SQL.V7);
updated_rows := DBMS_SQL.EXECUTE(cursor_ha
ndle);
DBMS_SQL.CLOSE_CURSOR(curs
or_handle)
;
INSERT INTO replication_status
( procedure_name
, execution_date
)
VALUES
( l_proc_name
, sysdate
) ;
END IF;
CLOSE replication_status_cur;
DBMS_OUTPUT.PUT_LINE('-- PDX end update table' ||to_char(sysdate,'HH24:MI
:SS') );
COMMIT;
end; -- end replicate
--
-- all the procedures to create the replication scripts
--
PROCEDURE generate_master_script( owner IN VARCHAR2
, table_name IN VARCHAR2 )
IS
file_handle UTL_FILE.file_type;
BEGIN
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('PROM
PT Creating Snapshot Logs for ' || owner || '.' || table_name );
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('REM '||TO_CHAR(sysdate,'DD/MM/
YYYY HH24:MI') );
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('set termout off');
DBMS_OUTPUT.PUT_LINE('DROP
SNAPSHOT LOG ON ' ||
owner || '.' || table_name );
DBMS_OUTPUT.PUT_LINE('/');
DBMS_OUTPUT.PUT_LINE('set termout on');
DBMS_OUTPUT.PUT_LINE('CREA
TE SNAPSHOT LOG ON ' ||
owner || '.' || table_name );
DBMS_OUTPUT.PUT_LINE('/');
END;
--declaration of a package internal procedure defined later
PROCEDURE generate_upd_ins( owner VARCHAR2
, table_name VARCHAR2
);
/* pdx */
PROCEDURE generate_snapshot_script( owner IN VARCHAR2
, table_name IN VARCHAR2 )
IS
BEGIN
-- first generate the snapshot
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('PROM
PT Creating Snapshot and Procedure for ' || owner || '.' || table_name );
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('REM '||TO_CHAR(sysdate,'DD/MM/
YYYY HH24:MI') );
DBMS_OUTPUT.PUT_LINE('REM'
);
DBMS_OUTPUT.PUT_LINE('-- The snapshot ');
DBMS_OUTPUT.PUT_LINE('set termout off');
DBMS_OUTPUT.PUT_LINE('DROP
SNAPSHOT ' ||
generate_snapshot_name(own
er, table_name) );
DBMS_OUTPUT.PUT_LINE('/');
DBMS_OUTPUT.PUT_LINE('set termout on');
DBMS_OUTPUT.PUT_LINE('CREA
TE SNAPSHOT ' ||
generate_snapshot_name(own
er, table_name));
DBMS_OUTPUT.PUT_LINE('REFR
ESH FAST');
DBMS_OUTPUT.PUT_LINE('AS')
;
DBMS_OUTPUT.PUT_LINE('SELE
CT TAB.*, sysdate modification_date');
DBMS_OUTPUT.PUT_LINE(' FROM ' || owner || '.' || table_name || '@&&db_link TAB' );
DBMS_OUTPUT.PUT_LINE('/');
DBMS_OUTPUT.PUT_LINE('-- The snapshot index ');
DBMS_OUTPUT.PUT_LINE('CREA
TE INDEX ' ||
generate_snapshot_index(ow
ner, table_name));
DBMS_OUTPUT.PUT_LINE(' ON '||
generate_snapshot_table(ow
ner, table_name));
DBMS_OUTPUT.PUT_LINE(' ( modification_date );' );
-- then generate the procedure
DBMS_OUTPUT.PUT_LINE('-- The procedure ');
DBMS_OUTPUT.PUT_LINE('CREA
TE OR REPLACE PROCEDURE ' ||
generate_procedure_name(ow
ner, table_name) ||
'(p_execution_date IN DATE)' );
DBMS_OUTPUT.PUT_LINE('IS')
;
-- extra cursor for update
DBMS_OUTPUT.PUT_LINE('--')
;
DBMS_OUTPUT.PUT_LINE('-- cursor for updates');
DBMS_OUTPUT.PUT_LINE(' cursor cur_update is');
DBMS_OUTPUT.PUT_LINE(' select t.* from ' ||
generate_snapshot_name(own
er, table_name) || ' t' );
DBMS_OUTPUT.PUT_LINE(' where t.modification_date > p_execution_date;');
DBMS_OUTPUT.PUT_LINE('--')
;
DBMS_OUTPUT.PUT_LINE('BEGI
N');
generate_upd_ins(owner, table_name );
DBMS_OUTPUT.PUT_LINE('END;
');
DBMS_OUTPUT.PUT_LINE('/');
END;
/* pdx */
PROCEDURE generate_upd_ins( owner VARCHAR2
, table_name VARCHAR2
)
IS
CURSOR non_primary_key_fields( p_owner VARCHAR2
, p_table_name VARCHAR2 )
IS
SELECT column_name
FROM all_tab_columns COLS
WHERE COLS.owner = p_owner
AND COLS.table_name = p_table_name
MINUS
SELECT column_name
FROM all_constraints CONS
, all_cons_columns CONSCOL
WHERE CONS.owner = p_owner
AND CONS.table_name = p_table_name
AND CONSCOL.owner = CONS.owner
AND CONSCOL.table_name = CONS.table_name
AND CONSCOL.constraint_name = CONS.constraint_name
AND CONS.constraint_type = 'P' ;
CURSOR primary_key_fields( p_owner VARCHAR2
, p_table_name VARCHAR2 )
IS
SELECT column_name
FROM all_constraints CONS
, all_cons_columns CONSCOL
WHERE CONS.owner = p_owner
AND CONS.table_name = p_table_name
AND CONSCOL.owner = CONS.owner
AND CONSCOL.table_name = CONS.table_name
AND CONSCOL.constraint_name = CONS.constraint_name
AND CONS.constraint_type = 'P'
ORDER BY column_name;
CURSOR all_fields( p_owner VARCHAR2
, p_table_name VARCHAR2 )
IS
SELECT column_name
FROM all_tab_columns COLS
WHERE COLS.owner = p_owner
AND COLS.table_name = p_table_name
ORDER BY column_name;
column_counter NUMBER;
BEGIN
-- fast refresh? ...
DBMS_OUTPUT.PUT_LINE(' IF p_execution_date IS NOT NULL');
DBMS_OUTPUT.PUT_LINE(' THEN ');
DBMS_OUTPUT.PUT_LINE(' -- ');
DBMS_OUTPUT.PUT_LINE(' DBMS_OUTPUT.PUT_LINE('' -- pdx delete '');' );
DBMS_OUTPUT.PUT_LINE(' -- delete the rows in the child table that do not exist');
DBMS_OUTPUT.PUT_LINE('DELE
TE FROM '|| owner || '.' || table_name || ' TARGET');
DBMS_OUTPUT.PUT_LINE(' WHERE NOT EXISTS ( SELECT ''dummy'' ');
DBMS_OUTPUT.PUT_LINE(' FROM '|| generate_snapshot_name(own
er, table_name)||' SOURCE');
column_counter := 1;
FOR column in primary_key_fields(UPPER(o
wner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' WHERE SOURCE.' || column.column_name || ' = TARGET.' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' AND SOURCE.' || column.column_name || ' = TARGET.' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ); ');
-- the update should come before the insert !!!
DBMS_OUTPUT.PUT_LINE(' -- ');
DBMS_OUTPUT.PUT_LINE(' DBMS_OUTPUT.PUT_LINE('' -- pdx update '');' );
DBMS_OUTPUT.PUT_LINE(' -- then update the existing rows');
DBMS_OUTPUT.PUT_LINE(' FOR R IN CUR_UPDATE LOOP');
DBMS_OUTPUT.PUT_LINE(' UPDATE ' || owner || '.' || table_name || ' TARGET SET');
column_counter := 1;
FOR column in non_primary_key_fields(UPP
ER(owner),
UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE( ' ' || column.column_name ||' = R.'|| column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name ||' = R.'|| column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
column_counter := 1;
FOR column in primary_key_fields(UPPER(o
wner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' WHERE TARGET.' || column.column_name || ' = R.' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' AND TARGET.' || column.column_name || ' = R.' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ;');
DBMS_OUTPUT.PUT_LINE(' end loop;');
-- the insert should come after the update !!
DBMS_OUTPUT.PUT_LINE(' -- ');
DBMS_OUTPUT.PUT_LINE(' DBMS_OUTPUT.PUT_LINE('' -- pdx insert '');' );
DBMS_OUTPUT.PUT_LINE(' -- insert the new rows ');
DBMS_OUTPUT.PUT_LINE(' insert into ' || owner || '.' || table_name);
column_counter := 1;
FOR column in all_fields(UPPER(owner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' ( ' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' )');
column_counter := 1;
FOR column in all_fields(UPPER(owner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' SELECT ' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' FROM ' || generate_snapshot_name(own
er, table_name) );
DBMS_OUTPUT.PUT_LINE(' MINUS ');
column_counter := 1;
FOR column in all_fields(UPPER(owner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' SELECT ' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' FROM ' || owner || '.' || table_name || ';' );
-- DBMS_OUTPUT.PUT_LINE(' end loop;');
DBMS_OUTPUT.PUT_LINE(' -- ');
-- p_execution_date is NULL !! ==> full replace of the table
DBMS_OUTPUT.PUT_LINE('ELSE
');
DBMS_OUTPUT.PUT_LINE(' -- ');
DBMS_OUTPUT.PUT_LINE(' DBMS_OUTPUT.PUT_LINE('' -- pdx delete full '');' );
DBMS_OUTPUT.PUT_LINE(' -- delete the rows in the child table');
DBMS_OUTPUT.PUT_LINE('DELE
TE FROM '|| owner || '.' || table_name || ';');
DBMS_OUTPUT.PUT_LINE(' -- ');
DBMS_OUTPUT.PUT_LINE(' DBMS_OUTPUT.PUT_LINE('' -- pdx insert full '');' );
DBMS_OUTPUT.PUT_LINE(' -- insert the new rows ');
DBMS_OUTPUT.PUT_LINE(' insert into ' || owner || '.' || table_name);
column_counter := 1;
FOR column in all_fields(UPPER(owner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' ( ' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' )');
column_counter := 1;
FOR column in all_fields(UPPER(owner), UPPER(table_name))
LOOP
IF column_counter = 1
THEN
DBMS_OUTPUT.PUT_LINE(' SELECT ' || column.column_name );
ELSE
DBMS_OUTPUT.PUT_LINE(' , ' || column.column_name );
END IF;
column_counter := column_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' FROM ' || generate_snapshot_name(own
er, table_name) );
DBMS_OUTPUT.PUT_LINE(';');
DBMS_OUTPUT.PUT_LINE('END IF;');
END;
END; --end of the package body
/
Start Free Trial