samedi 1 janvier 2022

Miscellanous : SQL and More



1] Unix

1.1 Mailx send CC

I had a very hard time sending CC copies with Unix mailx.
I needed to change Oracle login account for around 600 users ; hence, I wrote a KSH script that took care of anything ( application that are impacted by this change and needs to modify a Users table / target username already created for another application, and so on … ). Once done, users were notified with ‘mailx’ as follow.


$ cat ${warn_i2u_gen} | mailx -s "${msg_tit}" "${usr_mail}"


The file contains explanation , new user / password , and is sent to enduser and application managers.


$ cat chng_i2u_<example>.txt
Bonjour,


1.2 KSH Generate a random password

This simple function returns a random character string ; the only argument is the string length


# func, arg = # car
function gen_psw_rand {
#set -A CHARS a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 \; \: \. \~ \! \@ \# \$ \% \^ \& \* - + = \?
set -A CHARS a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9
typeset CNUM="${#CHARS[*]}"
typeset MAXLEN=$1
    RANDSTR="" ; POSCNT=0
        while (( POSCNT < MAXLEN )) ; do
                RANDSTR="${RANDSTR}${CHARS[${RANDOM}%${CNUM}]}"
        (( POSCNT += 1 ))
        done
print ${RANDSTR}
}


Call


if [[ ${ENV} = 'PRO' ]] ; then
        PSW=$( gen_psw_rand 5 )
else
        PSW=${USc}
fi


New version : the first password character is Alpha Not Numeric for Oracle convenience


# func, arg = # car
# first password character is Alpha Not Numeric for Oracle convenience
function gen_psw_rand {
#set -A CHARS a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 \; \: \. \~ \! \@ \# \$ \% \^
\& \* - + = \?
set -A CHARS a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9
set -A CHAR1 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
typeset CNUM="${#CHARS[*]}" ; typeset CNU1="${#CHAR1[*]}"
typeset MAXLEN=$1
    RANDSTR="${RANDSTR}${CHAR1[${RANDOM}%${CNU1}]}" ; POSCNT=1
        while (( POSCNT < MAXLEN )) ; do
                RANDSTR="${RANDSTR}${CHARS[${RANDOM}%${CNUM}]}"
        (( POSCNT += 1 ))
        done
print ${RANDSTR}
}


1.3 The right options to mount NFS on Netapp for Oracle


filer4-1:/vol/vol_oracle_utils_conf_41/qt_oracle_utils_conf_41 on /PATH type nfs (rw,bg,hard,rsize=32768,wsize=32768,nfsvers=3,nointr,timeo=600,proto=tcp,addr=192.168.11.223)


1.4 Dump File error

DUMP FILE SIZE IS LIMITED TO 5242880 BYTES

SQL> sho parameter dump

NAME                                 TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
max_dump_file_size                   string      10240

SQL> -- 256 M = 262144 KB -> 524288 1/2 KB blocks

SQL> alter system set max_dump_file_size = 524288 ;
System altered.



2] Oracle Directories

2.1 How I test if a Directory is valid

When facing a ORA-29280: invalid directory path error


SQL> create or replace directory APP_DIR as '/work/hdmdev/oratmp' ;
Directory created.

SQL> grant read, write on directory APP_DIR to APP ;
Grant succeeded.

SQL> conn hdm/hdm
Connected.

declare
VI_Hdl_Fic  UTL_FILE.File_Type;
begin
VI_Hdl_Fic := UTL_FILE.FOpen('APP_DIR','test.txt','W',2048);
end;
/

PL/SQL procedure successfully completed.

/work/hdmdev/oratmp > ls -l test.txt
-rw-r--r--    1 oracle   devun           0 Sep  8 11:53 test.txt


2.2 How to check Permissions on Directories

select directory_name , grantee , privilege from dba_tab_privs a , all_directories b where table_name = directory_name order by 1,2


3A] SQL

3A.1 Working with Dates

3A.1.1 Count Business Days excluding weekends and holidays

May 2012 : Holidays = 01 08 17 18 28 -> 18 business days

$ cat /tmp/count_business_days.sql

select count(*)*24 "business_days" from (
select rownum rnum from all_objects where rownum <= to_date('&1') - to_date('&2')+1
)
where to_char( to_date('&2')+rnum-1, 'DY' ) not in ( 'SAT' , 'SUN' )
and trunc(to_date('&2')+rnum-1) not in ('01/05/2012','08/05/2012','17/05/2012','18/05/2012','28/05/2012')
/

$ sqlplus scott/tiger @/tmp/count_business_days.sql 31/05/2012 01/05/2012
old   2: select rownum rnum from all_objects where rownum <= to_date('&1') - to_date('&2')+1
new   2: select rownum rnum from all_objects where rownum <= to_date('31/05/2012') - to_date('01/05/2012')+1
old   4: where to_char( to_date('&2')+rnum-1, 'DY' ) not in ( 'SAT' , 'SUN' )
new   4: where to_char( to_date('01/05/2012')+rnum-1, 'DY' ) not in ( 'SAT' , 'SUN' )
old   5: and trunc(to_date('&2')+rnum-1) not in ('01/05/2012','08/05/2012','17/05/2012','18/05/2012','28/05/2012')
new   5: and trunc(to_date('01/05/2012')+rnum-1) not in ('01/05/2012','08/05/2012','17/05/2012','18/05/2012','28/05/2012')
business_days
--------------
            18

Note :

-- add one day
select DATFIN_AFF , to_char((trunc(DATFIN_AFF)+1),
'YYYY-MM-DD')||'T'||to_char(IUS_DATFIN_AFF,'HH24:MI:SS') from t1

3A.1.2 Compare dates to Hour only

Extract the Hour from the date to get the nightly runs only : between 7PM to 7AM :

select username , login_date , module , service_name , machine , osuser from (
select username , login_date , module , service_name , machine , osuser ,
ROW_NUMBER() OVER(PARTITION BY username , module , service_name , machine , osuser order by login_date desc  ) rn
from app.users_mon where module != 'sqlplus@srv-13 (TNS V1-V3)' and service_name = 'SYS$USERS' and username != 'SYSTEM'
-- night batch period 19H - 07H
and extract(hour from cast(to_char(login_date, 'DD-MON-YYYY HH24:MI:SS') as timestamp)) not between '07' and '19'
) where rn=1
order by login_date desc

3A.2 Regular Expressions

  • Get Oracle Version Major Number

select substr(REGEXP_REPLACE(banner, '([a-zA-Z ])', ''),1,2) from v$version where banner like '%Database%' ;

select first 4 digits starting with "20" ( year )

