Friday, 31 May 2019

Linux/Unix basic usefull basic Commands.

Linux Commands.

1) Files Commands

touch
cp
mv
rm
cat
tar
more
less
compress
uncompress
zip
unzip

2) Directory Commands
Cd
pwd
ls
mkdir
rmdir

3) Terminal Commands
clear
echo
repeat

4) Help Commands
man
help
rtfm

5) Information Commands
history
hostname
who
who am i
wc
date
cal
whatis
whereis
apropos
is
tty

7) CSHELL Symbols
|
>
>>
<
&
:
*
?
[]
$var


Shell script of Oracle Datapump.

  
Hi Code seeker,

I am explaining shell script of datapump and upload file in FTP.


Create file script with datapump_ftp.sh name and grant execute permission.

/u01/datapump_ftp.sh
chmod u+x datapump_ftp.sh



#!/bin/sh
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH
ORACLE_SID=orcl; export ORACLE_SID
today=`date +%Y%m%d%H%M%S`

expdp scott/alam DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott-$today  LOGFILE=scottLOG-$today.log
zip -r /u01/app/oracle/admin/orcl/dpdump/scott-$today.zip /u01/app/oracle/admin/orcl/dpdump/scott-$today.dmp

cd /u01/app/oracle/admin/orcl/dpdump/

HOST=192.168.0.102
#This is the FTP servers host or IP address.
USER=FTPUser
#This is the FTP user that has access to the server.
PASS=alam
#This is the password for the FTP user.

ftp -inv $HOST << EOF
user $USER $PASS
put scott-$today.zip
bye
EOF
   

Scheduled jobs in Oracle 11g

Scheduler in pl/sql Oracle 11g

Hi Code seeker,

I am explaining refresh materialized view in oracle using Schedule jobs.


Example 1

create materialized view M_CUST_ORDER as select customer_cd,order_no,sum(order_qty)
from sod_order group by customer_cd,order_no

select * from M_cust_order
 

Manual refreshing materialized view
 

execute dbms_mview.refresh('M_CUST_ORDER','C')

automatic refreshing materialized view using schedule jobs.

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'CUSTOMER_ORDER_MVIEW_REFRESH',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN execute    dbms_mview.refresh(''M_CUST_ORDER'',''C''); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
    enabled         => TRUE);
END;



Manual execute schedule jobs.

exec dbms_scheduler.run_job('CUSTOMER_ORDER_MVIEW_REFRESH');

Example 2
  
Schedule any pl/sql procedure.

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'TEST_SH2',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN alam.gen_xm_file_test_sh; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=minutely; interval=2; bysecond=0;',
    enabled         => TRUE);
END;
/


exec dbms_scheduler.run_job('TEST_SH2');

select * from DBA_SCHEDULER_JOBS where job_name like '%TEST_SH2%'

select * from DBA_SCHEDULER_JOB_RUN_DETAILS where job_name like '%TEST_SH2%'

TO Enable or disable schedule.


BEGIN
  DBMS_SCHEDULER.ENABLE('TEST_SH2');
END;


BEGIN
  DBMS_SCHEDULER.DISABLE('TEST_SH2');
END;


To check schedule details.

SELECT * FROM dba_scheduler_jobs WHERE job_name = 'TEST_SH2';
SELECT * FROM dba_scheduler_job_log WHERE job_name = '
TEST_SH2';
 

Or checking from JOB owner schema
 

SELECT * FROM user_scheduler_jobs WHERE job_name = 'TEST_SH2';
SELECT * FROM user_scheduler_job_log WHERE job_name = 'TEST_SH2';

Example 3

Schedule any batch file.

begin
 dbms_scheduler.create_schedule(
       schedule_name   => 'daily_at_4am_except_monday',
       repeat_interval => 'FREQ=DAILY; INTERVAL=1;
       BYDAY=TUE,WED,THU,FRI,SAT,SUN; BYHOUR=4',
       comments => 'schedule to run daily at 4am except on mondays');


  dbms_scheduler.create_program
    (  program_name   => 'backup_database',
       program_type   => 'EXECUTABLE',
       program_action => 'd:\oracle\product\admin\dw\scripts\backup_dw.bat > nul',
       enabled        => TRUE,
       comments       => 'Backup dw database using rman and then backup rman database via hot backup.'
    );

  dbms_scheduler.create_job (
    job_name=>'daily_backup',
    program_name =>'backup_database',
    schedule_name=> 'DAILY_AT_4AM_EXCEPT_MONDAY',
    enabled      => true,
    comments     => 'backs up the dw and rman databases daily at 4am
except on for mondays.'
  );
