Connecting to Oracle DB using sqlplus


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Connecting to Oracle DB using sqlplus
# 1  
Old 05-04-2010
Connecting to Oracle DB using sqlplus

Hi,

I am very new to shell scripting and trying to write a simple shell script in which i am trying to achieve the following:

1. Connect to oracle database hosted on a different server
2. fire a query on the oracle db
3. store the output in a variable
4. use this variable for further logic

The code that i have written so far is as follows:

Code:
#!/bin/bash

#Connect to the database using sqlplus

sqlplus 'DBUSER/dbuser@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.5.199.106)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=PHYGD1)))' >> outputlogfile.log

# Fire the query on database

DCOFCVALUE=select sync_cmpl
from table(dbdev.db_inv_dtl_hdr)
where dc_id ='30'
and to_char(sync_req_dttm,'YYYYMMDD')= '20100331';

ENDSQL

# Check if [/B]DCOFCVALUE  was succesful or not
if [ $DCOFCVALUE = Y ]
then
    echo "DCOFCVALUE  Succesfull\n"
  exit 2
else
  if [ $DCOFCVALUE = N]
  then
     echo "DCOFCVALUE [B] Unsuccesfull\n"
  exit 3
  fi
fi

exit 0

Now the error message i am getting is as follows:
Code:
line 29: sync_cmpl: command not found
.line 30: syntax error near unexpected token `('
line 30: `from table(dbdev.db_inv_dtl_hdr)'

Could someone please guide where am I going wrong? And what is the correct way to write such a code.

Your help is highly appreciated!

Regards,
Shruti

Last edited by Scott; 05-04-2010 at 05:25 PM.. Reason: Code tags, please...
# 2  
Old 05-04-2010
Unfortunately you are so far adrift that it is hard to guess what you are trying to achive. There are multiple significant errors both the Unix shell syntax and the Oracle command syntax.

The sqlplus line posted looks like an extract from an Oracle listener log. It is not a valid sqlplus command line at all.

Maybe try using the search facility on this site to look for examples of Oracle sqlplus commands within unix shell. Don't forget to set the Oracle environment variables such as ${ORACLE_HOME}.

In this context if you can type the commands at a command prompt they can be turned into a unix shell script.
Tip: First try getting the command sequence to work manually before trying to script it.
# 3  
Old 05-04-2010
Actually, it is possible to connect to the Oracle database by specifying the connect descriptor from the tnsnames.ora file. But it's not a secure way of connecting since all important pieces of information (server name, port etc.) are exposed in the process list when connecting this way.

@OP - find out the net_service_name that corresponds to this connect descriptor. It may be "PHYGD1" or something else - depends on what your Oracle DBA set it to during installation, so you may want to talk to him/her.
Once it is known, you can connect as "username/password@net_service_name". Or better, set the ORACLE_SID variable to that value and connect as "username/password".

In my case, I've set my ORACLE_SID to "ora11g", which is the net_service_name in my tnsnames.ora for my local database. So I can connect as "test/test".

Have a look at the script below; it should give you some idea -

Code:
$ 
$ 
$ # First, let's check what we have in the table "T" of schema "TEST" of my local database
$ (echo "select * from t;") | sqlplus -s test/test

     X
----------
       100

$ 
$ # So, there's just one column "X" and one row and the one value in the table is 100
$ # Now show the contents of the shell script that connects to this database and
$ # fetches this value
$ 
$ cat -n fetch_value.sh
     1    #!/bin/bash
     2    
     3    #Connect to the database using sqlplus
     4    x=`sqlplus -s /nolog <<EOF
     5    connect test/test
     6    set pages 0 
     7    select x from t;
     8    exit
     9    EOF`
    10    
    11    # print the value of x fetched from the database
    12    echo "Value fetched from database, x = $x"
    13    
    14    # check if this value equals 100
    15    if [ $x == 100 ]; then
    16      echo "Yes, the value of x is 100"
    17    else
    18      echo "No, the value of x is $x"
    19      return 1
    20    fi
    21    return 0
    22    
$ 
$ # Now run the script
$ . fetch_value.sh
Value fetched from database, x =        100
Yes, the value of x is 100
$ 
$

The SQL syntax of your script looks suspicious:

Code:
...
from table(dbdev.db_inv_dtl_hdr)
...

If "dbdev.db_inv_dtl_hdr" is a regular (heap) table i.e. one that has been created using the "create table dbdev.db_inv_dtl_hdr (blah...);" syntax then your syntax should be -

Code:
...
from dbdev.db_inv_dtl_hdr
...

As a matter of fact, there is a "table()" operator in Oracle that casts a nested table to a regular table. However, that type of syntax is typically used by advanced Oracle programmers and somehow I believe that's not the case here.

HTH,
tyler_durden
# 4  
Old 05-04-2010
to paraphrase methyl above: baby steps...

Try to run this code on the remote machine (assuming your Connect String is accurate):

Code:
sqlplus 'DBUSER/dbuser@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.5.199.106)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=PHYGD1)))' <<ENDSQL >> outputlogfile.log

--# Fire the query on database

select 
         sync_cmpl
from 
         dbdev.db_inv_dtl_hdr
where 
         dc_id 
            =        '30'
   and   to_char(sync_req_dttm,'YYYYMMDD')
            =        '20100331'
;

ENDSQL

If it works...you can move ahead with attempting to call it remotely, etc...
# 5  
Old 05-05-2010
1. Connect to oracle database hosted on a different server
2. fire a query on the oracle db
3. store the output in a variable
4. use this variable for further logic

Try this ...

Code:
##Intiliase the required variables....
 
USERID='SCOTT'
USERPWD='TIGER'
dbname='US.ORACLE.COM' 