select regexp_replace('ex-app 2008 ra=ac 2045 ans', '[^2]*20([[:digit:]]{2}).*$', '20\1') from dual;
ð  2008

  • Extract the string between 2 « : » with the regular Expression

create table t ( a varchar2(32) )

select a from t
 -- abc:la chaine:

select REGEXP_REPLACE(a, '(\:[a-zA-Z ]\:)', '\1') from t

select REGEXP_SUBSTR(a, '\:.*\:') from t

 -- select REGEXP_SUBSTR(a, '\:.*\:', 1, 1, 'i', 1) from t

select replace(REGEXP_SUBSTR(a, '\:.*\:'),':','') from t
 -- la chaine

  • Count the number of occurrence of a Character in a Column

create table T_AUC ( A varchar2(32) ) ;
insert into T_AUC values ('AAABBCCDDEEAAFFAAGG') ;
commit ;

 -- 11G
select A , REGEXP_COUNT( A, 'A' ) as pattern_count from T_AUC

 -- 10G
select A , NVL( LENGTH( REGEXP_REPLACE( A, '[^A]', NULL ) ), 0 ) as pattern_count from T_AUC ;

drop table T_AUC ;

  • Find rows with '%SnnEnn%' n: 0 to 9

create table auc ( a varchar2(16));
insert into auc values ('ES43E45TK') ;
insert into auc values ('AUREL') ;
commit ;

SELECT * FROM AUC WHERE REGEXP_LIKE(a, '*S[0-9][0-9]E[0-9][0-9]*');

3A.3 Minus removes duplicate rows

drop table t1 ;
drop table t2 ;
create table t1 ( a int ) ;
alter table t1 add ( b varchar2(10) not null ) ;
create table t2 ( a int , b varchar2(10) ) ;
insert into t1 values ('10','dix');
insert into t1 values ('20','vingt');
insert into t1 values ('30','trente' );
insert into t2 values ('10','dix2');
insert into t2 values ('20','vingt2');
insert into t1 values ('10','dix');
commit ;
Commit complete.

SQL> select * from t1 ;
         A B
---------- ----------
        10 dix
        20 vingt
        30 trente
        10 dix

SQL> select * from t2 ;
         A B
---------- ----------
        10 dix2
        20 vingt2

SQL> create table t1b as select * from t1 where A='20' ;
Table created.

SQL> select * from t1b ;
         A B
---------- ----------
        20 vingt

create table t1c as select * from t1 minus select * from t1b ;
Table created.

SQL> select * from t1c ;

         A B
---------- ----------
        10 dix
        30 trente


3A.4 Merge gives ORA-30926, then seek for Duplicate rows

Original Merge


MERGE INTO "<SCHEMA>".AM_EMPLOYEE USING <SCHEMA>.V_<SCHEMA>_TABLE_A ON ( "<SCHEMA>".AM_EMPLOYEE.LOGIN = to_char(<SCHEMA>.V_<SCHEMA>_TABLE_A.COL_01) )
WHEN MATCHED THEN
UPDATE SET
  "<SCHEMA>".AM_EMPLOYEE.E_NOM_INSTRUCTEUR = <SCHEMA>.V_<SCHEMA>_TABLE_A.VAA_NOM_PRE_ACTEUR,
  "<SCHEMA>".AM_EMPLOYEE.E_SECTEUR_INSTRUCTEUR = <SCHEMA>.V_<SCHEMA>_TABLE_A.VAA_LOC_LIB,
  "<SCHEMA>".AM_EMPLOYEE.E_AID_PCH_ADULTE = <SCHEMA>.V_<SCHEMA>_TABLE_A.vaa_pch,
  "<SCHEMA>".AM_EMPLOYEE.E_AID_PCH_ENFANT = <SCHEMA>.V_<SCHEMA>_TABLE_A.vaa_pche
WHEN NOT MATCHED
THEN
INSERT
( "<SCHEMA>".AM_EMPLOYEE.LOGIN,
"<SCHEMA>".AM_EMPLOYEE.E_NOM_INSTRUCTEUR,
"<SCHEMA>".AM_EMPLOYEE.E_AID_PCH_ADULTE,
"<SCHEMA>".AM_EMPLOYEE.E_AID_PCH_ENFANT )
VALUES
( <SCHEMA>.V_<SCHEMA>_TABLE_A.COL_01,
<SCHEMA>.V_<SCHEMA>_TABLE_A.VAA_NOM_PRE_ACTEUR,
<SCHEMA>.V_<SCHEMA>_TABLE_A.vaa_pch,
<SCHEMA>.V_<SCHEMA>_TABLE_A.vaa_pche ) ;


MERGE INTO "<SCHEMA>".AM_EMPLOYEE USING <SCHEMA>.V_<SCHEMA>_TABLE_A ON ( "<SCHEMA>".AM_EMPLOYEE.LOGIN = to_char(<SCHEMA>.V_<SCHEMA>_TABLE_A.COL_01) )
*
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables


Find duplicate rows


select COL_01 , count(*) from <SCHEMA>.V_<SCHEMA>_TABLE_A
group by COL_01
having count(*) > 1


3A.5 UPDATE

3.5.1 INSERT Equivalent to MERGE

Example to modify the Preference Table of Oracle / Designer : in DESIGNER9I based on DESIGNER6I Table


UPDATE DESIGNER9I.QMS_USER_OPTIONS a SET
( USER_NAME ,
"LANGUAGE" ,
MENU_CALL_METHOD ,
ENABLE_CS_IND ,
HIGHLIGHT_QI_IND ,
HIGHLIGHT_RI_IND ,
VA_QUERYABLE_ITEM ,
VA_REQUIRED_ITEM ,
VA_READONLY_ITEM ,
VA_SELECTED_RECORD,
RAISE_FIND_WINDOW,
CREATED_BY,
CREATION_DATE, 
LAST_UPDATED_BY,
LAST_UPDATE_DATE ) = ( select
USER_NAME ,
"LANGUAGE" , 'NF' ,
ENABLE_CS_IND ,
HIGHLIGHT_QI_IND ,
HIGHLIGHT_RI_IND ,
VA_QUERYABLE_ITEM ,
VA_REQUIRED_ITEM ,
VA_READONLY_ITEM ,
VA_SELECTED_RECORD,
RAISE_FIND_WINDOW,
CREATED_BY,
CREATION_DATE, 'SYSTEM', sysdate
from DESIGNER6I.QMS_USER_OPTIONS b where a.user_name = b.user_name )
where exists ( select '1' from DESIGNER6I.QMS_USER_OPTIONS b where a.user_name = b.user_name )