end;
/

Saturday, 25 May 2019

Generate CSV file and insert into table using oracle pl/sql 11g

Hi Code seeker,

I am  explaining, generate CSV file and insert  CSV table using oracle database 11g.

Generate csv file and insert csv file.



CREATE OR REPLACE PROCEDURE EMP_CSV IS
        V_FILE     UTL_FILE.FILE_TYPE;
       V_STRING   VARCHAR2 (4000);
   CURSOR C_EMP
   IS
      SELECT * FROM EMP;
BEGIN
    --SET_APPLICATION_PROPERTY(CURSOR_STYLE,'BUSY');
   V_FILE :=
      UTL_FILE.FOPEN ('EXCEL_DATA','emp'||TO_CHAR(SYSDATE,'ddmmyyyhh24miss')||'.csv','w',4000);
   V_STRING := 'EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO';
   UTL_FILE.PUT_LINE (V_FILE, V_STRING);
   FOR CUR IN C_EMP
   LOOP
      V_STRING :=
            CUR.EMPNO|| ','|| CUR.ENAME|| ','|| CUR.JOB|| ','|| CUR.MGR|| ','|| CUR.HIREDATE|| ','||CUR.SAL|| ','|| CUR.COMM|| ','|| CUR.DEPTNO;
      UTL_FILE.PUT_LINE (V_FILE, V_STRING);
   END LOOP;
   UTL_FILE.FCLOSE (V_FILE);
--SET_APPLICATION_PROPERTY(CURSOR_STYLE,'DEFAULT');
END;

Find table name in scheme using string in Oracle pl/sql

Hi Code seeker,

I attend Data Science interview, they ask sql and pl/sql question. but they ask one IMP question.
suppose in one schema, there is 1000 table. and i gave you string 'SMITH' to find table name,
which store string 'SMITH' value.
Means you don't know table name and find table name who store 'SMITH' value.

Below is example of find table name using string.

CREATE OR REPLACE FUNCTION ALAM.FIND_IN_SCHEMA_NEW(VAL VARCHAR2)
RETURN VARCHAR2 IS
  V_OLD_TABLE USER_TAB_COLUMNS.TABLE_NAME%TYPE;
  V_WHERE     VARCHAR2(4000);
  V_FIRST_COL BOOLEAN := TRUE;
  TYPE RC     IS REF CURSOR;
  C           RC;
  V_ROWID     VARCHAR2(20);
BEGIN
  FOR R IN (
    SELECT
      T.*
    FROM
      USER_TAB_COLS T, USER_ALL_TABLES A
    WHERE T.TABLE_NAME = A.TABLE_NAME
      AND T.DATA_TYPE LIKE '%CHAR%'
    ORDER BY T.TABLE_NAME) LOOP
    IF V_OLD_TABLE IS NULL THEN
      V_OLD_TABLE := R.TABLE_NAME;
    END IF;
    IF V_OLD_TABLE <> R.TABLE_NAME THEN
      V_FIRST_COL := TRUE;
      DBMS_OUTPUT.PUT_LINE('searching ' || V_OLD_TABLE);
      OPEN C FOR 'select rowid from "' || V_OLD_TABLE || '" ' || V_WHERE;
      FETCH C INTO V_ROWID;
      LOOP
        EXIT WHEN C%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(VAL ||' Value in '||'  rowid: ' || V_ROWID || ' in ' || V_OLD_TABLE);
        FETCH C INTO V_ROWID;
      END LOOP;
      V_OLD_TABLE := R.TABLE_NAME;
    END IF;
    IF V_FIRST_COL THEN
      V_WHERE := ' where ' || R.COLUMN_NAME || ' like ''%' || VAL || '%''';
      V_FIRST_COL := FALSE;
    ELSE
      V_WHERE := V_WHERE || ' or ' || R.COLUMN_NAME || ' like ''%' || VAL || '%''';
    END IF;
  END LOOP;
  RETURN 'Success';
END;
/
SQL> set serveroutput on size 1000000 format wrapped

SQL> select FIND_IN_SCHEMA_NEW ('SMITH') from dual;

FIND_IN_SCHEMA_NEW('SMITH')
--------------------------------------------------------------------------------
Success

