
1) After displaying a list of tables that are in the Recycle Bin, the script will ask for a table to be flashbacked.
2) If a table with that name already exists, a message is displayed stating that the base number will be added to the name.
3) A report is then displayed showing indexes and triggers that will also be reestablished.
4) The report labeled 4 shows the items recreated.
5) Lets you know what else might have to be done.
Click here for a downloadable attachment.
Define OnOff = Off
rem +--------------------------------------------------------------------------+
rem | Script ID: FlashTbl.sql
rem |
rem | Purpose: This performs a flashback of tables, indexes and triggers.
rem | If the table already exists, it will be renamed with the
rem | base_object number.
rem |
rem | Developer: Lynn Tobias
rem | Script Date: August 08, 2008
rem |
rem | Input File(s): none
rem |
rem | Table(s) Used: Dual, User_Recyclebin
rem |
rem | Called by: n/a
rem | Calls: FlashObj.Sql (created in this script)
rem |
rem | Variables: OnOff - Used to debug
rem | Dropped_Table - Name of table to flashback
rem | Ctr - if table found in user_table then '1'
rem | Renamed_Phrase - the Renamed_Phrase phrase of flashback
rem | if a table already exists
rem | New_Name - the name of the table with the base number
rem | if Ctr=1 otherwise,original name
rem | Output: n/a
rem |
rem | Revisions: Dvl Date Ver Comment/Change
rem | --- -------- --- -----------------------------------------+
rem |
rem +--------------------------------------------------------------------------+
--Clear Screen
--+- 1 -------------------------------------------------------------------------
--| Show the dropped tables available for selection
--+-----------------------------------------------------------------------------
Set Heading On Newpage 2 Linesize 200 Pagesize 60 Term On
Define xSubHead = ' DROPPED TABLES IN USER_RECYCLEBIN'
Ttitle -
Left 'User: ' _user col 68 'F L A S H B A C K' col 120 'Date: ' _DATE skip 1 -
Left 'Script: ' FlashTbl.Sql col 55 xSubHead col 120 'Page: ' sql.pno skip 2
Column Object_Name Heading Object|Name Format A15
Column Original_Name Heading Original|Name Format A30
Column Operation Heading Oper-|ation Format A5
Column Type Heading Type Format A7
Column Ts_Name Heading T(bl)|S(pc)|Name Format A5
Column Createtime Heading Create|Time Format A10
Column Droptime Heading Drop|Time Format A10
Column Dropscn Heading Drop|Scn Format 9,999,999
Column Partition_Name Heading Part-|ition|Name Format A5
Column Can_Undrop Heading Can|Undrop Format A6
Column Can_Purge Heading Can|Purge Format A5
Column Related Heading Related Format 99,999
Column Base_Object Heading Base|Object Format 99,999
Column Purge_Object Heading Purge|Object Format 99,999
Column Space Heading Space|(Blocks) Format 999
Select Object_Name, Original_Name, Operation, Type, Ts_Name,
Createtime, Droptime, Dropscn, Partition_Name, Can_Undrop,
Can_Purge, Related, Base_Object, Purge_Object, Space
From User_Recyclebin
Where Type = 'TABLE'
Order By Original_Name;
Ttitle Off
--+- 2 -------------------------------------------------------------------------
--| Ask for a table to flashback
--+-----------------------------------------------------------------------------
Accept Dropped_Table Prompt 'Name of table to flashback: '
--+- 3 -------------------------------------------------------------------------
--| If that tablename already exists, CTR is set to '1'. Post a message.
--+-----------------------------------------------------------------------------
Set Heading Off NewPage 1
Column Ctr New_Value Ctr NoPrint
Select Case When Count(*) = 1
Then 'Note: A table with that name exists. This will be renamed with base#.'
Else ' '
End ,
--------------------------------------------------------------------------
Count(*) As Ctr
--------------------------------------------------------------------------
From User_Tables
Where Table_Name = Upper('&Dropped_Table')
/
Prompt
--+- 4 ------------------------------------------------------------------------
--| Pull everything that needs to be fixed (table, indexes, triggers).
--| Also, determine the new name if a liked-name table already exists.
--+-----------------------------------------------------------------------------
Create Global Temporary Table GT_Flash
On Commit Preserve Rows
As
--------------------------------------------------
Select urb.*,
---------------------------------------------
Case When &Ctr = 1
Then Substr(
Original_Name||'_'||Base_Object
,1,30
)
Else Original_Name
End
As
New_Name
From User_Recyclebin urb
Where Base_Object =
--+- 4.1 ------------------------------------------------
--| Get the latest base# where it's the table requested
--| This is necessary as there may be more than one table
--| with the name selected.
--+------------------------------------------------------
(
Select Max(Base_Object)
From User_Recyclebin
Where Original_Name = Upper('&Dropped_Table')
);
--+- 5 -------------------------------------------------------------------------
--| If Ctr = 1, build the 'rename' portion of the flashback statement.
--+-----------------------------------------------------------------------------
Set Term &OnOff
Column Renamed_Phrase New_Value Renamed_Phrase
Select Case When &Ctr = 1
Then 'Rename To '||New_Name
Else ' '
End
As
Renamed_Phrase
From GT_Flash
Where Original_Name = Upper('&Dropped_Table');
Set Term On
--+- 6 ------------------------------------------------------------------------
--| Display the other objects (Triggers, Indexes)
--+-----------------------------------------------------------------------------
Set Newpage 2
Ttitle On
Define xSubHead = 'ITEMS THAT WILL BE REESTABLISHED AFTER FLASHBACK'
Set Heading On
Select *
From GT_Flash
Where Original_Name != Upper('&Dropped_Table') -- everything but the table
;
--+- 7 -------------------------------------------------------------------------
--| Build the statements to rebuild indexes and triggers. Get the Base_Object
--| since there can be more than one with that name. (Base_Object (and RELATED)
--| will match across tables, indexes and triggers.)
--|
--| Examples:
--| ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;
--| ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
--+-----------------------------------------------------------------------------
Spool FlashObj.Sql
Ttitle Off
Set Heading &OnOff Feedback &OnOff Verify &OnOff Term &OnOff
Select 'Alter ' || Type || ' "' || Object_Name || '" Rename To ' ||New_Name ||' ;'
From GT_Flash
Where Original_Name != Upper('&Dropped_Table') -- everything but the table
;
Spool Off
--+- 8 -------------------------------------------------------------------------
--| Flashback the table
--+-----------------------------------------------------------------------------
Flashback Table &Dropped_Table To Before Drop &Renamed_Phrase
/
--+- 9 -------------------------------------------------------------------------
--| Bring back indexes and triggers
--+-----------------------------------------------------------------------------
@FlashObj
--+- 9 -------------------------------------------------------------------------
--| Show them anything in User_Objects that is also in our global table
--+-----------------------------------------------------------------------------
Set Term On Heading On
Ttitle On
Column Object_Name Format A30
Define xSubHead = 'ITEM(S) RECOVERED AND NOW FOUND IN USER_OBJECTS';
Select Object_Name, Object_Type, Created, Status
From User_Objects
Where Object_Name In
--+- 9.1 --------------------------------------------------
--| Find out if there is an active table with that name
--+--------------------------------------------------------
(
Select New_Name
From GT_Flash
)
;
--+- 10 ------------------------------------------------------------------------
--| Now bring the bad news...
--+-----------------------------------------------------------------------------
Prompt
Prompt Follow-up:
Prompt =========
Prompt Views and procedures defined on the table are not recompiled and remain in the invalid state. -
These old names must be retrieved manually and applied.
Prompt
Prompt Dropped bitmap indexes are not placed in the recycle bin. Constraint names are also not retrievable.
Prompt
--+- 10 ------------------------------------------------------------------------
--| Clean up
--+-----------------------------------------------------------------------------
Truncate Table GT_Flash;
Drop Table GT_Flash;
Undefine Dropped_Table Ctr Renamed_Phrase New_Name
Ttitle Off
I know the dbms_random to generate random number but I have one requirement to create 4 digit random number without using dbms_random package. Is it possible to generate using without dbms_random package? if possible please share me the sample code .
ReplyDeleteNiranjan, I apologize, I'm just seeing your question about a random number generator. Do you still need this function? Lynn
Delete