insert into DESIGNER9I.QMS_USER_OPTIONS
select
  USER_NAME , LANGUAGE , 'NF' , ENABLE_CS_IND , HIGHLIGHT_QI_IND , HIGHLIGHT_RI_IND , VA_QUERYABLE_ITEM , VA_REQUIRED_ITEM , VA_READONLY_ITEM ,
  VA_SELECTED_RECORD, RAISE_FIND_WINDOW, CREATED_BY, CREATION_DATE,  'SYSTEM' , sysdate
from DESIGNER6I.QMS_USER_OPTIONS a
where not exists ( select '1' from DESIGNER9I.QMS_USER_OPTIONS b where a.user_name = b.user_name )


Bonus : Insert missing users

insert into DESIGNER9I.QMS_USER_OPTIONS
select user_name , 'FRE','NF','Y','Y','Y','QMS$BLACK_ON_YELLOW','QMS$WHITE_ON_DARKRED','QMS$BLACK_ON_GRAY','QMS$WHITE_ON_DARKBLUE','QUERY ONLY','SYSTEM',sysdate,'SYSTEM',sysdate
from
( select grantee user_name from dba_role_privs where granted_role = 'ICR_UTIL'
minus
select user_name from DESIGNER9I.QMS_USER_OPTIONS
order by 1 )

3.5.2 update target table row from another table if it exists

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )


3.5.3 avoid ampersand substitution variable

update gds.association a set nom ='ASSOCIATION CULTURELLE&SPORTIVE' where a.nom = 'ASSOCIATION CULTURELLE ET SPORTIVE';
 ->
update gds.association a set nom ='ASSOCIATION CULTURELLE'||chr(38)||'SPORTIVE' where a.nom = 'ASSOCIATION CULTURELLE ET SPORTIVE';

3A.6 Analytical Functions

To get preceding , following line values ; in this example, we want a single row when there are 2 on source table.


select * from TABLE_1 order by 1

ID_LIGNE_FACTURE    ID_FACTURE   DDV_PRODUIT
101026          99843     
146734          145122          5761
251306          248505          5774
251308          248506          5774
251310          248507          5775
379125          248507          5787
379596          373856          5787

with IDF AS (
select ID_LIGNE_FACTURE , ID_FACTURE , DDV_PRODUIT ,
lag(ID_FACTURE,1,0) over(order by ID_LIGNE_FACTURE) ID_FACTURE_preceding ,
lead(ID_FACTURE,1,0) over(order by ID_LIGNE_FACTURE) ID_FACTURE_following ,
lag(DDV_PRODUIT,1,0) over(order by ID_LIGNE_FACTURE) DDV_PRODUIT_preceding
from TABLE_1 order by 1,2
)
select ID_LIGNE_FACTURE , ID_FACTURE , DDV_PRODUIT , NULL DDV_PRODUIT_2 from IDF where ID_FACTURE != ID_FACTURE_preceding and ID_FACTURE != ID_FACTURE_following
union
select ID_LIGNE_FACTURE , ID_FACTURE , DDV_PRODUIT , DDV_PRODUIT_preceding from IDF where ID_FACTURE = ID_FACTURE_preceding

ID_LIGNE_FACTURE    ID_FACTURE   DDV_PRODUIT  DDV_PRODUIT_2
101026          99843            
146734          145122          5761   
251306          248505          5774   
251308          248506          5774   
379125          248507          5787            5775
379596          373856          5787   


3A.7 Hierarchical Query

create table owner.tab_auc as select * from owner.tab where 1=2
insert into owner.tab_auc select * from owner.tab where num_type_comp_father = 2502
insert into owner.tab_auc select * from owner.tab where num_type_comp in ('2502','2482','7')
commit ;

select * from owner.tab_auc order by num_type_comp_father

NUM_TYPE_COMP
NUM_TYPE_COMP_PERE
NUM_NIVEAU
TYPE_NAME
DUREE_VIE
FLAG_MODIF
ROOT_NUM_TYPE
TYPE_BASE
7
0
6

1
7
EQU
2482
7
6

1
7
EQU
2502
2482
6

1
7
EQU
2505
2502
6

1
7
EQU
2504
2502
6

1
7
EQU
2503
2502
6

1
7
EQU
2506
2502
6

1
7
EQU

Query through the hierarchy.


SELECT num_type_comp,num_type_comp_father,level,CONNECT_BY_ROOT num_type_comp AS ROOT_ID
FROM owner.tab_auc
START WITH num_type_comp_father = 7
CONNECT BY num_type_comp_father = PRIOR num_type_comp
ORDER SIBLINGS BY num_type_comp;


NUM_TYPE_COMP
NUM_TYPE_COMP_PERE
LEVEL
ROOT_ID
2482
7
1
2482
2502
2482
2
2482
2503
2502
3
2482
2504
2502
3
2482
2505
2502
3
2482
2506
2502
3
2482


3B] PL/SQL

3B.1 Call a procedure


declare
num number ;
begin
PR_WEB_VERS_DSS(num) ;
dbms_output.put_line('RET_COD = '||num) ;
end;
/

RET_COD = 0

PL/SQL procedure successfully completed.


pl/sql loop through a list of predefined varchar2 values
set serveroutput on
declare
  type nt_type is table of varchar2(16);
  nt nt_type := nt_type('DB1','DB2');
 --  type nt_type is table of number;
 --  nt nt_type := nt_type(1,2);
begin
  for i in 1..nt.count loop
    dbms_output.put_line(nt(i));
  end loop;
end;
DB1
DB2
PL/SQL procedure successfully completed.

3B.2 DB_LOGON PL with Username to set Current_schema

CREATE OR REPLACE TRIGGER DB_LOGON_REP
after logon on database
DECLARE
 -- username VARCHAR2 (32) ;
appli VARCHAR2 (16) ;
begin
   -- E/ BO alter session évite les Synonymes
   if ( user in ('SCH_REP') ) then
 --    username := sys_context('USERENV','SESSION_USER') ;
    select replace(user,'_REP','') into appli from dual ;
    EXECUTE IMMEDIATE 'alter session set current_schema='||appli||'';
   end if;
end;
/

3B.3 DB_LOGON PL : Terminate a session through the logon trigger

Accept every session from SVC service name connexion except UTIL01 User

select * from users_mon where service_name like 'SVC%'