searching ABC
searching ACCUMULATED_RECEIPT
searching BADLOG
searching CUSTOMER_BATCH_SELECTION
searching CUSTOMER_MARGIN
searching CUSTOMER_ORDER_EXCEL_UPLOAD
searching DEPT
searching DEPT_COPY
searching DIR_LIST_JAVA
searching EMP
SMITH Value in   rowid: AAAHpSAAFAAAB11AAA in EMP
searching EMP_NEW
SMITH Value in   rowid: AAAG+fAAEAAAAHfAAA in EMP_NEW
searching EMP_NEW_TEST
SMITH Value in   rowid: AAAG+hAAEAAAAHrAAA in EMP_NEW_TEST
searching EMP_ORIGNAL
SMITH Value in   rowid: AAAG+gAAEAAAAHjAAA in EMP_ORIGNAL
searching EMP_PAYLOAD



Generate XML files and insert/update in another table using merge statement.

Hi Code seeker,

I am  explaining, generate XML file and insert into another table using Oracle merge statement.


Environment Oracle database11g, Oracle Linux 5.5, windows 7, TOAD.

Source table : emp
Destination table : emp_new

Step 1
create procedure for generate XML files.

create or replace procedure pro_emp( v_empno number) Is
 rc sys_refcursor;
BEGIN
 OPEN rc FOR SELECT * FROM emp where EMPNO=v_empno;
 dbms_xslprocessor.clob2file( xmltype( rc ).getclobval( ) , 'XML_FILES','clob2file.xml');
END;
/
---------------------------------------------------------
Step 2

exec pro_emp(7369)
create table emp_new as select * from emp;
---------------------------------------------------
Step 3

CREATE TABLE XML_TAB
(
  ID              NUMBER(10),
  FILENAME        VARCHAR2(100 BYTE),
  STATUS          VARCHAR2(20 BYTE),
  XML             SYS.XMLTYPE,
  PENDING_DATE    DATE,
  PROCESSED_DATE  DATE
)

ALTER TABLE xml_tab ADD ( CONSTRAINT xml_tab_pk PRIMARY KEY (id));
CREATE SEQUENCE xml_tab_seq;
-------------------------------------------------------------
Step 4

CREATE OR REPLACE PROCEDURE load_xml (p_dir       IN  VARCHAR2, p_filename  IN  VARCHAR2) AS
  l_bfile  BFILE := BFILENAME(p_dir, p_filename);
  l_clob   CLOB;
  l_dest_offset   INTEGER := 1;
  l_src_offset    INTEGER := 1;
  l_bfile_csid    NUMBER  := 0;
  l_lang_context  INTEGER := 0;
  l_warning       INTEGER := 0;
BEGIN
  DBMS_LOB.createtemporary (l_clob, TRUE);
  DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
  -- loadfromfile deprecated.
  -- DBMS_LOB.loadfromfile(l_clob, l_bfile, DBMS_LOB.getlength(l_bfile));
  DBMS_LOB.loadclobfromfile (
    dest_lob      => l_clob,
    src_bfile     => l_bfile,
    amount        => DBMS_LOB.lobmaxsize,
    dest_offset   => l_dest_offset,
    src_offset    => l_src_offset,
    bfile_csid    => l_bfile_csid ,
    lang_context  => l_lang_context,
    warning       => l_warning);
  DBMS_LOB.fileclose(l_bfile);
  INSERT INTO xml_tab (id,filename,xml)
  VALUES (xml_tab_seq.NEXTVAL,p_filename,XMLTYPE.createXML(l_clob));
  COMMIT;
  DBMS_LOB.freetemporary (l_clob);
END;
------------------------------------------------------------
Step 5

EXEC load_xml(p_dir => 'XML_FILES', p_filename => 'clob2file.xml');
SET LONG 5000

SELECT * FROM xml_tab;

ID    FILENAME    STATUS    XML    PENDING_DATE    PROCESSED_DATE
445    clob2file.xml    PENDING    (ORAXML)    26/05/2019 0:30   
430    SOH_SESSION_20190415113503.xml    PROCESSED    (ORAXML)    15/04/2019 23:36    15/04/2019 23:36

Step 6

