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?
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
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
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
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:
- Direct DB Links to Production might cause data security policy violation. Be careful over sensitive data exposure.
- Query Optimization is poor across DB Links. A few steps might help improve performance over DB Links:
- 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)
- 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
Thursday, May 3, 2007
SQLPLUS - Spool Results to a file
SET HEADING OFF
SET PAGESIZE 0
SET LINESIZE 400
SET TERMOUT OFF
SET VERIFY OFF
SET FEEDBACK OFF
SET ECHO OFF
SET SERVEROUTPUT OFF
SET TRIMS OFF
SET COLSEP "|"
SET CONCAT "."
SET NEWPAGE NONE
SET UNDERLINE OFF
COLUMN USER_ID FORMAT 99999999
COLUMN USER_NAME FORMAT A80
COLUMN LAST_LOGON_DATE FORMAT A12
COLUMN CREATION_DATE FORMAT A12
COLUMN CREATED_BY FORMAT 99999999
COLUMN LAST_UPDATE_DATE FORMAT A12
COLUMN LAST_UPDATED_BY FORMAT 999999
COLUMN LAST_UPDATE_LOGIN FORMAT 99999999
COLUMN START_DATE FORMAT A12
COLUMN DISPLAY_NAME FORMAT A80
COLUMN EMPLOYEE_ID FORMAT 99999999
COLUMN EMAIL_ADDRESS FORMAT A80
COLUMN PERSON_PARTY_ID FORMAT 99999999
SPOOL C:\MY_SQL_RESULTS.TXT;
SELECT US.USER_ID, US.USER_NAME, US.LAST_LOGON_DATE,
US.CREATION_DATE, US.CREATED_BY, US.LAST_UPDATE_DATE,
US.LAST_UPDATED_BY, US.LAST_UPDATE_LOGIN, US.START_DATE,
US.DESCRIPTION AS DISPLAY_NAME, US.EMPLOYEE_ID,
US.EMAIL_ADDRESS, US.PERSON_PARTY_ID
FROM APPS.FND_USER US
WHERE US.USER_ID BETWEEN 12345 AND 17654;
SPOOL OFF;
Usage:
1. Set column data type and width appropriately by the usage of DEFINE statements
2. Make sure to have the LINESIZE has more than the total required width for all columns (Eg: SET LINESIZE 600)
3. Change the query (SELECT ...) as per the requirement (This is a simple query, while many practical data spool requires multi page SQLs).
4. Make sure to change the output file path correctly (Otherwise it will overwrite the current file - SPOOL C:\MY_SQL_RESULTS.TXT;)
If heading is required in the spool output, please remove the line "SET HEADING OFF".