CREATE OR REPLACE TRIGGER DB_LOGON_SVC
after logon on database
DECLARE
session_id number;
service VARCHAR2 (64) := sys_context('USERENV', 'SERVICE_NAME');
OSUS VARCHAR2 (30) := sys_context('USERENV', 'OS_USER');
e_nologon EXCEPTION;
begin
select sys_context('USERENV','SESSIONID') into session_id from dual;
IF session_id != 0 --ignore internal connections
then
 if ( service = 'SVC.cg13.fr' ) then
  if ( OSUS != 'UTIL01' ) then
         -- terminate
     RAISE e_nologon;
   end if;
 end if;
END IF;

EXCEPTION
  WHEN e_nologon THEN
     RAISE_APPLICATION_ERROR(-20001,'SVC unavailable, thank you');

end;
/

$ sqlplus UTIL01 @SVC_PRO
SQL*Plus: Release 10.2.0.5.0 - Production on Tue Feb 23 08:47:28 2016
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SVC unavailable, thank you
ORA-06512: at line 20

Enter user-name:

3B.4 SQL over Database Links

Ø  How to insert the result of a remote procedure execution and avoid ORA-02018: database link of same name has an open connection

  CN INTEGER; CT INTEGER; IG NUMBER; CHAINE VARCHAR2(2024);
  NB_APP number ;

  CHAINE :='BEGIN SYSTEM.TYPE_APP_COUNT@LN(''TOTAL'' , :a) ; END; ' ;
  EXECUTE IMMEDIATE CHAINE USING OUT NB_APP ;
--  dbms_output.put_line('NB_APP = '||NB_APP) ;
  CHAINE :='insert into SCHEMA.STAT_MM_DBS_PRO_APP_COUNT select trunc(sysdate,''MONTH'') , name , ''TOTAL'' , :a from v$database@ln'  ;
  CT:= DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(CT,CHAINE,dbms_sql.native);   -- supply binds
  dbms_sql.bind_variable (CT, ':a', NB_APP);
  IG := DBMS_SQL.EXECUTE(CT); DBMS_SQL.CLOSE_CURSOR(CT);

create database link "DBL_BASE" connect to <USR> identified by "psw" using 'BASE';
set serveroutput on
declare
nb_app number ;
begin
SCHEMA.TYPE_APP_COUNT@DBL_BASE('TOTAL',nb_app) ;
dbms_output.put_line('NB_APP = '||nb_app) ;
insert into SCHEMA.STAT_MM_DBS_PRO_APP_COUNT select sysdate , name , 'TOTAL' , nb_app from v$database@DBL_BASE ;
commit ;
end;
/
NB_APP = 141

  CHAINE :='BEGIN SCHEMA.TYPE_APP_COUNT@ln(''TOTAL'' , :a) ; END; ' ;
  EXECUTE IMMEDIATE CHAINE USING OUT NB_APP ;
  CHAINE :='insert into SCHEMA.STAT_MM_DBS_PRO_APP_COUNT select sysdate , name , ''TOTAL'' , :a from v$database@ln'  ;
  EXECUTE IMMEDIATE CHAINE USING IN NB_APP ;

Ø  ORA-04062 over db_link
The compiled code of the local procedure holds a timestamp copy of the timestamp at which the remote procedure was compiled.
On execution of the local procedure this timestamp copy is compared to the timestamp of the remote procedure.
If the comparison fails, the error you mention is thrown.

EXECUTE IMMEDIATE 'alter session set remote_dependencies_mode = ''SIGNATURE'' ' ;

3B.5 get every code using « utl_file » in a database

select distinct owner from dba_source where lower(text) like '%utl_file%' and owner not in ('SYS','SYSTEM') order by 1


4] SQLPLUS

Avoid any default setup :

SET ECHO OFF NEWP 0 SPA 0 PAGES 0 FEED OFF HEAD OFF TRIMS ON TAB OFF

4.1 : Get an HTML Output


sqlplus -s -MARKUP "HTML ON" system/${system_psw}@${BDc} @${REP_SCRIPTS}/awr_top_sql_buffers_report.sql ${wind} ${BGs}


4.2 SP2-0027: Input is too long (> 2499 characters) - line ignored
[This is a SQL*Plus limitation. The command line length is limited to 2500 characters]
 - either we break the line with a Carriage Return
 - or we rewrite
INSERT INTO ZECG1 select * from SCH01.ZECG1@INSTANCE.CORP.FR ;

5] Play with SYSDATE

Like in the Interstellar movie, go to the future or in the past !
One may want to modify the SYSDATE for testing purpose, here it is :


SQL> grant alter system to USR ;

SQL> Conn USR

SQL> ALTER SYSTEM SET fixed_date = '2014-03-24-10:00:00' ;
System altered.

SQL> select sysdate from dual ;
SYSDATE
----------
24/03/2014

SQL>  ALTER SYSTEM SET FIXED_DATE=NONE;
System altered.

SQL> select sysdate from dual ;
SYSDATE
----------
07/11/2014



6] Unicity

6.1 Add a Unique Constraint / find duplicate

ALTER TABLE APP.TABLE01 ADD PRIMARY KEY (NOM_BASE,NOM_COMPTE,PERIODICITE_SAUVE) ;


-- find duplicate rows
select NOM_BASE,NOM_COMPTE,PERIODICITE_SAUVE, count(*) from APP.TABLE01
group by NOM_BASE,NOM_COMPTE,PERIODICITE_SAUVE
having count(*) > 1
order by 1,2,3 ;


6.2 Delete duplicate rows

create table auc_1 ( a int , b int ) ;

insert into auc_1 values ('10','200') ;
insert into auc_1 values ('20','300') ;
insert into auc_1 values ('10','400') ;
insert into auc_1 values ('30','500') ;
insert into auc_1 values ('10','600') ;
commit ;

-- keep only one ‘10’ record :
delete   from auc_1 t1
where    rowid < (
         select  max(rowid)
         from    auc_1 t2
         where   t2.a = t1.a);

select * from auc_1 order by 1 ;
A       B
10      400
20      300
30      500

commit ;
drop table auc_1 ;

6.3 ORA-02270 on CONSTRAINT FOREIGN KEY even when Unique Index exists

Indeed, we have to create a Unique Constraint, in addition to the Unique Index, in the Parent Table :

create table t11 ( a int , b int ) ;
create table t12 ( a int , b int ) ;

ALTER TABLE t11 ADD (CONSTRAINT t12_FK FOREIGN KEY (b) REFERENCES t12 (b)) -- KO ORA-02270
create unique index t12_i1 on t12 (b) ;
ALTER TABLE t11 ADD (CONSTRAINT t12_FK FOREIGN KEY (b) REFERENCES t12 (b)) -- KO same

ALTER TABLE t12 ADD (CONSTRAINT t12_UK UNIQUE (b))
ALTER TABLE t11 ADD (CONSTRAINT t12_FK FOREIGN KEY (b) REFERENCES t12 (b)) -- OK



