Friday, December 2, 2011

Oracle DB SQLs – Table Data Backup Steps

 

Business Need:

Before changing a record, previous data needs to be backed up in a table for analysis.

Helpful to analyze change done by custom program or user actions on a table data.

 

Queries:

CREATE TABLE OE_OLINES_NOV23A
AS
SELECT * FROM OE_ORDER_LINES_ALL OL WHERE HEADER_ID = 5801517
/
           
ALTER TABLE OE_OLINES_NOV23A ADD (OL_INSERT_DATE DATE DEFAULT SYSDATE)
/
 
INSERT INTO OE_OLINES_NOV23A
SELECT OL.*, SYSDATE FROM OE_ORDER_LINES_ALL OL WHERE HEADER_ID = 5801517;
 
SELECT * FROM OE_OLINES_NOV23A;
 

 

Notes:

1.    These steps are backing up a single order’s lines. The WHERE clause can be substituted for a time window ( CREATION_DATE > SYSDATE-1 ) or Order TYPE ( LINE_TYPE_ID = 2529 ) or any other parameters that needs to be monitored.

 It may be a good idea to have all temp table have a standard format extensions (Eg: %_DATE or  %_BACK) and delete them periodically (After 1 month after creation)

  

Keywords:

Oracle DB, EBS, OM, Order Lines, OE_ORDER_LINES_ALL, Query, SQL, SQLPLUS

Wednesday, January 12, 2011

grep - the coolest Unix command ever :)


This is a cool Unix command.

The grep command searches the given file for lines containing a match to the given strings or words. By default, grep displays the matching lines. Use grep to search for lines of text that match one or many regular expressions, and outputs only the matching lines.

Usage Examples:

$ grep ath /etc/passwd

> simple search for a word in a single file


$ grep -r "192.168.1.1" /etc/

> search through the files within a folder


$ egrep -w -i 'thomas|david' filename

> search for 2 words in a single line

 

Tuesday, August 10, 2010

How to create a Oracle PL/SQL function that returns random numbers?

How to create a function that returns random numbers?

Can you imagine an Oracle PL/SQL Function that returns Random Numbers? This is very useful for testing features in multiple scenarios.
Oracle comes with a built-in package “dbms_random.value” for this purpose. The function will return a random float number between a given range.

Eg:
Create a input with YES and NO answers. Test both without changing any underlying criteria. To test the changes within a webpage, just refresh the page a few times without any change to the database or inputs.

CREATE OR REPLACE FUNCTION GET_RANDOM
RETURN NUMBER
IS
      P_RETVALUE    NUMBER;
BEGIN

      P_RETVALUE := 0;
    
      SELECT floor(mod(dbms_random.value(3,10),2))
      INTO P_RETVALUE
      FROM DUAL;
    
      RETURN P_RETVALUE;

EXCEPTION
WHEN OTHERS THEN
      RETURN 0;
END;
/

COMMIT
/


The function is called using the below call:
select get_random() from dual

By changing the value in the MOD function, it is possible to have more than 2 values. Also by adding an IF .. THEN ELSE loop after the SELECT STATEMENT, it is possible to have non-numeric values.

Eg:
IF P_RETVALUE = 0 THEN
      RETURN "Equal"
ELSE IF P_RETVALUE = 1 THEN
      RETURN "Less"
ELSE
      RETURN "More"
END IF
 

Monday, January 18, 2010

Oracle Database - Identify locking sessions

Here is a simple SQL to identify locking sessions within an Oracle Database:
SELECT 'SID ' || L1.SID ||' is blocking ' || L2.SID BLOCKING
FROM V$LOCK L1, V$LOCK L2
WHERE L1.BLOCK =1 AND L2.REQUEST > 0
AND L1.ID1=L2.ID1
AND L1.ID2=L2.ID2

Here is a sample output:
SID 776 is blocking 465

All locking sessions are stored in the table V$LOCK.

Note: The locking can happen due to any reason. It is not necessarily caused due to Applications or User Activity. Look everywhere possible to identify the problem. Likely places to look first ... Concurrent program, running for a long time, user FORM Sessions, SQL*Plus or TOAD sessions with ROWID selection or UPDATEs and the current session is not COMMITed, Running SQL Scripts, DataLoad jobs, etc are just to name a few.

 

Tuesday, July 14, 2009

Kill Oracle 11i or R12 FORM Java/JInitiator Session

Here is a common problem, Oracle EBusiness Suite users have ... You opened a Forms window. You searched for a specific data or LOV Results. The page is trying to open the new results, but hanging for a long time. What is the way out?

Solution: Oracle forms are displayed by JInitiator - an Oracle developed custom Java Application. To start a new session afresh, we need to kill Java Executable program and the browser program (Eg: internet Explorer).

Steps:
1. Open Windows Command prompt (Start -> Run -> <cmd> -> <ENTER>)

