Connecting to remote Oracle server through shell script - shell

i am new to shell script. i have a Oracle server which is remote say "Oracle1" and listening to port 1521 i am trying to remotely connect to it through shell script. i am facing some issue in setting environment variables. my script is.
ORACLE_SID=wctest98;
export ORACLE_SID
ORACLE_HOME=Oracle1.com:1521/opt/oracle/oracle11g/product/11.2.0;
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;
export PATH
SQLPATH=$ORACLE_HOME/sqlplus/admin;
export SQLPATH
sqlplus -s /NOLOG << EOF
connect wcadmin/wcadmin#Oracle1.com:1521/wctest98
select * from dual;
exit
EOF
i am getting "sqlplus: not found" error. i am doing it for the first time. i have connected to local Oracle System but not to remote server. feel free to edit...

Your ORACLE_HOME (below) looks incorrect to me. It should not contain the host and port of your oracle server.
ORACLE_HOME=Oracle1.com:1521/opt/oracle/oracle11g/product/11.2.0/bin;
ORACLE_HOME is the path to wherever you have installed the Oracle client on the local machine. For example, it might be:
ORACLE_HOME=/opt/oracle/oracle11g/product/11.2.0
Check if you have the sqplus executable in ${ORACLE_HOME}/bin.

It seems like sqlplus is not on your PATH variable.
You can see if it is with
which sqlplus
And find where it is with
locate sqlplus
To add something to your path
export PATH=$PATH:/path/to/sqlplusdir/

Related

SQLPLUS Connection to DB with special characters '#'

I'm trying to connect to my remote db with a user who has an # in his password.
I use sqlplus v19 with an OracleClient and my remote db is an OracleServer v19 aswell. I had no problem during the alter user command on the database :
alter user USER identified by "P#ssword123";
user altered.
Below are the commands I tried to connect with this user :
sqlplus USER/"P#ssword123"#tnsname
sqlplus USER/'"P#ssword123"'#tnsname
sqlplus 'USER/"P#ssword123"'#tnsname
sqlplus USER/\"P#ssword123\"#tnsname
And some variants of those commands.
This always return me the same TNS error :
TNS:could not resolve the connect identifier specified
It looks like these solutions works for old sqlplus versions but I can't figure out how can I solve my problem with this version 19.
Of course, I tried to change the password with non # character and it works but this is not a possible solution in my specific case.
Thank you for all your replies.
I figure it out with your help. I even modified it to make it compatible with a PL/SQL Script which I pass some variables.
The answer :
sqlplus /NOLOG << EOF
connect USER/"P#ssword123"#tnsname
#script_plsql.sql $var1 $var2 $var3
EOF

sqlplus through SSH failed to resolve tns

I setup an EC2 instance and RDS instance. Then installed oracle instance client on EC2 instance. After that I managed to do sqlplus and connect with database from EC2 instance. To do that I created a tnsnames.ora file and enter the service details of the database.
I can do,
sqlplus user/password#db_alias
But I cannot do, (This gives ERROR: ORA-12154: TNS:could not resolve the connect identifier specified)
ssh username#ip sqlplus user/password#db_alias
Password less ssh also configured. And I'm doing the ssh to the current machine itself. Any thought would be helpful.
Addition to the details. Since I installed oracle instance client, tnsping command is not available. I achieve this by adding following function to the .profile file.
whence tnsping >/dev/null 2>&1 ||
tnsping() {
sqlplus -L -s x/x#$1 </dev/null |
grep ORA- |
(grep -v ORA-01017 || echo OK)
}
This problem could be able to narrow down to the problem in loading environment variables (specifically $TNS_ADMIN). Since the .bashrc has an validation to check the login shell is an interactive one or non-interactive one, the variables which defined at the bottom was not loaded.
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
The reason for tns not to be resolved via ssh is unavailability of $TNS_ADMIN variable. By defining that variables at the beginning of .bashrc, I could able to fix this.
See Also Why does an SSH remote command get fewer environment variables then when run manually?

How I can pass OS value to sql