7] Others

7.1 Character Set

select VALUE$ from PROPS$ where name='NLS_CHARACTERSET';

SQL> select VALUE$ from PROPS$ where name='NLS_CHARACTERSET';

VALUE$
--------------------------------------------------------------------------------
WE8MSWIN1252

7.2 SQLLDR

  • Example


$ sqlldr SCH control=STAT_MM_SQL_INS_ALL_VOL.ctl
Password:

SQL*Loader: Release 10.2.0.5.0 - Production on Wed Mar 26 16:55:06 2014
Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Commit point reached - logical record count 37

$ cat STAT_MM_SQL_INS_ALL_VOL.ctl
load data
infile STAT_MM_SQL_INS_ALL_VOL.csv
append
into table STAT_MM_SQL_INS_ALL_VOL
fields terminated by ';'
(NAME,MONTH,TOTAL_DBF_GB)


  • Sqlldr produces Error Variable length field exceeds maximum length

For the character field longer than 255, we need to set explicitely the the field size in the loader controlfile [1061271.6 Metalink].
Cause
The default maximum length for delimited datatypes in SQL*Loader is 255 characters.
SQL*Loader reads the field information in the control file to determine the maximum space needed for each field's data.

$ cat inscription.ctl
LOAD DATA
INFILE 'export-csv.csv'
truncate
INTO TABLE formulaire_csv
FIELDS TERMINATED BY ';'  trailing nullcols
(
N_DOSSIER,
LIEU_POLE,
PALMARES CHAR(500),


  • Sqlldr produces ORA-01722: invalid number

cat APP.ctl
LOAD DATA infile 'Tickets 2013 2014_04.txt' APPEND
INTO TABLE TICKETS_TABLE FIELDS TERMINATED BY "~"
TRAILING NULLCOLS
(
DIRECTION       CHAR,
COUT_FACTURE    DECIMAL EXTERNAL,
NO_POSTE        CHAR
)

si
Record 1: Rejected - Error on table TICKETS_TABLE, column "COUT_FACTURE".
ORA-01722: invalid number

$ export NLS_LANG=FRENCH

=> ',' separator

Table TICKETS_TABLE:
  1052994 Rows successfully loaded.
  4 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                 247680 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:       1052998
Total logical records rejected:         4
Total logical records discarded:        0

7.3 Search a string in every "char-like" column

Adapted from http://stackoverflow.com/questions/6389666/oracle-search-all-tables-all-columns-for-string.

Run as SYSTEM :

set serveroutput on
DECLARE
  match_count integer;
  v_search_str varchar2(4000) := '%app_pro%' ;
BEGIN
        dbms_output.disable;
        dbms_output.enable(1000000);

  FOR t IN (SELECT a.owner,a.table_name,a.column_name FROM dba_tab_columns a , dba_tables b
             WHERE data_type in ('CHAR', 'VARCHAR2') -- , 'NCHAR', 'NVARCHAR2', 'CLOB', 'NCLOB')
       and a.owner in ('<schema_list>') -- and rownum < 200
       and a.table_name = b.table_name and a.owner = b.owner )
  LOOP  
    BEGIN
         -- dbms_output.put_line('SELECT COUNT(1) FROM "'||t.owner ||'".'|| t.table_name||' WHERE "'||t.column_name||'" like ''%YYY_PRO%'' ') ;
      EXECUTE IMMEDIATE
        'SELECT COUNT(1) FROM "'||t.owner||'".'||t.table_name||' WHERE lower("'||t.column_name||'") like :1 ' INTO match_count USING v_search_str ;

      IF match_count > 0 THEN
        dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
      END IF;
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line( 'Error encountered trying to read ' ||
                              t.column_name || ' from ' ||
                              t.owner || '.' || t.table_name );
    END;
  END LOOP;
END;
/

APP.A_PARAMETERS PARAM_VALUE 2
PL/SQL procedure successfully completed.

Run as a user :

-- Find a string in every tables
-- Gives table / field and row count of the string

set serveroutput on
DECLARE
  match_count integer;
  v_search_str varchar2(4000) := '%Marc%' ;
BEGIN
        dbms_output.disable;
        dbms_output.enable(1000000);

  FOR t IN (SELECT a.table_name,a.column_name FROM user_tab_columns a , user_tables b
             WHERE data_type in ('CHAR', 'VARCHAR2') -- , 'NCHAR', 'NVARCHAR2', 'CLOB', 'NCLOB')
--    and a.owner in ('<schema_list>') -- and rownum < 200
      and a.table_name = b.table_name )
  LOOP  
    BEGIN
        -- dbms_output.put_line('SELECT COUNT(1) FROM "'||t.owner ||'".'|| t.table_name||' WHERE "'||t.column_name||'" like ''%YYY_PRO%'' ') ;
      EXECUTE IMMEDIATE
        'SELECT COUNT(1) FROM '||t.table_name||' WHERE "'||t.column_name||'" like :1 ' INTO match_count USING v_search_str ;

      IF match_count > 0 THEN
        dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
      END IF;
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line( 'Error encountered trying to read ' ||
                              t.column_name || ' from ' ||
                              t.table_name );
    END;
  END LOOP;
END;
/

7.4 How to select a string in View or MView code ?

Views
CREATE TABLE views_source (  view_name VARCHAR2(30),   text CLOB );
BEGIN
  FOR v IN (SELECT view_name, text FROM user_views) LOOP
    INSERT INTO views_source VALUES (v.view_name, v.text);
  END LOOP;
  COMMIT;
END;
/
SELECT * FROM views_source WHERE instr(upper(text), 'EMPLOYEE') > 0;

Thanks to http://przemyslawkruglej.com/ :
"And that’s it! The trick here is this: in PL/SQL context, Oracle automatically converts for us a LONG value to a CLOB."

MViews
drop TABLE mviews_source ;
CREATE TABLE mviews_source (  owner varchar2(32) , view_name VARCHAR2(30),   text CLOB ) ;
-- truncate TABLE mviews_source ;
BEGIN
  FOR v IN (SELECT owner,mview_name, query FROM dba_mviews) LOOP
    INSERT INTO mviews_source VALUES (v.owner,v.mview_name, v.query);
  END LOOP;
  COMMIT;
END;
/
SELECT * FROM mviews_source WHERE instr(upper(text), 'HR.') > 0;


8] Library Cache Lock

Finding Lib Cache Pin Lock from Bobak, Mark.


