Monday, July 25, 2016

Find out the difference between the latest value and second latest value.


SELECT EVENT_TYPE, VALUE - LATEST_VALUE "Value"
  FROM (SELECT ROWNUMBER,
               EVENT_TYPE,
               VALUE,
               NVL (
                  LAG (VALUE, 1)
                     OVER (PARTITION BY EVENT_TYPE ORDER BY EVENT_TYPE, TIME),
                  0)
                  AS LATEST_VALUE,
               TIME
          FROM (  SELECT ROW_NUMBER ()
                         OVER (PARTITION BY EVENT_TYPE
                               ORDER BY EVENT_TYPE, TIME DESC)
                            AS ROWNUMBER,
                         EVENT_TYPE,
                         VALUE,
                         TIME
                    FROM EVENTS
                ORDER BY EVENT_TYPE, TIME DESC)
         WHERE ROWNUMBER < 3)
 WHERE LATEST_VALUE > 0;

Data Preparation 

CREATE TABLE EVENTS
(
  EVENT_TYPE  INTEGER                           NOT NULL,
  VALUE       INTEGER                           NOT NULL,
  TIME        TIMESTAMP(6)                      NOT NULL
);

SET DEFINE OFF;
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (2, 5, TO_TIMESTAMP('7/25/2016 4:27:27.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (2, 13, TO_TIMESTAMP('7/25/2016 4:28:44.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (2, 34, TO_TIMESTAMP('7/25/2016 4:28:50.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (4, 42, TO_TIMESTAMP('7/25/2016 4:27:44.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (5, 4, TO_TIMESTAMP('7/25/2016 4:31:56.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (5, 12, TO_TIMESTAMP('7/25/2016 4:31:53.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (5, 34, TO_TIMESTAMP('7/25/2016 4:31:50.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (5, 12, TO_TIMESTAMP('7/25/2016 4:27:50.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
INSERT INTO EVENTS
   (EVENT_TYPE, VALUE, TIME)
 VALUES
   (7, 13, TO_TIMESTAMP('7/25/2016 4:27:56.000000 PM','fmMMfm/fmDDfm/YYYY fmHH12fm:MI:SS.FF AM'));
COMMIT;

Thursday, June 9, 2016

How to Swap All Table & Index of Tablespace into different Tablespace

1. Find out distinct schema name of Tablespace using the following Query.

SELECT DISTINCT OWNER
  FROM ALL_TABLES
 WHERE TABLESPACE_NAME = 'TBS_01';

2. Now Create the following Procedure. [ if your table size is big you can add the parallel and nologging clause (||'  PARALLEL 8 NOLOGGING' ).

CREATE OR REPLACE PROCEDURE SP_TABLE_MOVE (
   P_USER_NAME            IN VARCHAR2,
   P_CURRENT_TABLESPACE   IN VARCHAR2,
   P_NEW_TABLESPACE       IN VARCHAR2)
IS
   V_ALTER_SCRIPTS_TABLE   VARCHAR2 (3000);
   V_INDEX_NAME            VARCHAR2 (100);
   V_IDX_SCRIPTS           VARCHAR2 (3000);
BEGIN
   FOR IDX_TABLE
      IN (SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
            FROM ALL_TABLES
           WHERE     OWNER = P_USER_NAME
                 AND TABLESPACE_NAME = P_CURRENT_TABLESPACE
                 AND TABLE_NAME = P_TABLE_NAME)
   LOOP
      V_ALTER_SCRIPTS_TABLE :=
            'ALTER TABLE '
         || IDX_TABLE.OWNER
         || '.'
         || IDX_TABLE.TABLE_NAME
         || ' MOVE TABLESPACE '
         || P_NEW_TABLESPACE;

      BEGIN
         EXECUTE IMMEDIATE V_ALTER_SCRIPTS_TABLE;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.PUT_LINE (
                  'EXCEPTION IN MOVING TABLESPACE'
               || IDX_TABLE.TABLE_NAME
               || ' : '
               || SQLERRM);
      END;

      BEGIN
         FOR IDX_INDEX
            IN (SELECT OWNER, INDEX_NAME, TABLESPACE_NAME
                  FROM ALL_INDEXES
                 WHERE     OWNER = P_USER_NAME
                       AND TABLE_NAME = IDX_TABLE.TABLE_NAME)
         LOOP
            V_IDX_SCRIPTS :=
                  'ALTER INDEX '
               || IDX_INDEX.OWNER
               || '.'
               || IDX_INDEX.INDEX_NAME
               || ' REBUILD TABLESPACE '
               || P_NEW_TABLESPACE;

            BEGIN
               EXECUTE IMMEDIATE V_IDX_SCRIPTS;
            EXCEPTION
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.PUT_LINE (
                        'EXCEPTION IN REBUILD INDEX'
                     || IDX_INDEX.INDEX_NAME
                     || ' : '
                     || SQLERRM);
            END;
         END LOOP;
      END;
   END LOOP;
END;
/

3. Now execute the procedure to move table into different Tablespace.

EXEC SP_TABLE_MOVE('CBSUSR', 'TBS_01','TBS_02');

Sample Log:

SQL> conn /as sysdba
Connected.
SQL> CREATE OR REPLACE PROCEDURE SP_TABLE_MOVE (
   P_USER_NAME            IN VARCHAR2,
  2    3     P_CURRENT_TABLESPACE   IN VARCHAR2,
  4     P_NEW_TABLESPACE       IN VARCHAR2,
  5     P_TABLE_NAME           IN VARCHAR2)
  6  IS
  7     V_ALTER_SCRIPTS_TABLE   VARCHAR2 (3000);
  8     V_INDEX_NAME            VARCHAR2 (100);
  9     V_IDX_SCRIPTS           VARCHAR2 (3000);
 10  BEGIN
 11     FOR IDX_TABLE
 12        IN (SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
 13              FROM ALL_TABLES
 14             WHERE     OWNER = P_USER_NAME
 15                   AND TABLESPACE_NAME = P_CURRENT_TABLESPACE
 16                   AND TABLE_NAME = P_TABLE_NAME)
 17     LOOP
 18        V_ALTER_SCRIPTS_TABLE :=
 19              'ALTER TABLE '
 20           || IDX_TABLE.OWNER
         || '.'
 21   22           || IDX_TABLE.TABLE_NAME
         || ' MOVE TABLESPACE '
 23   24           || P_NEW_TABLESPACE;
 25
 26        BEGIN
 27           EXECUTE IMMEDIATE V_ALTER_SCRIPTS_TABLE;
 28        EXCEPTION
 29           WHEN OTHERS
 30           THEN
 31              DBMS_OUTPUT.PUT_LINE (
 32                    'EXCEPTION IN MOVING TABLESPACE'
 33                 || IDX_TABLE.TABLE_NAME
 34                 || ' : '
 35                 || SQLERRM);
 36        END;
 37
 38        BEGIN
 39           FOR IDX_INDEX
 40              IN (SELECT OWNER, INDEX_NAME, TABLESPACE_NAME
 41                    FROM ALL_INDEXES
 42                   WHERE     OWNER = P_USER_NAME
 43                         AND TABLE_NAME = IDX_TABLE.TABLE_NAME)
 44           LOOP
 45              V_IDX_SCRIPTS :=
 46                    'ALTER INDEX '
 47                 || IDX_INDEX.OWNER
 48                 || '.'
 49                 || IDX_INDEX.INDEX_NAME
 50                 || ' REBUILD TABLESPACE '
 51                 || P_NEW_TABLESPACE;
 52
 53              BEGIN
 54                 EXECUTE IMMEDIATE V_IDX_SCRIPTS;
 55              EXCEPTION
 56                 WHEN OTHERS
 57                 THEN
 58                    DBMS_OUTPUT.PUT_LINE (
 59                          'EXCEPTION IN REBUILD INDEX'
 60                       || IDX_INDEX.INDEX_NAME
 61                       || ' : '
 62                       || SQLERRM);
 63              END;
 64           END LOOP;
 65        END;
 66     END LOOP;
 67  END;
 68  /

Procedure created.

SQL>
SQL> SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
  FROM ALL_TABLES
 WHERE OWNER = 'CBSUSR' AND TABLE_NAME = 'ACCOUNTS'  2    3  ;

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
CBSUSR                   ACCOUNTS                      TBS_01
SQL> EXEC SP_TABLE_MOVE('CBSUSR', 'TBS_01','TBS_02');

PL/SQL procedure successfully completed.

SQL> SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
  FROM ALL_TABLES
 WHERE OWNER = 'CBSUSR' AND TABLE_NAME = 'ACCOUNTS'  2    3  ;

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
CBSUSR                  ACCOUNTS                          TBS_02

SQL>

Saturday, May 21, 2016

How to Restore spfile from RMAN Backup and Create pfile.

C:\Windows\system32>RMAN TARGET /

Recovery Manager: Release 11.2.0.1.0 - Production on Wed May 18 23:13:55 2016

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> STARTUP FORCE NOMOUNT

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file 'D:\APP\RAJIB.PRADHAN\PRODUCT\11.2.0\DBHOME_1\DATABASE\INITASMDB.ORA'

starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started

Total System Global Area     158662656 bytes

Fixed Size                     2173840 bytes
Variable Size                 92275824 bytes
Database Buffers              58720256 bytes
Redo Buffers                   5492736 bytes

RMAN> restore spfile from 'D:\app\rman_backup\spfile_ASMDB_16_20160519.bak';

Starting restore at 18-MAY-16
using channel ORA_DISK_1

channel ORA_DISK_1: restoring spfile from AUTOBACKUP D:\app\rman_backup\spfile_ASMDB_16_20160519.bak
channel ORA_DISK_1: SPFILE restore from AUTOBACKUP complete
Finished restore at 18-MAY-16

RMAN> exit


Recovery Manager complete.

C:\Windows\system32>sqlplus "/as sysdba"

SQL*Plus: Release 11.2.0.1.0 Production on Wed May 18 23:20:51 2016

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create pfile='D:\APP\RAJIB.PRADHAN\PRODUCT\11.2.0\DBHOME_1\DATABASE\INITASMDB.ORA' from spfile;

File created.

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options