2. Run the following command to kill all java sessions: (This will kill JInitiator windows)
taskkill /f /im java.exe

3. Run the following command to kill all browser sessions: (This will kill Internet Explorer windows. If you use any browser other than IE, please change the command accordingly.)
taskkill /f /im iexplore.exe

4. Close Command Prompt

This solution will work for all versions of Oracle Applications (R12 and 11i). But this will work only when you access Apps using Microsoft Windows :)

Note: This process will terminate ALL Browser sessions in the machine. Make sure that all the possible data saved before running the command. This will also help to get rid of all Oracle Sessions and Cookie effects.
 

Thursday, July 9, 2009

Steps - Kill Oracle or SQL Session - sqlplus

You are connected to TOAD. You ran a complex query and the window is hanging for a long time. Even the CANCEL button does not respond appropriately. What to do?

A very common problem, Oracle Developers have. Some quick solutions are <CNTL> C and <CNTL> D buttons. But many times, they also fail.

Here is a more complete and perfect way to kill the session.


Step 1: Identify the session - SID and Serial

Use appropriate WHERE clauses to identify the hanging session. You may use client (Toad/SQL - MODULE), OSUSER (Operating System User, Eg: CORP/AbThomas), MACHINE (Eg: server_dns_name) or TIMESTAMPS.


-- get non-unix sql sessions, kill one session
SELECT S.OSUSER, SUBSTR(S.SID || ',' || S.SERIAL#, 0, 20) AS KILL_STRING, MODULE, MACHINE, LOGON_TIME
FROM   V$SESSION S
where OSUSER = 'athomas'
-- AND MODULE LIKE 'T%' -- 'SQ%'
-- AND MACHINE LIKE '%NRBVUEBSAS02%'
-- AND MODULE LIKE 'JDBC Thin Client%'

In the results from above query, the module SQL is SQL Plus client, TOAD is Toad Client and anything related to Java or JVM will be the connections created from web server. (The Application Server connects to Database server through JDBC conneciton).

Step 2: Open another window, close the session:
Identify the Session Id and Serial (Second column in the above query) and substitute in the below line ...

ALTER SYSTEM KILL SESSION '876,24615'

The connection will be lost  with a message. Still you have the SQLs in the screen. In this way, all your query will be preserved, even though the connection is lost.


Simple steps. But very useful many times ... NJoy :)
 

Thursday, May 7, 2009

Oracle Data Base (DB) Link Introduction

Business Need:

Database Links are used to connect from one database to a remote database without exposing/repeating connection details to the end user.

Oracle DB 12g is used for these SQLs. But the SQLs will be applicable most of the recent versions.

DB Link Creation:

Here is the command to create DB Link:

CREATE DATABASE LINK DBLINK_NAME

CONNECT TO REMOTE_SCHEMA IDENTIFIED BY REMOTE_PWD

USING 'REMOTE_TNSSTRING';

To use the DB Link, the REMOTE_TNSSTRING needs to be defined in the DB Server’s TNSNAMES.ORA file, you are connecting to. Otherwise this will give TNS Error.

 

DB Link Creation without TNS Definition:

Here is command to create DB Link to a remote database whose TNS String is not defined in the server:

CREATE DATABASE LINK DBLINK_NAME

    CONNECT TO REMOTE_SCHEMA IDENTIFIED BY REMOTE_PWD

    USING '(DESCRIPTION=

                (ADDRESS=(PROTOCOL=TCP)(HOST=<mymachine.mydomain.com>)(PORT=<1521>))

                (CONNECT_DATA=(SERVICE_NAME=<service or sid name>))

            )';

<mymachine.mydomain.com> à Domain Name or IP Address of Remote Database

<1521> à Port Number of Remote Database

<service or sid name> à Service Name of Remote Database

 

DB Link Usage:

Tables within DB Link can be accessed using the format <table name> @ <DB Link name>, just like any local table (Eg: USERS@DEV).

If frequently used, create a local synonym:

CREATE SYNONYM RTUSERS FOR USERS@DBLINK_NAME;

So the below SQLs work in the same way:

SELECT * FROM USERS@DBLINK_NAME;

SELECT * FROM RTUSERS;

  

Other Notes/Considerations:

Few points to add before using DB Links: 

  1. Direct DB Links to Production might cause data security policy violation. Be careful over sensitive data exposure.
  2. Query Optimization is poor across DB Links. A few steps might help improve performance over DB Links:
  3. If a single table is accessed frequently, use a local temp table and fill the required data in the local table and use. DB Link to be used only in the first selection (to store data in temp table)
  4. Use query-in-query format to choose remote data, if possible

Eg: Only 1 order type will be present in remote table. Use “(SELECT COL1, COL2 FROM ORDERS WHERE ORDER_TYPE = 21) X” instead of Order Type in the main query.

  

Keywords:

Oracle, DB Link, Database Link, Remote Database, TNSNAMES, Query, SQL, SQLPLUS