I am trying to write a shell scripts for changing the db link as everytime password for Dev got change
so I am putting like below.
=======================================
export DEV_PASS=nevert3ll
sqlplus /nolog
connect apps/appspwd#TEST
drop database link TEST_TO_DEV;
create database link TEST_TO_DEV connect to apps identified by ${DEV_PASS} using 'DEV';
exit
EOF
=======================================
but this is treating ${DEV_PASS} a value rather than export value.
Can you advise me how to solve this issue.
Thanks,SM
I think you're missing -s switch in sqlplus:
export DEV_PASS=nevert3ll
sqlplus -s /nolog
connect apps/appspwd#TEST
drop database link TEST_TO_DEV;
create database link TEST_TO_DEV connect to apps identified by $DEV_PASS using 'DEV';
exit
EOF

Passing variable user,pass,sid in sqlplus comman

I want to pass variables in sqlplus command in my bash script, answer might be given but doesn't work for me.
I tried some thing like this
#!/bin/bash
ssh oracle#10.116.12.26 <<XX
echo Please enter an Oracle Username:
read USERNAME
echo "Please enter the Oracle Username's Password:"
read -s PASS
SID=XE
export conn_str=$USERNAME/$PASS#$SID
sqlplus $conn_str << EOF
select * FROM tabs;
exit
EOF
XX
also tried
sqlplus $USERNAME/$PASS#SID #with option -s and -l
I also find solution like this
but not worked for me.
oracle : 11g
,os : fedora 18
Is there any solution available for this ?
thanks.
You haven't said what actually happens, but I'm guessing you aren't prompted for the credentials, and that maybe it can't find sqlplus. On a Red Hat box this works:
#!/bin/bash
echo Please enter an Oracle Username:
read USERNAME
echo "Please enter the Oracle Username's Password:"
read -s PASS
SID=XE
conn_str=$USERNAME/$PASS#$SID
ssh oracle#10.116.12.26 << EOF
# set these for your specific environment
ORACLE_HOME=<path to ORACLE_HOME>
PATH=$PATH:$ORACLE_HOME/bin # or without .../bin depending on client
TNS_ADMIN=<path to tnsnames.ora directory, if not default>
sqlplus -s /nolog
connect $conn_str
select * FROM user_tables;
exit
EOF
This is collecting the values from the user on the local machine to avoid the 'Pseudo-terminal will not be allocated because stdin is not a terminal' issue.
It is then setting up the Oracle environment once on the remote server - what you need to set depends on which client you're using (particularly whether you're using the instant client, though if you're connecting as oracle that seems unlikely, and you can probably run oraenv).
I've also tweaked it to run SQL*Plus with /nolog and then connect once running, so the credentials aren't exposed in the ps output. And I've switched from the old tabs to the more common user_tables.
The nested heredocs work but aren't necessary; the SQL commands are already being entered in the right place and will be seen by SQL*Plus rather than the remote shell.
Of course, since I don't know what error you were actually seeing this is largely speculation. It would probably be simpler to have the client installed locally and use a SQL*Net connection rather than SSH, but there could be firewall restrictions we don't know about.
Try quoting your here doc delimiter to prevent stale variable expansions on the local machine.
ssh oracle#10.116.12.26 <<'XX'

Should CONNECT work in SQL*PLUS script?

I'd like to run a sqlplus script from a cron job.
I thought I could put a line like:
CONNECT "myuser/mypass#mydb"
within the script and then just execute it with:
sqlplus #myscript
However, when I do so, I get:
SP2-0306: Invalid Option
SP3-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
Am I misunderstanding the usage of the connect command?
When running CONNECT inside SQL*Plus, remove the quotes:
CONNECT myuser/mypass#mydb
They double quotes are required if you are passing the credentials as an argument to sqlplus:
sqlplus "myuser/mypass#mydb"
, for the shell to parse myuser/mypass#mydb as a single argument if you have spaces in your connection identifier or use additional options like AS SYSDBA.
Use the /NOLOG option.
sqlplus /nolog #myscript
Oracle 11gR2
I ran a .sql file via SQL*Plus connected initially as JOHN. Within the file I connect as SYS and then run a GRANT. See .sql file contents below:
connect sys/password as sysdba
GRANT EXECUTE ON DBMS_CRYPTO TO JOHN;
connect JOHN/DOE
NOTE: I don't recommend keeping the sys/password in a text file btw.
HTH

Resources