CREATE OR REPLACE PROCEDURE EMP_MERGE AS
BEGIN
  MERGE INTO EMP_NEW A
  USING
    (SELECT  EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
  FROM XML_TAB M
     , XMLTABLE('//ROWSET/ROW' PASSING M.XML
       COLUMNS
             EMPNO      NUMBER(4)    PATH 'EMPNO'
           , ENAME      VARCHAR2(30) PATH 'ENAME'
           , JOB        VARCHAR2(9)  PATH 'JOB'
           , MGR        VARCHAR2(20) PATH 'MGR'
           , HIREDATE   VARCHAR2(20) PATH 'HIREDATE'
           , SAL        NUMBER(7)   PATH 'SAL'
           ,COMM        NUMBER(7)   PATH 'COMM'
           , DEPTNO     NUMBER(2)   PATH 'DEPTNO'
                 ) T
       WHERE STATUS = 'PENDING') B
  ON  (A.EMPNO = B.EMPNO)
  WHEN MATCHED THEN
  UPDATE SET
      A.ENAME            = B.ENAME,
      A.JOB              = B.JOB,
      A.MGR              =B.MGR,
      A.HIREDATE          =B.HIREDATE,
      A.SAL              = B.SAL,
      A.COMM               =B.COMM,
      A.DEPTNO           = B.DEPTNO
  WHEN NOT MATCHED THEN
  INSERT
     (EMPNO, ENAME, JOB,MGR, HIREDATE, SAL,COMM, DEPTNO)
  VALUES (B.EMPNO, B.ENAME, B.JOB,B.MGR, B.HIREDATE, B.SAL,B.COMM, B.DEPTNO);
   UPDATE XML_TAB
   SET STATUS = 'PROCESSED' WHERE STATUS = 'PENDING';
   END;

EXEC EMP_MERGE;

select * from emp_new;

 EMPNO    ENAME    JOB    MGR    HIREDATE    SAL    COMM    DEPTNO
7369    SMITH    CLERK    7902    17/12/1980    800    2345    20

SELECT * FROM xml_tab;
ID    FILENAME    STATUS    XML    PENDING_DATE    PROCESSED_DATE
445    clob2file.xml    PROCESSED    (ORAXML)    26/05/2019 0:30   

Install Oracle Database 11g on Oracle Linux.


How to install Oracle database 11g on Oracle Linux 5.5

From Step 1 to Step 11 command run from root user.

Step 1
Edit Hosts File:
#vi /etc/hosts       (hit enter then press i for insert mode then edit it)
For Example.
192.168.179.132    OEL511G    OEL511G
After update this file press Esc then shif+: then wq  then Enter.

Step 2
#vi /etc/sysctl.conf
 fs.aio-max-nr = 1048576
 fs.file-max = 6815744
 kernel.shmall = 2097152
 kernel.shmmax = 536870912
 kernel.shmmni = 4096
 # semaphores: semmsl, semmns, semopm, semmni
 kernel.sem = 250 32000 100 128
 net.ipv4.ip_local_port_range = 9000 65500
 net.core.rmem_default=262144
 net.core.rmem_max=4194304vi
 net.core.wmem_default=262144
 net.core.wmem_max=1048586
After update this file press Esc then shif+: then wq  then Enter.
After that run below command for applying changes of sysctl file.
#/sbin/sysctl -p

Step 3.
Now Edit /etc/security/limits.conf and add following lines in end of this file.
#vi /etc/security/limits.conf
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  4096
oracle              hard    nofile  65536
oracle              soft    stack   10240
After update this file press Esc then shif+: then wq  then Enter.

Step 4.
Now Edit /etc/pam.d/login file and end following parameter
#vi /etc/pam.d/login
session    required     pam_limits.so
After update this file press Esc then shif+: then wq  then Enter.

Step 5
Create groups and user
#groupadd oinstall
#groupadd dba
#groupadd oper

#useradd -g oinstall -G dba,oper oracle
#passwd oracle

Step 6
Now create a Directory and change  directory permissions
#mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1
#chown -R oracle:oinstall /u01
#chmod -R 775 /u01

Step 7
Now set selinux=permissive
#vi /etc/selinux/config
selinux=permissive
After update this file press Esc then shif+: then wq  then Enter.

Step 8
Now make firewall disabled using setup command. Following below steps.
#setup -- firewall configuration--disable

Step 9
# unzip linux.x64_11gR2_database_1of7.zip -d/u01
# unzip linux.x64_11gR2_database_2of7.zip -d/u01
Now you have a single Database folder which is have runInstaller file.

Step 10
Update profile.
#vi /etc/profile
if [ $USER = "oracle" ]; then
 if [ $SHELL = "/bin/ksh" ]; then
 ulimit -p 16384
 ulimit -n 65536
 else
 ulimit -u 16384 -n 65536
 fi
 fi