col OBJECT_NAME for a30
select /*+ ordered */
  decode(lob.kglobtyp, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3,'CLUSTER',
                       4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                       7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
                      13, 'TYPE', 14, 'TYPE BODY',
                      19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21,'LOB',
                      22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
                      28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
                      32, 'INDEXTYPE', 33, 'OPERATOR', 34, 'TABLE SUBPARTITION',
                      35, 'INDEX SUBPARTITION', 40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
                      42, 'MATERIALIZED VIEW', 43, 'DIMENSION', 44, 'CONTEXT',
                      46, 'RULE SET', 47, 'RESOURCEPLAN', 48, 'CONSUMER GROUP',
                      51, 'SUBSCRIPTION', 52, 'LOCATION', 55, 'XML SCHEMA', 56, 'JAVA DATA',
                      57, 'SECURITY PROFILE', 59, 'RULE', 62, 'EVALUATION CONTEXT',
                     'UNDEFINED') object_type,
       lob.KGLNAOBJ object_name,       pn.KGLPNMOD lock_mode_held,       pn.KGLPNREQ lock_mode_requested,
       ses.sid,       ses.serial#,     ses.username
  FROM
       v$session_wait vsw,       x$kglob lob,       x$kglpn pn,       v$session ses
  WHERE
   pn.KGLPNUSE = ses.saddr and   pn.KGLPNHDL = lob.KGLHDADR
   and lob.kglhdadr = vsw.p1raw   and vsw.event = 'library cache pin'
order by lock_mode_held desc
/

SQL> set lines 150 pages 5000
SQL> /

OBJECT_TYPE        OBJECT_NAME                    LOCK_MODE_HELD LOCK_MODE_REQUESTED        SID    SERIAL# USERNAME
------------------ ------------------------------ -------------- ------------------- ---------- ---------- ------------------------------
PACKAGE            ODI_COR_DM_DIM_MARCHE                       2                   0        367       1617 IOW_OIN_DWH
PACKAGE            ODI_COR_DM_DIM_MARCHE                       0                   3         17        621 IOW_ODI_DTM



9] Get Application Dependencies

  • Synonym pointing to
  • Object linked to                                 another application
  • Grant towards object of

-- search for dependencies between applications
select 'Synonym '||owner||'.'||synonym_name||' -> '||table_owner||'.'||table_name||'' from dba_synonyms
where owner in ('APP01','APP02','APP03','APP04','APP05') and table_owner in ('APP01','APP02','APP03','APP04','APP05') and owner != table_owner order by 1

select ''||type||' '||owner||'.'||name||' -> '||referenced_owner||'.'||referenced_name||''
from dba_dependencies where owner != referenced_owner and
owner in ('APP01','APP02','APP03','APP04','APP05') and referenced_owner in ('APP01','APP02','APP03','APP04','APP05') order by 1

select 'Grant '||grantee||' '||privilege||' -> '||owner||'.'||table_name||' with Grantable '||GRANTABLE||'' from dba_tab_privs
where grantee in ('APP01','APP02','APP03','APP04','APP05') and owner in ('APP01','APP02','APP03','APP04','APP05') and grantee != owner order by 1


MATERIALIZED VIEW APP_01.V_FACTURES -> APP_02.FACE
SYNONYM APP_01.S_APP_02_ANAL -> APP_02.ANAL
Grant APP_02 UPDATE -> APP_01.IEAP with Grantable NO
Grant APP_02 UPDATE -> APP_01.IECP with Grantable NO

 -- search for all applications linked to &USR

select ''||type||' '||owner||'.'||name||' -> '||referenced_owner||'.'||referenced_name||'' LINK_DESC , owner , type
from dba_dependencies where owner != referenced_owner and owner not like '&USR%' and referenced_owner in ('&USR')
union
select 'Grant '||grantee||' '||privilege||' -> '||owner||'.'||table_name||'' , grantee owner , privilege type
from dba_tab_privs where grantee not like '&USR%' and owner in ('&USR') and grantee != owner order by 2


LINK_DESC                                                   OWNER  TYPE
Grant APP01 SELECT -> APP.CORP_INSTI_UTILISATEUR                   APP01  SELECT
SYNONYM APP01.CORP_INSTI_UTILISATEUR -> APP.CORP_INSTI_UTILISATEUR APP01  SYNONYM
Grant APP01 EXECUTE -> APP.CORP_INSTI_PK_PARAMETRES_UTIL           APP01  EXECUTE

-- search for all applications linked from SCH01
select distinct to_owner , type , count(1) over ( partition by to_owner , type ) nb_obj from (
select ''||type||' '||owner||'.'||name||' -> '||referenced_owner||'.'||referenced_name||'' , referenced_owner to_owner , type
from dba_dependencies where owner != referenced_owner and owner = 'SCH01'
union
select 'Grant '||grantee||' '||privilege||' -> '||owner||'.'||table_name||'' , owner to_owner , privilege type
from dba_tab_privs where grantee = 'SCH01' and grantee != owner order by 2
) order by 1,2


Beware :
"We don't add dependency whenever the MV has a base table which is owned by SYS.
In fact, if the MV is created with enable query rewrite and it has any SYS table reference, the MV creation will fail with an error. 
If the MV is created with disable query rewrite and it has any SYS table reference, the MV creation will succeed but no dependency is registered."

Another one, get every objects that points to a schema ( example HR )

 -- direct link
select ''||type||' '||owner||'.'||name||' -> '||referenced_owner||'.'||referenced_name||'' LINK_DESC -- , owner , type
from dba_dependencies where owner != referenced_owner and owner not like '&USR%' and referenced_owner in ('&USR')
and type != 'SYNONYM'
order by 1

 -- link by synonyms
select ''||type||' '||owner||'.'||name||' -> '||referenced_owner||'.'||referenced_name||'' LINK_DESC from (
with A AS (
select owner,name , referenced_owner,referenced_name
from dba_dependencies where owner != referenced_owner and owner not like '&USR%' and referenced_owner in ('&USR')
and type = 'SYNONYM' )
select B.TYPE,B.owner,B.name , A.referenced_owner,A.referenced_name from A , dba_dependencies B where A.owner = B.referenced_owner and A.name = B.referenced_name
order by 1,2
) order by 1


10] Resource Management

10.1 The old way : Profile


select * from dba_profiles ;

alter profile BO_USR LIMIT SESSIONS_PER_USER 5



11] Oracle Sessions

11.1 Copycat an Oracle User !

The Proxy method helps us here to connect and « become » a user without ever knowing its password :

grant connect through su

SQLPLUS as SYSTEM


SQL> create user USER_PROXY identified by USER_PROXY;

SQL> alter user USER grant connect through USER_PROXY ;