##Spool the query output into a unix variable 

Output_variable=`sqlplus -s $USERID/$USERPWD@$dbname <<!
set heading off feedback off trimspool on 
--your query here;
select sysdate from dual;
exit
!`

echo Output_variable : $Output_variable

--> use the variable to add your own logic

Last edited by Scott; 05-05-2010 at 01:43 PM.. Reason: Code tags please...
# 6  
Old 05-05-2010
Hi All,

Thanks for your responses!

As per the suggestions below i thought of taking 1 step at a time by doing the following:

1. Checked all environment variables are set in my .bash_profile file. $ORACLE_HOME and $ORACLE_SID returns correct results.

2. I tried to connect to SQLPLUS from the unix prompt directly....I enter the user name and password....but I get the following error:

Code:
ERROR:
ORA-12545: Connect failed because target host or object does not exist

I tried to research on this error message and everywhere it mentions that i should check the entries in TNSNAMES.ora......i cross checked the entries and everything looks fine to me....below is the entry from my tnsnames.ora file...

Code:
VOMSD1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.5.199.106)(PORT=1521))(CONNECT_DATA=(SID=PHYGD1)))

Could anyone please guide me as to what i might be missing which is preventing me from connecting to the database on a remote machine - 10.5.199.106??

Thanks,
Shruti

Last edited by Scott; 05-05-2010 at 01:44 PM.. Reason: Code tags please...
# 7  
Old 05-05-2010
What's the output of the following 2 commands ?

Code:
echo $ORACLE_SID
tnsping VOMSD1

Did you export ORACLE_SID ?

Quote:
2. I tried to connect to SQLPLUS from the unix prompt directly....I enter the user name and password....but I get the following error:
Are you able to connect if you specify this ?

Code:
username/password@<value_of_ORACLE_SID>

If not, what error do you encounter ?

tyler_durden
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sqlplus not connecting the 2nd time in for loop

Hi, I am trying to get the rows(First step is to get the poolid's and then second step run a loop to get the output based on each pool id and third connection is to get the member id and pool id based on a different condition) where based of certain conditions and storing it in a file. I wrote the... (6 Replies)
Discussion started by: ajayakunuri
6 Replies

2. Shell Programming and Scripting

Connecting sqlplus from UNIX with multiple select statement

hi, i have a requirement where i need to connect sqlplus from unix and i am able to do so by following command: cust_count=`sqlplus -s $ORACLE_USER/$ORACLE_PASS@$ORACLE_SID << EOF set pagesize 0 set feedback off set verify off ... (1 Reply)
Discussion started by: lovelysethii
1 Replies

3. Shell Programming and Scripting

Connect to Oracle using sqlplus

I have logged into oracle using SQLPLUS. When I type any kind of query, there is only 1 answer - '2'. What is wrong with it? (1 Reply)
Discussion started by: Subhasis
1 Replies

4. Red Hat

TNS Timeout Error when connecting to SQLPLUS through scripts only

Hi, I am facing a strange issue when connecting to SQLPLUS via a shell scripts. I am using Linux 2.6.18-274.18.1 and gbash shell. When I connect to SQLPLUS through scripts then it throws TNS Time Out error ""sometimes"" and connects successfully other times.This is only happening when... (9 Replies)
Discussion started by: aashish.sharma8
9 Replies

5. UNIX for Advanced & Expert Users

Connecting once using sqlplus and doing multiple queries

Hello everyone, It's my first week using unix and shell scripting. I tried creating a script that has a function that execute SQL query. my script looks something like this: ---------------------------------------------------- #!/bin/sh tableName="myTable" secondTable="secondTable"... (2 Replies)
Discussion started by: edlin_r
2 Replies

6. UNIX for Dummies Questions & Answers

Connecting to Oracle DB using sqlplus

Hi, I am very new to shell scripting and trying to write a simple shell script in which i am trying to achieve the following: 1. Connect to oracle database hosted on a different server 2. fire a query on the oracle db 3. store the output in a variable 4. use this variable for further logic... (1 Reply)
Discussion started by: shrutihardas
1 Replies

7. Shell Programming and Scripting

Formatting Oracle sqlplus output

a job extracts orcle data into unix as flat file. a single record breaks into two record in unix flat file. This is the case only for 6 records out of 60 lack records. (its not single record in two line. but its single record into record. ie., \n come into picture) can you tell me what... (6 Replies)
Discussion started by: Gopal_Engg
6 Replies

8. Shell Programming and Scripting

connecting through sqlplus

I am trying to connect to one of the oracle sever using uni through sqlplus command: sqlplus -s BOXI_ALPH_AUDITOR,Q078_audit$@Q047 But its not getting connected. I tried using some different server using same syntax its working. What differene i found is the password is having no special... (2 Replies)
Discussion started by: gander_ss
2 Replies

9. Shell Programming and Scripting

Showing errors when connecting to sqlplus in shell script

hi, I am trying to automate the compilation of procedures stored in .sql files in Unix. Is there any way in which we can sho err if there errors are raised in the compilation? I am using the following code to connect to the sqlplus sqlplus ${SQL_USER}/${SQL_PASSWORD} (5 Replies)
Discussion started by: silas.john
5 Replies

10. UNIX for Dummies Questions & Answers

error connecting to sqlplus

Hi, I wrote a shell script to call oracle procedure. But when i am trying to connet sqlplus with the fallowing statement It is giving me error " callproce.sh : sqlplus: not found". What could be the problem. sqlplus -s $CONNECT_STRING >$LOGFILE <<!! thank u all papachi (2 Replies)
Discussion started by: papachi
2 Replies
Login or Register to Ask a Question