Step 11
#cd/media/Enterprise Linux dvd 20100405/Server
[root@onenode Server]# pwd
/media/Enterprise Linux dvd 20100405/Server
rpm -Uvh binutils* --nodeps
rpm -Uvh compat* --nodeps
rpm -Uvh gcc* --nodeps
rpm -Uvh glibc* --nodeps
rpm -Uvh ksh* --nodeps
rpm -Uvh libgcc* --nodeps
rpm -Uvh libstdc* --nodeps
rpm -Uvh libaio* --nodeps
rpm -Uvh libXext* --nodeps
rpm -Uvh libXtst* --nodeps
rpm -Uvh libX11* --nodeps
rpm -Uvh libXau* --nodeps
rpm -Uvh libxcb* --nodeps
rpm -Uvh libXi* --nodeps
rpm -Uvh make* --nodeps
rpm -Uvh sysstat* --nodeps
rpm -Uvh unixODBC* --nodeps
rpm -Uvh zlib-devel* --nodeps
rpm -Uvh elfutils* --nodeps

Step 12.
Now reboot your pc and login with Oracle user and follow below steps.
$cd /u01/database
./runInstaller

Generate XML file from Oracle database using pl/sql.


Hi Code seeker,

I am explaining, how to generate XML files in ORACLE database using pl/sql.

Environment Oracle database11g, Oracle Linux 5.5, windows 7, TOAD

Process 1

Below example is generate XML from only one table.

CREATE OR REPLACE DIRECTORY XML_FILES as 'D:\sale\EXCELFILE\XML_FILES';

grant read, write on  DIRECTORY  XML_FILES to alam;

create or replace procedure testxml_gen is
 rc sys_refcursor;
 doc DBMS_XMLDOM.DOMDocument;
BEGIN
 OPEN rc FOR SELECT * FROM all_objects;
 doc := DBMS_XMLDOM.NewDOMDocument(xmltype( rc ));
 DBMS_XMLDOM.WRITETOFILE(doc, 'XML_FILES/abc.xml');
END;
/

exec testxml_gen

---------------------------------------------------------------------------------------------------------------------------
Process 2

Below example is generate XML from only one table.

DECLARE
 rc sys_refcursor;
BEGIN
 OPEN rc FOR SELECT * FROM all_objects;
 dbms_xslprocessor.clob2file( xmltype( rc ).getclobval( ) , 'XML_FILES','clob2file.xml');
END;
/
----------------------------------------------------------------------------------------------------------------------------

Below example is generate XML from more then two tables.



CREATE OR REPLACE PROCEDURE ALAM.GEN_XML_FOR_ALL_TABLE IS
 RC SYS_REFCURSOR;
  V_DATE VARCHAR2(30);
 V_STR VARCHAR2(2000);
 V_QUERY VARCHAR2(2000);
 V_COUNT NUMBER(8);
 v_seq_value number(10);
 v_query1 varchar2(200);
v_query2 varchar2(200);
 BEGIN
 SELECT TO_CHAR(SYSDATE,'YYYYMMDDHHMISS')  INTO V_DATE FROM DUAL;
 FOR R_C1 IN (SELECT * FROM table_xml_name ) LOOP
 V_QUERY:= 'select count(*) from '|| R_C1.TABLE_NAME;
 EXECUTE IMMEDIATE V_QUERY INTO V_COUNT;
 IF V_COUNT >0 THEN
 V_STR:= 'select * from  '||R_C1.TABLE_NAME;
 OPEN RC FOR V_STR;
DBMS_XSLPROCESSOR.CLOB2FILE( XMLTYPE( RC ).GETCLOBVAL( ) , 'XML_FILES_SOURCE',(R_C1.XML_NAME||V_DATE)||'.xml');
 EXECUTE IMMEDIATE V_STR;
-- Below line is optional..
 insert into XML_MASTER_DETAIL (TABLE_NAME,XMFILE_NAME,NO_ROW,CREATE_DATE,USER_NAME) values
             (R_C1.TABLE_NAME,R_C1.XML_NAME||V_DATE||'.xml',v_count,sysdate,'ALAM');
             commit;
---------END----------------------
 ELSE
            DBMS_OUTPUT.PUT_LINE('No Data');
END IF;
 END LOOP;
 END;
/


Rename Oracle database using NID

  SQL> set pages 999 lines 999; col instance_name for a10; col host_name for a20; col startup_time for a30; set colsep | set underline = ...