SQL> connect USER_PROXY[USER]/USER_PROXY
Connected.


11.2 blog oracle show current_schema in session

SQL> select sys_context( 'userenv', 'current_schema' ) from dual;

SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
--------------------------------------------------------------------------------
USERA



Manage Instance

0] Query Hidden Instance Parameters

col CURRENT_VAL for a10
select a.ksppinm hidden_name, b.ksppstvl current_val, b.KSPPSTDF default_val from X$KSPPI a, x$ksppsv b where a.indx = b.indx and a.ksppinm like '%max_services%' order by 1 ;


1] 10g Initialization Parameters

Examples I use as a start.

#########
#
# Database Identification
#
#########
db_domain="corp.fr"
db_name=PPRQU
# Identification Data Guard
db_unique_name=PPRQU
instance_name=PPRQU

compatible=10.2.0

# 1/ structure

#########
#
# Cache and I/O
#
#########
db_block_size=8192

#########
#
# File Configuration
#
#########
control_files=("/rdo1/pprqu/ctl/cntl_1.ctl", "/rdo2/pprqu/ctl/cntl_2.ctl")

#########
#
# System Managed Undo and Rollback Segments
#
#########
undo_management=AUTO
undo_tablespace=UNDO

#########
#
# Redo Log and Recovery
#
#########
fast_start_mttr_target=300
log_checkpoint_timeout=0

#########
#
# Archive
#
#########
log_archive_dest_1='LOCATION=/arch/pprqu/'
log_archive_format='PPRQU%t_%s_%r.arc'

# 2/ logs

#########
#
# Diagnostics and Statistics
#
#########
background_dump_dest=/work/oracle/pprqu/bdump
core_dump_dest=/work/oracle/pprqu/cdump
user_dump_dest=/work/oracle/pprqu/udump
timed_statistics=TRUE
max_dump_file_size = 20480

#########
#
# Security and Auditing
#
#########
audit_file_dest=/work/oracle/pprqu/adump
remote_login_passwordfile=EXCLUSIVE
os_authent_prefix=''
remote_os_authent=TRUE

# 3/ SGA

#########
#
# SGA Memory
#
#########
sga_target=288M

# 4/ sessions

#########
#
# Processes and Sessions
#
# For Forms processes, there will be one database session per
# open form, with a minimum of two sessions per Forms user (one
# for the navigator form, and one for the active form.
#
#########
processes=256
sessions=512

#########
#
# Cursors and Library Cache
#
#########
cursor_sharing = EXACT
open_cursors=300
session_cached_cursors = 200

#########
#
# Sort, Hash Joins, Bitmap Indexes
#
#########
pga_aggregate_target=64m

# MTS
sort_area_size=16777216
hash_area_size=16777216

#########
#
# MTS
#
#########
dispatchers='(protocol=TCP)(disp=2)'
max_dispatchers=4
shared_servers=4
max_shared_servers=8

# 5/ optimiseur

#########
#
# Optimizer
#
#########
_b_tree_bitmap_plans=false
optimizer_secure_view_merging=false

# 6/ Divers

#########
#
# Advanced Queuing (AQ) and Job Queues
#
# AQ requires the TM process to handle delayed messages. A number
# of Application modules use AQ, including Workflow. Job Queues
# enable advanced queue to submit background jobs.
#
#########
aq_tm_processes = 1
job_queue_processes=5

#########
#
# Parallel Execution
#
# Some of the Applications Concurrent Programs use parallel
# execution including DBI programs and Gathering Statistics.
#
#########
parallel_max_servers = 8      # Max. value should be 2*CPUs
parallel_min_servers = 0

#########
#
# AIX
#
#########
disk_asynch_io=true
filesystemio_options='SetAll'


2] 11g Initialization Parameters

###########################################
# Database Identification
###########################################
db_domain="corp.fr"
db_name="BASE"
compatible=11.2.0.0.0

# 1/ structure

###########################################
# Cache and I/O
###########################################
db_block_size=8192

###########################################
# File Configuration
###########################################
control_files=("/rdo1/base/ctl/cntl_1.ctl", "/rdo2/base/ctl/cntl_2.ctl")

###########################################
# System Managed Undo ( default )
###########################################
undo_tablespace=UNDOTBS1

###########################################
# Archive
###########################################
log_archive_dest_1='LOCATION=/arch/base/'
log_archive_format='BASE%t_%s_%r.arc'

# 2/ logs

###########################################
# Diagnostics , Security and Auditing
###########################################
diagnostic_dest=/work/oracle/base
audit_file_dest=/work/oracle/base/adump
audit_trail=db
remote_login_passwordfile=EXCLUSIVE
os_authent_prefix=''

# 3/ memory

###########################################
# Processes and Sessions , Cursors and Lib Cache
###########################################
memory_target=348M

processes=300
open_cursors=300

###########################################
# Shared Server
###########################################
DISPATCHERS="(PROTOCOL=tcp)(DISPATCHERS=2)"

# 4/ Divers

###########################################
# AIX
###########################################
disk_asynch_io=true
filesystemio_options='SetAll'

###########################################
# Network Registration
###########################################
#local_listener=LISTENER_BASE


3] 12c Initialization Parameters


4] Change SID and/or DBID with newid

The NID utility allows you to change only the DBNAME, or only the DBID or both DBNAME and DBID in the same command.

4.1 Change Both DBID and DBNAME with « nid »

  1. Backup of the database.
$ rman target /
run {
Change Archivelog All Crosscheck ;
backup  database format '/rman/db_name/full/db_F_%d_s%s_U%U_%Y%M%D'
plus archivelog format '/rman/db_name/full/ar_F_%d_s%s_U%U_%Y%M%D' tag = 'F' delete input ;
}
 
  2. Shutdown IMMEDIATE of the database
  3. STARTUP MOUNT
  4. Open one session and run NID with sysdba privileges
     $ nid TARGET=/ DBNAME=NEW_DB_NAME

DB_NAME :/home/oracle > nid TARGET=/ DBNAME=NEW_DB_NAME

DBNEWID: Release 12.1.0.2.0 - Production on Tue Nov 8 11:25:24 2016

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

Connected to database DB_NAME (DBID=157110432)

Connected to server version 12.1.0

Control Files in database:
    /rdo1/new_db_name/ctl/cntl_1.ctl
    /rdo2/new_db_name/ctl/cntl_2.ctl

Change database ID and database name DB_NAME to NEW_DB_NAME? (Y/[N]) => Y

Proceeding with operation
Changing database ID from 157110432 to 919288100
Changing database name from DB_NAME to NEW_DB_NAME
    Control File /rdo1/new_db_name/ctl/cntl_1.ctl - modified
    Control File /rdo2/new_db_name/ctl/cntl_2.ctl - modified
    Datafile /data/new_db_name/system_01.db - dbid changed, wrote new name
    Datafile /data/new_db_name/undo_01.db - dbid changed, wrote new name
    Datafile /data/new_db_name/ija_662_cms_idx.db - dbid changed, wrote new name
    Datafile /data/new_db_name/ija_662_cms_connect_dat.db - dbid changed, wrote new name
    Datafile /data/new_db_name/ija_662_cms_connect_idx.db - dbid changed, wrote new name
    Datafile /data/new_db_name/temp01.db - dbid changed, wrote new name
    Control File /rdo1/new_db_name/ctl/cntl_1.ctl - dbid changed, wrote new name
    Control File /rdo2/new_db_name/ctl/cntl_2.ctl - dbid changed, wrote new name
    Instance shut down

Database name changed to NEW_DB_NAME.
Modify parameter file and generate a new password file before restarting.
Database ID for database NEW_DB_NAME changed to 919288100.
All previous backups and archived redo logs for this database are unusable.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.

DB_NAME :/home/oracle >

5. After DBNEWID successfully changes the DBID,Shutdown IMMEDIATE of the database
  6. Set the DB_NAME initialization parameter in the initialization parameter file to the new database name.

DB_NAME :/work/oracle/db_name/pfile > strings spfileDB_NAME.ora | grep -i db_name
*.audit_file_dest='/work/oracle/db_name/adump'
*.core_dump_dest='/work/oracle/db_name/cdump'
*.db_name='DB_NAME'
*.db_unique_name='DB_NAME'
*.diagnostic_dest='/work/oracle/db_name'
*.instance_name='DB_NAME'
log_archive_format='DB_NAME%t_%s_%r.arc'
DB_NAME :/work/oracle/db_name/pfile >

SQL> SELECT name FROM v$parameter WHERE isdeprecated ='TRUE' ORDER BY name ;
sec_case_sensitive_logon
The IGNORECASE argument of ORAPWD and the SEC_CASE_SENSITIVE_LOGON system parameter are deprecated in Oracle Database 12c. By default, passwords in Oracle Database 12c are case sensitive.

SQL> create pfile = '/work/oracle/db_name/pfile/initDB_NAME.ora_NID' from spfile = '/work/oracle/db_name/pfile/spfileDB_NAME.ora' ;
DB_NAME :/work/oracle/db_name/pfile > sed -e 's/db_name/new_db_name/g' -e 's/DB_NAME/NEW_DB_NAME/g' initDB_NAME.ora_NID > initNEW_DB_NAME.ora
NEW_DB_NAME :/work/oracle/db_name/pfile > diff initDB_NAME.ora_NID initNEW_DB_NAME.ora
1,10c1,10
< DB_NAME.__data_transfer_cache_size=0
< DB_NAME.__db_cache_size=838860800
< DB_NAME.__java_pool_size=16777216
< DB_NAME.__large_pool_size=150994944
< DB_NAME.__oracle_base='/oracle'#ORACLE_BASE set from environment
< DB_NAME.__pga_aggregate_target=822083584
< DB_NAME.__sga_target=1325400064
< DB_NAME.__shared_io_pool_size=0
< DB_NAME.__shared_pool_size=301989888
< DB_NAME.__streams_pool_size=0
---
> NEW_DB_NAME.__data_transfer_cache_size=0
> NEW_DB_NAME.__db_cache_size=838860800
> NEW_DB_NAME.__java_pool_size=16777216
> NEW_DB_NAME.__large_pool_size=150994944
> NEW_DB_NAME.__oracle_base='/oracle'#ORACLE_BASE set from environment
> NEW_DB_NAME.__pga_aggregate_target=822083584
> NEW_DB_NAME.__sga_target=1325400064
> NEW_DB_NAME.__shared_io_pool_size=0
> NEW_DB_NAME.__shared_pool_size=301989888
> NEW_DB_NAME.__streams_pool_size=0
12c12
< *.audit_file_dest='/work/oracle/db_name/adump'
---
> *.audit_file_dest='/work/oracle/new_db_name/adump'
16c16
< *.core_dump_dest='/work/oracle/db_name/cdump'
---
> *.core_dump_dest='/work/oracle/new_db_name/cdump'
20,22c20,22
< *.db_name='DB_NAME'
< *.db_unique_name='DB_NAME'
< *.diagnostic_dest='/work/oracle/db_name'
---
> *.db_name='NEW_DB_NAME'
> *.db_unique_name='NEW_DB_NAME'
> *.diagnostic_dest='/work/oracle/new_db_name'
28c28
< *.instance_name='DB_NAME'
---
> *.instance_name='NEW_DB_NAME'
31c31
< *.log_archive_format='DB_NAME%t_%s_%r.arc'
---
> *.log_archive_format='NEW_DB_NAME%t_%s_%r.arc'
46d45
< *.sec_case_sensitive_logon=TRUE
57d55
< *.utl_file_dir='/tmp'
NEW_DB_NAME :/work/oracle/db_name/pfile >

$ cd /work/oracle/new_db_name/pfile
NEW_DB_NAME :/work/oracle/new_db_name/pfile > cp -p /work/oracle/db_name/pfile/initNEW_DB_NAME.ora .
NEW_DB_NAME :/work/oracle/new_db_name/pfile > sqlplus / as sysdba
SQL> create spfile = '/work/oracle/new_db_name/pfile/spfileNEW_DB_NAME.ora' from pfile = '/work/oracle/db_name/pfile/initNEW_DB_NAME.ora' ;

NEW_DB_NAME :/oracle/12CDB/dbs > cat initNEW_DB_NAME.ora
spfile='/work/oracle/new_db_name/pfile/spfileNEW_DB_NAME.ora'

  7. Create a new password file.
NEW_DB_NAME :/oracle/12CDB/dbs > orapwd file=orapw${ORACLE_SID} password=<psw>pn 

  8. Startup of the database with open resetlogs

NEW_DB_NAME :/oracle/12CDB/dbs > sqlplus / as sysdba
startup mount
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size                  2926472 bytes
Variable Size            1291847800 bytes
Database Buffers          838860800 bytes
Redo Buffers               13848576 bytes
Database mounted.

SQL> alter database open resetlogs;
Database altered.

4.2 Change DBID with « nid »

  1. Backup the database
  2. SHUTDOWN IMMEDIATE of the database
  3. STARTUP MOUNT
  4. Open one session and run NID with sysdba privileges
     % nid TARGET=/
  5. alter database open resetlogs ;